Да я по всякому умею и по-русски и по-слоновьиMario_r4 wrote:От оно как! Мы то думали, что ваш родной язык - русский, а оказывается вы по слоновьи лучше понимаете. Будем это учитывать.Nikolai1 wrote:Я просто на PHP уже несколько лет программирую, это мой "родной" язык
Создание приложений на классах
-
Чудеса случаются! Это вам любой программист скажет!
Сколько ни пробовал оформить 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;
}
Чудеса случаются! Это вам любой программист скажет!
Nikolai1: Have you seen the example at "SVN\programs\develop\libraries\box_lib\asm\trunk\editbox_ex.asm" ?
"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." Albert Einstein
yes they are. But there's an example in assembly language. I'm doing a library in c ++
Чудеса случаются! Это вам любой программист скажет!
hidnplayr дал тебе верный совет. Ты забыл добавить обработку событий мыши для editbox.
ааа.. спасибо)) попробую теперь сделатьТы забыл добавить обработку событий мыши для editbox.
Чудеса случаются! Это вам любой программист скажет!
отлично! фокус на поле устанавливается, но при попытке ввести текст программа завершается
Чудеса случаются! Это вам любой программист скажет!
кажется, это из-за того, что в классе я использую указатель на тип charNikolai1 wrote:отлично! фокус на поле устанавливается, но при попытке ввести текст программа завершается
Чудеса случаются! Это вам любой программист скажет!
Во! пока есть свободное время, попробую продолжить разработку
Чудеса случаются! Это вам любой программист скажет!
Пока на время "отстал" от BoxLib, сегодня сделал несколько других изменений
- Разбил проект на отдельные файлы (теперь для каждого класса свой отдельный файл, а не в куче в одном core.cpp, как раньше)
- Поменял способ регистрации элементов интерфейса
- Изменил обработку событий (старый вариант с регистрацией функций-обработчиков пока ещё остался)
- Добавил в класс окна метод для получения элемента интерфейса по его типу и ID
- Ещё некоторые доработки в коде...
Выкладываю архив с исходным кодом и простейшим примером приложения
Код тестового приложения с использованием моих классов
Как мне кажется, гораздо удобнее чем просто при использовании системных функций.
- Разбил проект на отдельные файлы (теперь для каждого класса свой отдельный файл, а не в куче в одном 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;
}
- Attachments
-
-
test0.0.4.zip (8.95 KiB)Downloaded 414 times
-
Чудеса случаются! Это вам любой программист скажет!
Да, действительно удобно, но имхо все должно быть по другому структурировано. Кнопки и лабелы - компоненты окна, значит должны быть как минимум полями объекта окна. Т.е. приложение должно выглядеть примерно так:
На сишке не писал несколько лет, в чем то могу ошибаться. И емнип, методы нужно описывать вне описания класса, иначе они получаются inline.
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;
}
Ну да, так правильнее будет. В принципе ваш код можно применять уже сейчас, разве что объект родительского окна не передаётся в конструктор элемента. Доработаю.Кнопки и лабелы - компоненты окна, значит должны быть как минимум полями объекта окна
P. S. Сегодня некогда, отмечаю свой День Рождения
Чудеса случаются! Это вам любой программист скажет!
С днем рождения!) Не забрось проект. Если уж и писать на сишке, то только с большим уровнем абстракций.
Спасибо))) постараюсь не забросить)С днем рождения!) Не забрось проект. Если уж и писать на сишке, то только с большим уровнем абстракций.
в ближайшее время хочу сделать функции для удобной загрузки DLL и вызова функций из них и оформить наконец элементы интерфейса из BoxLib как классы
Чудеса случаются! Это вам любой программист скажет!
Немного доработал библиотеку.
1) Пара новых функций в классах
2) Добавил элемент интерфейса "Блок пикселей"
- Возможность создания блока пикселей размером A x B определённого цвета
- Возможность перекрашивать определённые пиксели в любой цвет
Скрин нового элемента:
Пример использования:
Следующие доработки на очереди:
1) Элемент интерфейса "Число", аналогично надписи, только для вывода числа в окно
2) Элемент интерфейса "Изображение" для вывода изображения с помощью седьмой системной функции
3) Элементы интерфейса "Прямоугольник" и "Отрезок"
Пока делаю то, что можно реализовать стандартными системными функциями, без подключения других библиотек
Потом опять буду пробовать BoxLib
Может есть какие-нибудь замечания или предложения?
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
Может есть какие-нибудь замечания или предложения?
- Attachments
-
-
test0.0.5.zip (9.31 KiB)Downloaded 408 times
-
Чудеса случаются! Это вам любой программист скажет!
Who is online
Users browsing this forum: No registered users and 4 guests