Page 4 of 5
Re: Создание приложений на классах
Posted: Thu Jan 08, 2015 10:40 pm
by Nikolai1
Добавил ещё 2 элемента интерфейса: "Число" и "Отрезок"
Создание элемента числа:
Code: Select all
NumberLabel* num = new NumberLabel(25);
Создание отрезка из точки (10, 10) в точку (20, 20):
Code: Select all
Offcut* of1 = new Offcut(10, 10, 20, 20);
Вместе с элементом "Отрезок" идёт класс и 2 структуры для рисования простейших фигур отрезками (3 точки и 4 точки)
Пример рисования треугольника, у которого каждая сторона будет окрашена разным цветом:
Code: Select all
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;
}
Результат:
попробую ещё сделать заливку фигуры цветом
Re: Создание приложений на классах
Posted: Fri Jan 09, 2015 11:13 pm
by Nikolai1
- Добавлен класс Application
- Добавлен элемент интерфейса "Отдельный пиксель"
new Pixel(10, 10, COLOR_RED);
- К элементу "Отрезок" добавлен класс OffcutCustomFigure, позволяющий рисовать из отрезков произвольную фигуру,
используя произвольное количество вершин
- Добавлен класс для удобной загрузки DLL
Code: Select all
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...
Re: Создание приложений на классах
Posted: Sat Jan 10, 2015 11:38 am
by Nikolai1
Снова пробую вставить EditBox, вот что получилось:
Code: Select all
EditBox* ebox = new EditBox(50, 50, 100);
this->addControl(ebox);
#include "../../core.h"
#include "../../classes/events.h"
#include "init.h"
#include "editbox.h"
Класс EditBox'а
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:
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;
}
Re: Создание приложений на классах
Posted: Sat Jan 10, 2015 12:47 pm
by Wildwest
К элементу "Отрезок" добавлен класс OffcutCustomFigure, позволяющий рисовать из отрезков произвольную фигуру, используя произвольное количество вершин
Замкнутую фигуру? Тогда это называется
http://en.wikipedia.org/wiki/Polygon
Re: Создание приложений на классах
Posted: Sat Jan 10, 2015 2:04 pm
by Nikolai1
Ага, спасибо за поправку, исправлю недочёт
Re: Создание приложений на классах
Posted: Sat Jan 10, 2015 2:08 pm
by Nikolai1
Подскажет кто-нибудь насчёт BoxLib.. Вопросы такие:
1. Ввод идёт с неверной кодировке, при вводе любого символа вводится символ ё
2. При нажатии клавиши BackSpace не удаляется символ, а вписывается ещё один, т.е. невозможно стереть введённый текст
А вот как думаете, возможно на C++ сделать элемент интерфейса самому, типа поля для ввода текста, чтобы не использовать никакие библиотеки?
Posted: Sat Jan 10, 2015 4:30 pm
by punk_joker
При обработке EVENT_KEY_PRESS перед вызовом функции edit'а необходимо получить код нажатой клавиши (ф. 2)
Re: Создание приложений на классах
Posted: Sat Jan 10, 2015 5:02 pm
by Nikolai1
Code: Select all
switch (code) {
case EVENT_KEY_PRESS:
Byte keyCode;
kos_GetKey(keyCode);
BoxLib::edit_box_key((Dword)&this->component);
break;
}
Не помогло
Re: Создание приложений на классах
Posted: Sat Jan 10, 2015 5:10 pm
by Nikolai1
А если несколько раз создавать, такой эффект получается:
При нажатии на любую клавишу в текстовое поле вводится один символ, но для каждого текстового поля он разный
Re: Создание приложений на классах
Posted: Sat Jan 10, 2015 5:21 pm
by punk_joker
kos_GetKey(keyCode);
__asm
{
mov ah, keyCode
}
edit_box_key((dword)&cell_box);
edit_box_key((dword)&file_box);
Posted: Sat Jan 10, 2015 5:22 pm
by punk_joker
Только вместо последних двух строк
BoxLib::edit_box_key((Dword)&this->component);
Re: Создание приложений на классах
Posted: Sat Jan 10, 2015 5:36 pm
by Nikolai1
Не работает
а если в классе вместо char text[256] использовать char* text; , а потом инициализировать значением this->text = "Hello, world!";
то в текстовом поле текст "Hello, World!" выводится нормально, а при попытке отредактировать программа закрывается
Re: Создание приложений на классах
Posted: Sat Jan 10, 2015 5:50 pm
by Nikolai1
в приложении Table работает же... что у меня нет так? уже все варианты перепробовал
Re: Создание приложений на классах
Posted: Sat Jan 10, 2015 6:15 pm
by pascualle
а где посмотреть весь код? попробую помочь
Re: Создание приложений на классах
Posted: Sat Jan 10, 2015 6:28 pm
by Nikolai1
Прикрепил архив. Test.cpp - главный файл приложения, папка mylib - моя библиотека