Board.KolibriOS.org

Official KolibriOS board
It is currently Sat May 25, 2019 12:42 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 74 posts ]  Go to page 1 2 3 4 5 Next
Author Message
PostPosted: Fri Nov 07, 2014 5:54 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
Решил попробовать представить основные элементы интерфейса как классы (пока есть только окно, надпись и кнопка). Целью было облегчить создание программ под 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 158 times

_________________
Чудеса случаются! Это вам любой программист скажет! :)
Top
   
PostPosted: Fri Nov 07, 2014 7:28 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5047
Идея хорошая, надо и нам в С-- такие штуки сделать.

_________________
Через тернии к звездам


Top
   
PostPosted: Fri Nov 07, 2014 7:31 pm 
Offline

Joined: Wed May 18, 2005 7:27 pm
Posts: 1001
Это в каком компиляторе сделано - Microsoft Visual Studio или что-то другое?


Top
   
PostPosted: Fri Nov 07, 2014 7:38 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
Microsoft Visual C++ 2010 Express Edition

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Top
   
PostPosted: Fri Nov 07, 2014 9:42 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
Никто не подскажет, как в одном массиве хранить указатели на объекты разных классов? Во всех примерах, которые я находил используется std::vector.

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Top
   
PostPosted: Sat Nov 08, 2014 5:18 am 
Offline
Mentor
User avatar

Joined: Mon Oct 19, 2009 10:58 am
Posts: 416
Делай абстрактный класс и наследуй от него.


Top
   
PostPosted: Tue Nov 11, 2014 12:25 am 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
Подскажите, что делать в такой ситуации:
есть адрес указателя на функцию, как по нему вызвать функцию?

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);

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Top
   
PostPosted: Tue Nov 11, 2014 9:13 am 
Offline

Joined: Wed Sep 24, 2014 5:47 pm
Posts: 34
Leency wrote:
Идея хорошая
Идея очевидная :) А делать надо один раз - сам API системы, вместо библиотек оберток-прокладок под десяток языков.


Top
   
PostPosted: Tue Nov 11, 2014 9:20 am 
Offline

Joined: Wed Sep 24, 2014 5:47 pm
Posts: 34
Nikolai1 wrote:
есть адрес указателя на функцию

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

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


Last edited by irkant on Tue Nov 11, 2014 12:46 pm, edited 1 time in total.

Top
   
PostPosted: Tue Nov 11, 2014 12:42 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
Убрал стек и сделал хранение обработчиков через массив указателей на функции.
Для тестирования работы сделал простенькую программку, в которой можно управлять кнопкой.
Управление:
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 172 times

_________________
Чудеса случаются! Это вам любой программист скажет! :)
Top
   
PostPosted: Tue Nov 11, 2014 3:40 pm 
Offline

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

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

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

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Top
   
PostPosted: Wed Nov 12, 2014 9:50 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
Без кучи готовых библиотек (которые есть под Windows) трудно нормально программировать :(

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Top
   
PostPosted: Wed Nov 12, 2014 10:58 pm 
Offline

Joined: Tue Apr 12, 2011 11:19 pm
Posts: 1148
Nikolai1 wrote:
Без кучи готовых библиотек (которые есть под Windows) трудно нормально программировать :(

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

_________________
я лишь учусь


Top
   
PostPosted: Thu Nov 13, 2014 3:52 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
Quote:
Нормальных, это каких?

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

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

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Top
   
PostPosted: Thu Nov 13, 2014 4:16 pm 
Offline
Kernel Developer

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

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

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 74 posts ]  Go to page 1 2 3 4 5 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited