Board.KolibriOS.org
http://board.kolibrios.org/

Создание приложений на классах
http://board.kolibrios.org/viewtopic.php?f=33&t=2896
Page 4 of 5

Author:  Nikolai1 [ Thu Jan 08, 2015 10:40 pm ]
Post subject:  Re: Создание приложений на классах

Добавил ещё 2 элемента интерфейса: "Число" и "Отрезок"
Создание элемента числа:
Code:
NumberLabel* num = new NumberLabel(25);


Создание отрезка из точки (10, 10) в точку (20, 20):
Code:
Offcut* of1 = new Offcut(10, 10, 20, 20);

Вместе с элементом "Отрезок" идёт класс и 2 структуры для рисования простейших фигур отрезками (3 точки и 4 точки)
Пример рисования треугольника, у которого каждая сторона будет окрашена разным цветом:
Code:
void ApplicationWindow::init() {
   this->header = (Dword)"Hello, World!";

   // Структура фигуры с тремя вершинами
   OffcutTriangle* tr = new OffcutTriangle;

   // Заполняем координаты вершин
   tr->v1.x = 0;
   tr->v1.y = 10;

   tr->v2.x = 100;
   tr->v2.y = 100;

   tr->v3.x = 200;
   tr->v3.y = 10;

   // Выполняем регистрацию созданных отрезков в классе окна
   OffcutFigure::draw(this, tr);
   
   // Меняем цвета отрезков, соединяющих вершины
   tr->o1->color = COLOR_RED;
   tr->o2->color = COLOR_GREEN;
   tr->o3->color = COLOR_BLUE;
}

Результат:
Image

попробую ещё сделать заливку фигуры цветом

Author:  Nikolai1 [ Fri Jan 09, 2015 11:13 pm ]
Post subject:  Re: Создание приложений на классах

- Добавлен класс Application
- Добавлен элемент интерфейса "Отдельный пиксель"
new Pixel(10, 10, COLOR_RED);
- К элементу "Отрезок" добавлен класс OffcutCustomFigure, позволяющий рисовать из отрезков произвольную фигуру,
используя произвольное количество вершин
- Добавлен класс для удобной загрузки DLL
Code:
   dll* dl = new dll("/sys/lib/box_lib.obj");
   dl->exitOnError = false;

   if (!dl->load()) {
      // Ошибка загрузки
   }
   else {
      dword_func* edit_box_draw = (dword_func*)dl->loadFunction("edit_box");
      dword_func* edit_box_key= (dword_func*)dl->loadFunction("edit_box_key");
      dword_func* edit_box_mouse= (dword_func*)dl->loadFunction("edit_box_mouse");
   }


Снова принялся за BoxLib... :roll:

Author:  Nikolai1 [ Sat Jan 10, 2015 11:38 am ]
Post subject:  Re: Создание приложений на классах

Снова пробую вставить EditBox, вот что получилось:
Code:
EditBox* ebox = new EditBox(50, 50, 100);
this->addControl(ebox);


Image

#include "../../core.h"
#include "../../classes/events.h"

#include "init.h"
#include "editbox.h"

Класс EditBox'а
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:
   Dword id;
   Word x,y, width, left, top;
   Dword color, shift_color, focus_border_color, blur_border_color, text_color;
   Dword max;
   char text[256];

   Dword mouse_variable;
   Dword flags;
   Dword size, pos, offset;
   Dword cl_curs_x, cl_curs_y;
   Dword shift, shift_old;

   bool hidden;

   EditBoxStruct component;

   int type;

   EditBox(int x, int y, int width);

   void updateStruct();

   int getType();
   void draw();

   virtual int getId();
   virtual void sysevent(int code);
};

EditBox::EditBox(int x, int y, int size) {
   this->x = x;
   this->y = y;
   this->width = size;
   this->size = size;

   this->color = COLOR_RED;
   this->text_color = COLOR_BLACK;

   this->max = 255;

   //this->text = "Hello, world!";

   this->updateStruct();
}

void EditBox::updateStruct() {
   component.blur_border_color = this->blur_border_color;
   component.cl_curs_x = this->cl_curs_x;
   component.cl_curs_y = this->cl_curs_y;
   component.color = this->color;
   component.flags = this->flags;
   component.focus_border_color = this->focus_border_color;
   component.left = this->x;
   component.max = this->max;
   component.mouse_variable = (Dword)&this->mouse_variable;
   component.offset = this->offset;
   component.pos = this->pos;
   component.shift = this->shift;
   component.shift_color = this->shift_color;
   component.shift_old = this->shift_old;
   component.size = this->size;
   component.text = (Dword)&this->text;
   component.text_color = this->text_color;
   component.top = this->y;
   component.width = this->width;
}

void EditBox::draw() {
   if (!hidden) {
      BoxLib::edit_box_draw((Dword)&this->component);
   }
      //Dword mouse_dd;
      //char fname[256];
      //EditBoxStruct file_box = {200,100, 45, 0xffffff,0x6a9480, COLOR_RED, COLOR_YELLOW, 0x808080,255,(Dword)&fname,(Dword)&mouse_dd};
/**Dword width, left, top, color, shift_color, focus_border_color, blur_border_color,
text_color, max, text, mouse_variable*/
      //BoxLib::edit_box_draw((Dword)&file_box);
   this->call(EVENT_DRAW);
}

void EditBox::sysevent(int code) {
   switch (code) {
      case EVENT_KEY_PRESS:
         BoxLib::edit_box_key((Dword)&this->component);
      break;
   }

   BoxLib::edit_box_mouse((Dword)&this->component);
}

int EditBox::getType() {
   return CONTROL_EDIT_BOX;
}

int EditBox::getId() {
   return this->id;
}

Author:  Wildwest [ Sat Jan 10, 2015 12:47 pm ]
Post subject:  Re: Создание приложений на классах

Quote:
К элементу "Отрезок" добавлен класс OffcutCustomFigure, позволяющий рисовать из отрезков произвольную фигуру, используя произвольное количество вершин


Замкнутую фигуру? Тогда это называется http://en.wikipedia.org/wiki/Polygon

Author:  Nikolai1 [ Sat Jan 10, 2015 2:04 pm ]
Post subject:  Re: Создание приложений на классах

Wildwest wrote:
Тогда это называется http://en.wikipedia.org/wiki/Polygon

Ага, спасибо за поправку, исправлю недочёт

Author:  Nikolai1 [ Sat Jan 10, 2015 2:08 pm ]
Post subject:  Re: Создание приложений на классах

Подскажет кто-нибудь насчёт BoxLib.. Вопросы такие:
1. Ввод идёт с неверной кодировке, при вводе любого символа вводится символ ё
2. При нажатии клавиши BackSpace не удаляется символ, а вписывается ещё один, т.е. невозможно стереть введённый текст

А вот как думаете, возможно на C++ сделать элемент интерфейса самому, типа поля для ввода текста, чтобы не использовать никакие библиотеки?

Author:  punk_joker [ Sat Jan 10, 2015 4:30 pm ]
Post subject: 

При обработке EVENT_KEY_PRESS перед вызовом функции edit'а необходимо получить код нажатой клавиши (ф. 2)

Author:  Nikolai1 [ Sat Jan 10, 2015 5:02 pm ]
Post subject:  Re: Создание приложений на классах

Code:
   switch (code) {
      case EVENT_KEY_PRESS:
         Byte keyCode;
         kos_GetKey(keyCode);
         BoxLib::edit_box_key((Dword)&this->component);
      break;
   }

Не помогло

Author:  Nikolai1 [ Sat Jan 10, 2015 5:10 pm ]
Post subject:  Re: Создание приложений на классах

А если несколько раз создавать, такой эффект получается:
Image

При нажатии на любую клавишу в текстовое поле вводится один символ, но для каждого текстового поля он разный

Author:  punk_joker [ Sat Jan 10, 2015 5:21 pm ]
Post subject:  Re: Создание приложений на классах

kos_GetKey(keyCode);

__asm
{
mov ah, keyCode
}
edit_box_key((dword)&cell_box);
edit_box_key((dword)&file_box);

Author:  punk_joker [ Sat Jan 10, 2015 5:22 pm ]
Post subject: 

Только вместо последних двух строк
BoxLib::edit_box_key((Dword)&this->component);

Author:  Nikolai1 [ Sat Jan 10, 2015 5:36 pm ]
Post subject:  Re: Создание приложений на классах

Не работает :( а если в классе вместо char text[256] использовать char* text; , а потом инициализировать значением this->text = "Hello, world!";
то в текстовом поле текст "Hello, World!" выводится нормально, а при попытке отредактировать программа закрывается

Author:  Nikolai1 [ Sat Jan 10, 2015 5:50 pm ]
Post subject:  Re: Создание приложений на классах

в приложении Table работает же... что у меня нет так? уже все варианты перепробовал

Author:  pascualle [ Sat Jan 10, 2015 6:15 pm ]
Post subject:  Re: Создание приложений на классах

а где посмотреть весь код? попробую помочь

Author:  Nikolai1 [ Sat Jan 10, 2015 6:28 pm ]
Post subject:  Re: Создание приложений на классах

Прикрепил архив. Test.cpp - главный файл приложения, папка mylib - моя библиотека

Attachments:
lib.zip [18.99 KiB]
Downloaded 178 times

Page 4 of 5 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/