Board.KolibriOS.org
http://board.kolibrios.org/

Создание приложений на классах
http://board.kolibrios.org/viewtopic.php?f=33&t=2896
Page 1 of 5

Author:  Nikolai1 [ Fri Nov 07, 2014 5:54 pm ]
Post subject:  Создание приложений на классах

Решил попробовать представить основные элементы интерфейса как классы (пока есть только окно, надпись и кнопка). Целью было облегчить создание программ под KolibriOS и сделать проще обработку событий (клик по кнопке например).

Для теста создал окно с надписью и кнопкой. При клике по кнопке меняется текст и цвет надписи и фон кнопки.
Код получился вот такой:
Spoiler: Show
Code:
#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++ я только начинаю изучать, поэтому некоторые вещи могут быть сделаны очень "Криво"

Attachments:
test.zip [3.82 KiB]
Downloaded 229 times

Author:  Leency [ Fri Nov 07, 2014 7:28 pm ]
Post subject:  Re: Создание приложений на классах

Идея хорошая, надо и нам в С-- такие штуки сделать.

Author:  Wildwest [ Fri Nov 07, 2014 7:31 pm ]
Post subject:  Re: Создание приложений на классах

Это в каком компиляторе сделано - Microsoft Visual Studio или что-то другое?

Author:  Nikolai1 [ Fri Nov 07, 2014 7:38 pm ]
Post subject:  Re: Создание приложений на классах

Microsoft Visual C++ 2010 Express Edition

Author:  Nikolai1 [ Fri Nov 07, 2014 9:42 pm ]
Post subject:  Re: Создание приложений на классах

Никто не подскажет, как в одном массиве хранить указатели на объекты разных классов? Во всех примерах, которые я находил используется std::vector.

Author:  dunkaist [ Sat Nov 08, 2014 5:18 am ]
Post subject:  Re: Создание приложений на классах

Делай абстрактный класс и наследуй от него.

Author:  Nikolai1 [ Tue Nov 11, 2014 12:25 am ]
Post subject:  Re: Создание приложений на классах

Подскажите, что делать в такой ситуации:
есть адрес указателя на функцию, как по нему вызвать функцию?

Code:
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:
// Обработка клика по кнопке
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);

Author:  irkant [ Tue Nov 11, 2014 9:13 am ]
Post subject:  Re: Создание приложений на классах

Leency wrote:
Идея хорошая
Идея очевидная :) А делать надо один раз - сам API системы, вместо библиотек оберток-прокладок под десяток языков.

Author:  irkant [ Tue Nov 11, 2014 9:20 am ]
Post subject:  Re: Создание приложений на классах

Nikolai1 wrote:
есть адрес указателя на функцию

Это как, указатель на указатель? :)
Да, сравнивать с NULL совершенно излишне. Вместо
Code:
if (some_expr!=0)
if (some_expr==0)

достаточно
Code:
if (some_expr)
if (!some_expr)

Author:  Nikolai1 [ Tue Nov 11, 2014 12:42 pm ]
Post subject:  Re: Создание приложений на классах

Убрал стек и сделал хранение обработчиков через массив указателей на функции.
Для тестирования работы сделал простенькую программку, в которой можно управлять кнопкой.
Управление:
W - вверх
S - вниз
D - вправо
A - влево
Клик по кнопке вернёт её в начальное положение

Code:
// Обработка клика по кнопке
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);
// ..............


Attachments:
test0.0.2.zip [5.74 KiB]
Downloaded 247 times

Author:  Nikolai1 [ Tue Nov 11, 2014 3:40 pm ]
Post subject:  Re: Создание приложений на классах

Теперь хочу добавить другие элементы интерфейса - поле для ввода текста, флажки и т.д.. Буду пытаться понять принцип подключения box_lib из приложения table :lol:
А ещё нужно как-то поправить хранение этих элементов в классе, для каждого типа элемента (кнопка, надпись) сейчас создан отдельный массив указателей и переменная (хранит номер последнего элемента в массиве)

Как думаете, что ещё можно добавить?

Если смогу, то как мне кажется, можно будет использовать мои классы как библиотеку для облегчения разработки.

Author:  Nikolai1 [ Wed Nov 12, 2014 9:50 pm ]
Post subject:  Re: Создание приложений на классах

Без кучи готовых библиотек (которые есть под Windows) трудно нормально программировать :(

Author:  punk_joker [ Wed Nov 12, 2014 10:58 pm ]
Post subject:  Re: Создание приложений на классах

Nikolai1 wrote:
Без кучи готовых библиотек (которые есть под Windows) трудно нормально программировать :(

Нормальных, это каких?

Author:  Nikolai1 [ Thu Nov 13, 2014 3:52 pm ]
Post subject:  Re: Создание приложений на классах

Quote:
Нормальных, это каких?

Например хотелось бы использовать контейнеры vector и map. Они есть под Kolibri?

P. S. Как я писал ранее, в C++ я новичок, изучаю около месяца (и то не каждый день) в свободное время. Может для моих целей можно использовать что-нибудь другое

Author:  Mario_r4 [ Thu Nov 13, 2014 4:16 pm ]
Post subject:  Re: Создание приложений на классах

Nikolai1 wrote:
P. S. Как я писал ранее, в C++ я новичок, изучаю около месяца (и то не каждый день) в свободное время. Может для моих целей можно использовать что-нибудь другое

Можно. Лучший язык программирования в Колибри для новичков это Assembler++.

Page 1 of 5 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/