Board.KolibriOS.org

Official KolibriOS board
It is currently Tue Nov 12, 2019 12:02 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 74 posts ]  Go to page Previous 1 2 3 4 5 Next
Author Message
PostPosted: Wed Nov 19, 2014 2:22 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
Mario_r4 wrote:
Nikolai1 wrote:
Я просто на PHP уже несколько лет программирую, это мой "родной" язык :D

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

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

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


Top
   
PostPosted: Sun Dec 07, 2014 1:56 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
Сколько ни пробовал оформить edit_box из box_lib как класс, не получается заставить работать.
Последний вариант кода такой:
Spoiler: Show
Code:
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;
}


рисуется в окне нормально, а вот текст в поле все равно не вводится

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


Top
   
PostPosted: Sun Dec 07, 2014 2:04 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Fri Jun 30, 2006 9:01 am
Posts: 1248
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


Top
   
PostPosted: Sun Dec 07, 2014 2:17 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
yes they are. But there's an example in assembly language. I'm doing a library in c ++

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


Top
   
 Post subject:
PostPosted: Sun Dec 07, 2014 2:42 pm 
Offline
User avatar

Joined: Sat Oct 05, 2013 9:32 pm
Posts: 386
hidnplayr дал тебе верный совет. Ты забыл добавить обработку событий мыши для editbox.


Top
   
PostPosted: Sun Dec 07, 2014 2:45 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
Quote:
Ты забыл добавить обработку событий мыши для editbox.

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

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


Top
   
PostPosted: Sun Dec 07, 2014 3:13 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
отлично! фокус на поле устанавливается, но при попытке ввести текст программа завершается

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


Top
   
PostPosted: Sun Dec 07, 2014 3:27 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
Nikolai1 wrote:
отлично! фокус на поле устанавливается, но при попытке ввести текст программа завершается

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

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


Top
   
PostPosted: Tue Jan 06, 2015 2:47 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
Во! пока есть свободное время, попробую продолжить разработку

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


Top
   
PostPosted: Tue Jan 06, 2015 11:03 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
Пока на время "отстал" от BoxLib, сегодня сделал несколько других изменений

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

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

Код тестового приложения с использованием моих классов
Spoiler: Show
Code:
#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 150 times

_________________
Чудеса случаются! Это вам любой программист скажет! :)
Top
   
PostPosted: Wed Jan 07, 2015 2:11 am 
Offline
User avatar

Joined: Sat Oct 05, 2013 9:32 pm
Posts: 386
Да, действительно удобно, но имхо все должно быть по другому структурировано. Кнопки и лабелы - компоненты окна, значит должны быть как минимум полями объекта окна. Т.е. приложение должно выглядеть примерно так:
Code:
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.


Top
   
PostPosted: Wed Jan 07, 2015 4:12 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
Quote:
Кнопки и лабелы - компоненты окна, значит должны быть как минимум полями объекта окна

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

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

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


Top
   
PostPosted: Wed Jan 07, 2015 4:49 pm 
Offline
User avatar

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


Top
   
PostPosted: Wed Jan 07, 2015 9:31 pm 
Offline

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

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

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


Top
   
PostPosted: Thu Jan 08, 2015 4:21 pm 
Offline

Joined: Sat Oct 11, 2014 6:06 pm
Posts: 67
Немного доработал библиотеку.

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

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

_________________
Чудеса случаются! Это вам любой программист скажет! :)
Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 74 posts ]  Go to page Previous 1 2 3 4 5 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited