Page 3 of 5

Re: Создание приложений на классах

Posted: Wed Nov 19, 2014 2:22 pm
by Nikolai1
Mario_r4 wrote:
Nikolai1 wrote:Я просто на PHP уже несколько лет программирую, это мой "родной" язык :D
От оно как! Мы то думали, что ваш родной язык - русский, а оказывается вы по слоновьи лучше понимаете. Будем это учитывать.
Да я по всякому умею и по-русски и по-слоновьи :-D

Re: Создание приложений на классах

Posted: Sun Dec 07, 2014 1:56 pm
by Nikolai1
Сколько ни пробовал оформить edit_box из box_lib как класс, не получается заставить работать.
Последний вариант кода такой:
Spoiler:

Code: Select all

struct EditBoxStruct {
	Dword width, left, top, color, shift_color, focus_border_color, blur_border_color,
	text_color, max, text, mouse_variable, flags, size, pos, offset, cl_curs_x, cl_curs_y, shift, shift_old;
};

class EditBox : public Control {
public:
	int getType();
	EditBox();

	Dword width, left, top, color, shift_color, focus_border_color, blur_border_color,
	text_color, max, text, mouse_variable, flags, size, pos, offset, cl_curs_x, cl_curs_y, shift, shift_old;
	kol_struct_import *box_lib_dll;
	dword_func* edit_box_draw;
	dword_func* edit_box_key;

	EditBox(EditBoxStruct*);

	EditBoxStruct box;

	void draw();
	void sysevent(int eventCode);
};

EditBox::EditBox() {
	// Загрузка Box LIB
	box_lib_dll = load_box_lib();
	edit_box_draw = (dword_func*)kol_cofflib_procload(box_lib_dll, "edit_box");
	edit_box_key = (dword_func*)kol_cofflib_procload(box_lib_dll, "edit_box_key");

	this->width = 100;
	this->left = 10;
	this->top = 10;
	this->color = COLOR_WHITE;
	this->shift_color = COLOR_RED;
	this->focus_border_color = COLOR_GREEN;
	this->blur_border_color = COLOR_BLUE;
	this->text_color = COLOR_BLACK;
	this->max = 255;
	this->text = (Dword)"Test Message";
	this->mouse_variable;
	this->size = 100;
}

void EditBox::draw() {	
	EditBoxStruct tbox = {width, left, top, color, shift_color, focus_border_color, blur_border_color,
	text_color, max, (Dword)&text, (Dword)&mouse_variable, flags, size, pos, offset, cl_curs_x, cl_curs_y, shift, shift_old};

	box = tbox;

	edit_box_draw((Dword)&box);
}

void EditBox::sysevent(int eventCode) {
	if (eventCode == EM_KEY_PRESS) edit_box_key((dword)&box);
}

int EditBox::getType() {
	return CONTROL_EDITBOX;
}
рисуется в окне нормально, а вот текст в поле все равно не вводится

Re: Создание приложений на классах

Posted: Sun Dec 07, 2014 2:04 pm
by hidnplayr
Nikolai1: Have you seen the example at "SVN\programs\develop\libraries\box_lib\asm\trunk\editbox_ex.asm" ?

Re: Создание приложений на классах

Posted: Sun Dec 07, 2014 2:17 pm
by Nikolai1
yes they are. But there's an example in assembly language. I'm doing a library in c ++

Posted: Sun Dec 07, 2014 2:42 pm
by e-andrew
hidnplayr дал тебе верный совет. Ты забыл добавить обработку событий мыши для editbox.

Re: Создание приложений на классах

Posted: Sun Dec 07, 2014 2:45 pm
by Nikolai1
Ты забыл добавить обработку событий мыши для editbox.
ааа.. спасибо)) попробую теперь сделать

Re: Создание приложений на классах

Posted: Sun Dec 07, 2014 3:13 pm
by Nikolai1
отлично! фокус на поле устанавливается, но при попытке ввести текст программа завершается

Re: Создание приложений на классах

Posted: Sun Dec 07, 2014 3:27 pm
by Nikolai1
Nikolai1 wrote:отлично! фокус на поле устанавливается, но при попытке ввести текст программа завершается
кажется, это из-за того, что в классе я использую указатель на тип char

Re: Создание приложений на классах

Posted: Tue Jan 06, 2015 2:47 pm
by Nikolai1
Во! пока есть свободное время, попробую продолжить разработку

Re: Создание приложений на классах

Posted: Tue Jan 06, 2015 11:03 pm
by Nikolai1
Пока на время "отстал" от BoxLib, сегодня сделал несколько других изменений

- Разбил проект на отдельные файлы (теперь для каждого класса свой отдельный файл, а не в куче в одном core.cpp, как раньше)
- Поменял способ регистрации элементов интерфейса
- Изменил обработку событий (старый вариант с регистрацией функций-обработчиков пока ещё остался)
- Добавил в класс окна метод для получения элемента интерфейса по его типу и ID
- Ещё некоторые доработки в коде...

Выкладываю архив с исходным кодом и простейшим примером приложения

Код тестового приложения с использованием моих классов
Spoiler:

Code: Select all

#include <kosSyst.h>
#include <kosFile.h>
#include "core.h"

// Регистрация окна
Window* win = new Window();

class StatusLabel : public Label {
	// Инициализация
	void init() {
		this->id = 10;
		this->x = 15;
		this->y = 70;

		this->text = "Hello, dear friend! How are You?";

		this->color = COLOR_BLACK;
	}

	void onDraw() {
		// Обрабатываем событие перерисовки, можно устанавливать
		// такой метод для любого элемента интерфейса
	}
};

class GreenButton : public Button {
	// Инициализация
	void init() {
		this->id = 20;
		this->x = 15;
		this->y = 15;
		this->sizeX = 100;
		this->sizeY = 50;
		this->color = COLOR_GREEN;
	}

	// Обрабатываем событие клика по кнопке
	void onClick() {
		// Получаем элемент "Надпись", созданный ранее и изменяем его параметры
		Label* label = (Label*) win->getControl(CONTROL_LABEL, 10);
		if (!label) return;

		label->text = "I am OK! Thank you! Good bye!";
		label->color = COLOR_GREEN;
		win->update(); // Обновить окно
	}
};

class RedButton : public Button {
	void init() {
		this->id = 21;
		this->x = 120;
		this->y = 15;
		this->sizeX = 100;
		this->sizeY = 50;
		this->color = COLOR_RED;
	}

	// Обрабатываем событие клика по кнопке
	void onClick() {
		// Получаем элемент "Надпись", созданный ранее и изменяем его параметры
		Label* label = (Label*) win->getControl(CONTROL_LABEL, 10);
		if (!label) return;

		label->text = "I am very bad! Thank you! Good bye!";
		label->color = COLOR_RED;
		win->update(); // Обновить окно
	}
};

void kos_Main() {
	win->header = (Dword)"Test Application";

	// Регистрация элементов интерфейса в окне
	win->addControl(CONTROL_LABEL, new StatusLabel);
	win->addControl(CONTROL_BUTTON, new GreenButton);
	win->addControl(CONTROL_BUTTON, new RedButton);

	// Отрисовать окно
	win->draw();

	// Запустить ожидание событий
	win->waitForEvent();

	delete win;
}
Как мне кажется, гораздо удобнее чем просто при использовании системных функций.

Re: Создание приложений на классах

Posted: Wed Jan 07, 2015 2:11 am
by e-andrew
Да, действительно удобно, но имхо все должно быть по другому структурировано. Кнопки и лабелы - компоненты окна, значит должны быть как минимум полями объекта окна. Т.е. приложение должно выглядеть примерно так:

Code: Select all

class StatusLabel : Label
{
public:
  StatusLabel(WindowTest* parent)
  {
    this->parent = parent;
    // ..
  }
}

class RedButton : Button
{
public:
  RedButton(WindowTest* parent)
  {
    this->parent = parent;
    /* ... */
  }

  void onClick()
  {
    (WindowTest*)parent->statusLabel->setText("Red Button clicked");
    /* ... */
  }
}

/* ... */

class WindowTest : Window
{
public:
  StatusLabel* statusLabel;
  RedButton* redButton;
  GreenButton* greenButton;

  WindowTest()
  {
    this->statusLabel = new StatusLabel(this);
    this->redButton = new RedButton(this);
    this->greenButton = new GreenButton(this);

    this->addControl(/* ... */);
  }
}

int main()
{
  WindowTest* test = new WindowTest();
  test->run();
  return 0;
}
На сишке не писал несколько лет, в чем то могу ошибаться. И емнип, методы нужно описывать вне описания класса, иначе они получаются inline.

Re: Создание приложений на классах

Posted: Wed Jan 07, 2015 4:12 pm
by Nikolai1
Кнопки и лабелы - компоненты окна, значит должны быть как минимум полями объекта окна
Ну да, так правильнее будет. В принципе ваш код можно применять уже сейчас, разве что объект родительского окна не передаётся в конструктор элемента. Доработаю.

P. S. Сегодня некогда, отмечаю свой День Рождения :) :) :)

Re: Создание приложений на классах

Posted: Wed Jan 07, 2015 4:49 pm
by e-andrew
С днем рождения!) Не забрось проект. Если уж и писать на сишке, то только с большим уровнем абстракций.

Re: Создание приложений на классах

Posted: Wed Jan 07, 2015 9:31 pm
by Nikolai1
С днем рождения!) Не забрось проект. Если уж и писать на сишке, то только с большим уровнем абстракций.
Спасибо))) постараюсь не забросить)
в ближайшее время хочу сделать функции для удобной загрузки DLL и вызова функций из них и оформить наконец элементы интерфейса из BoxLib как классы

Re: Создание приложений на классах

Posted: Thu Jan 08, 2015 4:21 pm
by Nikolai1
Немного доработал библиотеку.

1) Пара новых функций в классах
2) Добавил элемент интерфейса "Блок пикселей"
- Возможность создания блока пикселей размером A x B определённого цвета
- Возможность перекрашивать определённые пиксели в любой цвет
Скрин нового элемента:
Image

Пример использования:

Code: Select all

void ApplicationWindow::init() {
	this->header = (Dword)"Hello, World!";
	//button = new GreenButton(this);
	this->button = new GreenButton(this);
	this->px = new Pixels(400,300,COLOR_GREEN);

	this->px->x = 40;
	this->px->y = 40;

	this->px->color = COLOR_RED;
	this->px->updateMap();

	int pX,pY;
	for (pX=0;pX<50;pX++) {
		for (pY=0;pY<50;pY++) {
			this->px->SetPixelColor(pX, pY, COLOR_AQUA);
		}
	}

	for (pX=100;pX<150;pX++) {
		for (pY=100;pY<150;pY++) {
			this->px->SetPixelColor(pX, pY, COLOR_YELLOW);
		}
	}

	this->addControl(this->button);
	this->addControl(px);
}
Следующие доработки на очереди:
1) Элемент интерфейса "Число", аналогично надписи, только для вывода числа в окно
2) Элемент интерфейса "Изображение" для вывода изображения с помощью седьмой системной функции
3) Элементы интерфейса "Прямоугольник" и "Отрезок"
Пока делаю то, что можно реализовать стандартными системными функциями, без подключения других библиотек

Потом опять буду пробовать BoxLib

Может есть какие-нибудь замечания или предложения?