Создание GUI. События, делегаты

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Создание GUI. События, делегаты

Сообщение KUKA » 18.07.2013 17:41:29

Мне в проекте необходимо реализовать свой gui. Элементов всего немного там разве что кнопочки да текстовые поля.
Допустим класс кнопки у меня выглядит так

Код: Выделить всё
TButton = class
protected
  width, height : word;
  visible : boolean;
  positionX, positionY : integer;
  baseTexture, hoverTexture, clickedTexture: PGLUInt;
public
  Constructor Create();

  procedure SetPosition( x, y : integer);
  procedure ChangeVisibility( visibility : boolean );
  function GetPositionX(): integer;
  function GetPositionY(): integer;
  procedure SetSize( width, height: integer);
  function GetWidth(): word;
  function GetHeight(): word;
  procedure Over();
  procedure Click();
  procedure MouseDown();
end;


Соответственно в методах Click, MouseDown, Over должны выполняться какие-то мои функции. Скорее всего будет удобно, если в событиях WinAPI, на соотвествующие события типа WM_LMOUSEDOWN, WM_MOUSEMOVE ... будет обработчик, который будет рассылать всем моим кнопочкам информацию о координатах, а собственный метод бы вызывался каждый раз. Как-то так.
Свои же функции передавать через делегат параметрам классам. В общем идея такая.
Как стоит организовать класс, что бы получить систему обработки сообщений как допустим в том же Delphi?
KUKA
новенький
 
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Re: Создание GUI. События, делегаты

Сообщение SeZuka » 19.07.2013 08:38:07

А чем вас лазарус не устраивает, зачем очередной велосипед?
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Создание GUI. События, делегаты

Сообщение Лекс Айрин » 19.07.2013 08:44:10

SeZuka, видимо, хочет сэкономить размер файла или сделать какие-то необычные кнопки.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Создание GUI. События, делегаты

Сообщение SeZuka » 19.07.2013 09:06:53

Лекс Айрин писал(а):видимо, хочет сэкономить размер файла или сделать какие-то необычные кнопки

Если для экономии размера, то для
KUKA писал(а):Элементов всего немного там разве что кнопочки да текстовые поля
это проще сделать на чистом WinAPI, без всяких объектов.
А если необычные кнопочки, то это и в лазарусе можно.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Создание GUI. События, делегаты

Сообщение Лекс Айрин » 19.07.2013 09:38:05

SeZuka писал(а):проще сделать на чистом WinAPI, без всяких объектов.

вот примерно это, имхо, он и хочет. С циклом обработки сообщений.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Создание GUI. События, делегаты

Сообщение KUKA » 27.07.2013 06:14:38

Обработка сообщений естественно через WinAPI, сам GUI внутрипрограммный, рендерится по-своему
KUKA
новенький
 
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Re: Создание GUI. События, делегаты

Сообщение SeZuka » 27.07.2013 10:03:50

KUKA писал(а):Как стоит организовать класс, что бы получить систему обработки сообщений как допустим в том же Delphi?

Да так же как и в том же лазарусе.
Используйте уже готовую систему обработки сообщений от TObject, создаете свой класс от него:
Код: Выделить всё
  TButton = class(TObject)
  private
    procedure WMRClick(var Message: TMessage); message WM_RBUTTONUP;
    procedure WMLBUTTONDBLCLK(var Message: TMessage); message WM_LBUTTONDBLCLK;
  ...
  end;

В Create класса делаете RegisterClass и CreateWindow, затем любым способом связываете полученный Handle окна с самим объектом.
Затем в вашей самописанной процедуре обработки сообщений WinAPI
Код: Выделить всё
function WndProc(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
упаковываете все полученные параметры в TMessage, находите по HWND связанный с ним объект и отправляете этому объекту сообщение
Код: Выделить всё
Obj.Dispatch(Message);
если это был двойной клик левой кнопкой, то сработает процедура WMLBUTTONDBLCLK вашего объекта, там уже делаете что хотите по этому событию.
Как-то так вкратце.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru