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

High-level languages programming questions
  • Сколько ни пробовал оформить 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.
    ааа.. спасибо)) попробую теперь сделать
    Чудеса случаются! Это вам любой программист скажет! :)
  • отлично! фокус на поле устанавливается, но при попытке ввести текст программа завершается
    Чудеса случаются! Это вам любой программист скажет! :)
  • Nikolai1 wrote:отлично! фокус на поле устанавливается, но при попытке ввести текст программа завершается
    кажется, это из-за того, что в классе я использую указатель на тип char
    Чудеса случаются! Это вам любой программист скажет! :)
  • Во! пока есть свободное время, попробую продолжить разработку
    Чудеса случаются! Это вам любой программист скажет! :)
  • Пока на время "отстал" от 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;
    }
    
    Как мне кажется, гораздо удобнее чем просто при использовании системных функций.
    Attachments
    test0.0.4.zip (8.95 KiB)
    Downloaded 403 times
    Чудеса случаются! Это вам любой программист скажет! :)
  • Да, действительно удобно, но имхо все должно быть по другому структурировано. Кнопки и лабелы - компоненты окна, значит должны быть как минимум полями объекта окна. Т.е. приложение должно выглядеть примерно так:

    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.
  • Кнопки и лабелы - компоненты окна, значит должны быть как минимум полями объекта окна
    Ну да, так правильнее будет. В принципе ваш код можно применять уже сейчас, разве что объект родительского окна не передаётся в конструктор элемента. Доработаю.

    P. S. Сегодня некогда, отмечаю свой День Рождения :) :) :)
    Чудеса случаются! Это вам любой программист скажет! :)
  • С днем рождения!) Не забрось проект. Если уж и писать на сишке, то только с большим уровнем абстракций.
  • С днем рождения!) Не забрось проект. Если уж и писать на сишке, то только с большим уровнем абстракций.
    Спасибо))) постараюсь не забросить)
    в ближайшее время хочу сделать функции для удобной загрузки DLL и вызова функций из них и оформить наконец элементы интерфейса из BoxLib как классы
    Чудеса случаются! Это вам любой программист скажет! :)
  • Немного доработал библиотеку.

    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

    Может есть какие-нибудь замечания или предложения?
    Attachments
    test0.0.5.zip (9.31 KiB)
    Downloaded 396 times
    Чудеса случаются! Это вам любой программист скажет! :)
  • Who is online

    Users browsing this forum: No registered users and 1 guest