Page 1 of 5
Создание приложений на классах
Posted: Fri Nov 07, 2014 5:54 pm
by Nikolai1
Решил попробовать представить основные элементы интерфейса как классы (пока есть только окно, надпись и кнопка). Целью было облегчить создание программ под KolibriOS и сделать проще обработку событий (клик по кнопке например).
Для теста создал окно с надписью и кнопкой. При клике по кнопке меняется текст и цвет надписи и фон кнопки.
Код получился вот такой:
Spoiler:
Code: Select all
#include <kosSyst.h>
#include <kosFile.h>
#include "core.h"
// Заголовок окна
const char header[] = "HelloWorld test";
// Регистрация окна
Window* win = new Window();
// Обработка клика по кнопке
void buttonclick(Button* btn) {
win->labels[0]->color = COLOR_BLUE;
win->labels[0]->text = "Click!!!";
btn->color = COLOR_YELLOW;
win->update();
}
void exitButtonClick(Button* btn) {
kos_ExitApp();
}
void kos_Main() {
win->header = (Dword)"Window";
// Кнопка
Button* btn = new Button;
btn->x = 10;
btn->y = 10;
btn->sizeX = 30;
btn->sizeY = 10;
btn->id = 0;
btn->color = COLOR_RED;
btn->onclick = buttonclick;
// Ещё кнопка
Button* exitBtn = new Button;
exitBtn->hidden = true;
exitBtn->id = 1;
exitBtn->onclick = exitButtonClick;
// Надпись
Label* lbl = new Label;
lbl->x = 10;
lbl->y = 50;
lbl->id = 0;
lbl->text = "Hello";
// Регистрация элементов интерфейса в окне
win->addControl(CONTROL_BUTTON, btn);
win->addControl(CONTROL_BUTTON, exitBtn);
win->addControl(CONTROL_LABEL, lbl);
// Отрисовать окно
win->draw();
// Запустить обработку событий
win->waitForEvent();
}
Прикрепил архив с получившимся приложением и код классов.
Как думаете, есть у моей разработки какие-нибудь перспективы?
P. S. C++ я только начинаю изучать, поэтому некоторые вещи могут быть сделаны очень "Криво"
Re: Создание приложений на классах
Posted: Fri Nov 07, 2014 7:28 pm
by Leency
Идея хорошая, надо и нам в С-- такие штуки сделать.
Re: Создание приложений на классах
Posted: Fri Nov 07, 2014 7:31 pm
by Wildwest
Это в каком компиляторе сделано - Microsoft Visual Studio или что-то другое?
Re: Создание приложений на классах
Posted: Fri Nov 07, 2014 7:38 pm
by Nikolai1
Microsoft Visual C++ 2010 Express Edition
Re: Создание приложений на классах
Posted: Fri Nov 07, 2014 9:42 pm
by Nikolai1
Никто не подскажет, как в одном массиве хранить указатели на объекты разных классов? Во всех примерах, которые я находил используется std::vector.
Re: Создание приложений на классах
Posted: Sat Nov 08, 2014 5:18 am
by dunkaist
Делай абстрактный класс и наследуй от него.
Re: Создание приложений на классах
Posted: Tue Nov 11, 2014 12:25 am
by Nikolai1
Подскажите, что делать в такой ситуации:
есть адрес указателя на функцию, как по нему вызвать функцию?
Code: Select all
void Event::call(int action) {
if (actions[action] == NULL) return;
int i;
void (*hnd)();// Указатель
for (i=1;i<5;i++) {
hnd = actions[action]->handlers.Peek(i); // actions[action]->handlers - стек
// В hnd заносится адрес указателя на функцию
if (hnd != NULL) hnd(); // Программа закрывается на этом месте, если эту строку убрать - то не закрывается
}
}
я использовал класс стека отсюда
http://cppstudio.com/post/5155/
Пробовал по всякому, не работает
Если получится, будет как мне кажется красивый и удобный способ устанавливать обработчики для событий элементов:
Code: Select all
// Обработка клика по кнопке
void buttonclick() {
win->buttons[win->clickButtonId]->color = COLOR_YELLOW;
win->update();
}
// Ещё действие при клике
void buttonclick2() {
win->labels[0]->color = COLOR_BLUE;
win->labels[0]->text = "Click!!!";
}
Button* btn = new Button;
btn->addHandler(EVENT_BUTTON_CLICK, buttonclick);
btn->addHandler(EVENT_BUTTON_CLICK, buttonclick2);
// Ещё примеры
Window* win = new Window();
win->addHandler(EVENT_DRAW, testhandler);
// Событие вызывается так (будут выполнены все обработчики):
win->call(EVENT_DRAW);
Re: Создание приложений на классах
Posted: Tue Nov 11, 2014 9:13 am
by irkant
Leency wrote:Идея хорошая
Идея очевидная
А делать надо один раз - сам API системы, вместо библиотек оберток-прокладок под десяток языков.
Re: Создание приложений на классах
Posted: Tue Nov 11, 2014 9:20 am
by irkant
Nikolai1 wrote:есть адрес указателя на функцию
Это как, указатель на указатель?
Да, сравнивать с NULL совершенно излишне. Вместо
Code: Select all
if (some_expr!=0)
if (some_expr==0)
достаточно
Re: Создание приложений на классах
Posted: Tue Nov 11, 2014 12:42 pm
by Nikolai1
Убрал стек и сделал хранение обработчиков через массив указателей на функции.
Для тестирования работы сделал простенькую программку, в которой можно управлять кнопкой.
Управление:
W - вверх
S - вниз
D - вправо
A - влево
Клик по кнопке вернёт её в начальное положение
Code: Select all
// Обработка клика по кнопке
void buttonclick() {
win->buttons[0]->x = 20;
win->buttons[0]->y = 20;
win->update();
}
void window_key_press() {
switch (win->lastKeyPressCode) {
//..........................
}
char a = static_cast<char>(win->lastKeyPressCode);
win->labels[0]->text = &a;
win->update();
}
// ........
btn->addHandler(EVENT_BUTTON_CLICK, buttonclick);
win->addHandler(EVENT_KEY_PRESS, window_key_press);
// ..............
Re: Создание приложений на классах
Posted: Tue Nov 11, 2014 3:40 pm
by Nikolai1
Теперь хочу добавить другие элементы интерфейса - поле для ввода текста, флажки и т.д.. Буду пытаться понять принцип подключения box_lib из приложения table
А ещё нужно как-то поправить хранение этих элементов в классе, для каждого типа элемента (кнопка, надпись) сейчас создан отдельный массив указателей и переменная (хранит номер последнего элемента в массиве)
Как думаете, что ещё можно добавить?
Если смогу, то как мне кажется, можно будет использовать мои классы как библиотеку для облегчения разработки.
Re: Создание приложений на классах
Posted: Wed Nov 12, 2014 9:50 pm
by Nikolai1
Без кучи готовых библиотек (которые есть под Windows) трудно нормально программировать
Re: Создание приложений на классах
Posted: Wed Nov 12, 2014 10:58 pm
by punk_joker
Nikolai1 wrote:Без кучи готовых библиотек (которые есть под Windows) трудно нормально программировать
Нормальных, это каких?
Re: Создание приложений на классах
Posted: Thu Nov 13, 2014 3:52 pm
by Nikolai1
Нормальных, это каких?
Например хотелось бы использовать контейнеры vector и map. Они есть под Kolibri?
P. S. Как я писал ранее, в C++ я новичок, изучаю около месяца (и то не каждый день) в свободное время. Может для моих целей можно использовать что-нибудь другое
Re: Создание приложений на классах
Posted: Thu Nov 13, 2014 4:16 pm
by Mario_r4
Nikolai1 wrote:P. S. Как я писал ранее, в C++ я новичок, изучаю около месяца (и то не каждый день) в свободное время. Может для моих целей можно использовать что-нибудь другое
Можно. Лучший язык программирования в Колибри для новичков это Assembler++.