Page 3 of 5
Re: Создание приложений на классах
Posted: Wed Nov 19, 2014 2:22 pm
by Nikolai1
Mario_r4 wrote:Nikolai1 wrote:Я просто на PHP уже несколько лет программирую, это мой "родной" язык
От оно как! Мы то думали, что ваш родной язык - русский, а оказывается вы по слоновьи лучше понимаете. Будем это учитывать.
Да я по всякому умею и по-русски и по-слоновьи
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 определённого цвета
- Возможность перекрашивать определённые пиксели в любой цвет
Скрин нового элемента:
Пример использования:
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
Может есть какие-нибудь замечания или предложения?