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)
достаточно

Code: Select all

if (some_expr)
if (!some_expr)

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 :lol:
А ещё нужно как-то поправить хранение этих элементов в классе, для каждого типа элемента (кнопка, надпись) сейчас создан отдельный массив указателей и переменная (хранит номер последнего элемента в массиве)

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

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

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++.