Автор: Vimil Saju

 

Чтобы добавить дополнительную кнопку, нам прийдётся создать обработчики для следующих событий:

WM_NCPAINT;//вызывается, когда перерисовывается не клиентская область формы

WM_NCACTIVATE; вызывается, когда заголовок формы становится активныи

WM_NCLBUTTONDOWN; вызывается, когда кнопка мыши нажимается на не клиентской области

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

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

WM_LBUTTONUP; вызывается, когда кнопка мыши отпушена в клиентской области

WM_NCLBUTTONUP; вызывается, когда кнопка мыши отпушена в не клиентской области

WM_NCLBUTTONDBLCLK; вызывается при двойном щелчке мышкой в не клиентской области

Автор: Christian Cristofori

 

В примере показывается, как изменять заголовок окна (видимый в списке задач при переключении между приложениями) при минимизации окна в иконку.

 

Сперва необходимо определить сообщение поумолчанию:

Code:

Const

DefMsgNorm = 'MyApp version 1.0';

DefMsgIcon = 'MyApp. (Use F12 to turn of)';

  

 

Создайте обработчик одного из сообщений WM_NC (non client - не клиентских) (посмотрите

WM_NC в Windows API help). Пример показывает как перехватить вижение мыши во всей

неклиенстской области окна (рамка и заголовок).

 

 

Note: The formDeactivate never gets called so when the form isn't active, sometimes the FormPaint isn't called. If anything causes the form to be repainted while in inactive, it draws correctly.

Примечание: formDeactivate никогда не вызывается, когда форма не активна, иногда FormPaint не называется. Если что-то вызывает форму, чтобы быть перекрашены в то время как в неактивном, он правильно рисует.

Автор: Fernando Silva

 

Пример показывает, как при инициализации формы происходит поиск нашего окна, а затем вычисление местоположения нужной нам кнопки в заголовке окна.

Code:

procedure TForm1.FormCreate(Sender: TObject);

var

hwndHandle: THANDLE;

hMenuHandle: HMENU;

iPos: Integer;

 

begin

hwndHandle := FindWindow(nil, PChar(Caption));

if (hwndHandle <> 0) then

begin

   hMenuHandle := GetSystemMenu(hwndHandle, FALSE);

   if (hMenuHandle <> 0) then

   begin

     DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND);

     iPos := GetMenuItemCount(hMenuHandle);

     Dec(iPos);

       { Надо быть уверенным, что нет ошибки т.к. -1 указывает на ошибку }

     if iPos > -1 then

       DeleteMenu(hMenuHandle, iPos, MF_BYPOSITION);

   end;

end;

end;