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;
}
Результат:
Image

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

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... :roll:

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);
Image

#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
Wildwest wrote:Тогда это называется http://en.wikipedia.org/wiki/Polygon
Ага, спасибо за поправку, исправлю недочёт

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
А если несколько раз создавать, такой эффект получается:
Image

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

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 - моя библиотека