Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Пн окт 23, 2017 7:24 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 74 сообщения ]  На страницу Пред. 1 2 3 4 5 След.
Автор Сообщение
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Ср ноя 19, 2014 2:22 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Mario_r4 писал(а):
Nikolai1 писал(а):
Я просто на PHP уже несколько лет программирую, это мой "родной" язык :D

От оно как! Мы то думали, что ваш родной язык - русский, а оказывается вы по слоновьи лучше понимаете. Будем это учитывать.

Да я по всякому умею и по-русски и по-слоновьи :-D

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Вс дек 07, 2014 1:56 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Сколько ни пробовал оформить edit_box из box_lib как класс, не получается заставить работать.
Последний вариант кода такой:
Спойлер: Показать
Код:
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: Создание приложений на классах
СообщениеДобавлено: Вс дек 07, 2014 2:04 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Пт июн 30, 2006 9:01 am
Сообщения: 1229
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


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Вс дек 07, 2014 2:17 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
yes they are. But there's an example in assembly language. I'm doing a library in c ++

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Вс дек 07, 2014 2:42 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Сб окт 05, 2013 9:32 pm
Сообщения: 385
hidnplayr дал тебе верный совет. Ты забыл добавить обработку событий мыши для editbox.


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Вс дек 07, 2014 2:45 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Цитата:
Ты забыл добавить обработку событий мыши для editbox.

ааа.. спасибо)) попробую теперь сделать

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Вс дек 07, 2014 3:13 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
отлично! фокус на поле устанавливается, но при попытке ввести текст программа завершается

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Вс дек 07, 2014 3:27 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Nikolai1 писал(а):
отлично! фокус на поле устанавливается, но при попытке ввести текст программа завершается

кажется, это из-за того, что в классе я использую указатель на тип char

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Вт янв 06, 2015 2:47 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Во! пока есть свободное время, попробую продолжить разработку

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Вт янв 06, 2015 11:03 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Пока на время "отстал" от BoxLib, сегодня сделал несколько других изменений

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

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

Код тестового приложения с использованием моих классов
Спойлер: Показать
Код:
#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;
}


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


Вложения:
test0.0.4.zip [8.95 КБ]
51 скачивание

_________________
Чудеса случаются! Это вам любой программист скажет! :)
Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Ср янв 07, 2015 2:11 am 
Не в сети
Аватара пользователя

Зарегистрирован: Сб окт 05, 2013 9:32 pm
Сообщения: 385
Да, действительно удобно, но имхо все должно быть по другому структурировано. Кнопки и лабелы - компоненты окна, значит должны быть как минимум полями объекта окна. Т.е. приложение должно выглядеть примерно так:
Код:
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: Создание приложений на классах
СообщениеДобавлено: Ср янв 07, 2015 4:12 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Цитата:
Кнопки и лабелы - компоненты окна, значит должны быть как минимум полями объекта окна

Ну да, так правильнее будет. В принципе ваш код можно применять уже сейчас, разве что объект родительского окна не передаётся в конструктор элемента. Доработаю.

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

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Ср янв 07, 2015 4:49 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Сб окт 05, 2013 9:32 pm
Сообщения: 385
С днем рождения!) Не забрось проект. Если уж и писать на сишке, то только с большим уровнем абстракций.


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Ср янв 07, 2015 9:31 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Цитата:
С днем рождения!) Не забрось проект. Если уж и писать на сишке, то только с большим уровнем абстракций.

Спасибо))) постараюсь не забросить)
в ближайшее время хочу сделать функции для удобной загрузки DLL и вызова функций из них и оформить наконец элементы интерфейса из BoxLib как классы

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Чт янв 08, 2015 4:21 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Немного доработал библиотеку.

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

Пример использования:
Код:
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

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


Вложения:
test0.0.5.zip [9.31 КБ]
48 скачиваний

_________________
Чудеса случаются! Это вам любой программист скажет! :)
Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 74 сообщения ]  На страницу Пред. 1 2 3 4 5 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB