воскресенье, 12 октября 2008 г.

WinAPI: Perform. Отправка сообщений форме.

Очень часто в программе необходимо сделать перемещение окна за её поле. Или же если вы сделали скин к приложению, натянув на него рисунок и спрятав рамку окна. Сделать это можно так:

procedure TForm1.MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
const SC_DragMove = $F012; 
begin 
ReleaseCapture; 
perform(WM_SysCommand, SC_DragMove, 0); 
end;


Этот код применим ко всем визуальным компонентам Delphi. Он позволяет перемешать НЕ ОБЪЕКТ по форме, а форму в целом по рабочему столу. Ниже ещё один способ.

Данный метод описан в технической информации (TI) Borland и бывает полезен если ваша форма не имеет области заголовка (синей полосы вверху). У такой формы свойство BorderStyle установлено равным bsNone. Самый просотой способ заключается в том, чтобы заставить Windows думать, что произошло нажатие в области заголовка окна, когда происходит нажатие в клиентской области. Это можно сделать, добавив собственный обработчик события wm_NCHitTest. Откройте модуль вашей формы и добавьте следующее описание в разделе private:

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);


Процедура названа так в соответствии с соглашениями об именах в Windows, но вы можете изменить название, если вам захочется. Теперь в разделе implementation опишем код процедуры.

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited;
//вызываем стандартный обработчик 
if M.Result = htClient then 
M.Result := htCaption;
end;



Обратите внимание, что в начале вызывается стандартный обработчик. Кроме перемещения формы, добавьте возможность завершения программы в виде кнопки или пункта меню, так как пользователь не сможет закрыть ее при помощи заголовка окна или системного меню.

Комментариев нет: