unit Unit1;
interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ExtCtrls, StdCtrls;
const
wm_BtnClk = wm_User + 111;{Определяем своё сообщение}type
TForm1 = class(TForm)
procedure FormDestroy(Sender: TObject);
private{ Private declarations }
R: TRect;{Переменная для обозначения прямоугольной области кнопки}
Press: Boolean;
procedure WmNcPaint(var Msg: TWmNcPaint); message wm_NcPaint;
procedure WMNcActivate(var msg: TwmncActivate); message wm_NcActivate;
procedure WmNcLButtonDown( var Msg: TWMNCLBUTTONDOWN); message Wm_NCLbuttonDown;
procedure wmnchittest(var Msg: TWMncHITTEST); message wm_NcHittest;
procedure wmSize(var Msg: TMessage); message wm_Size;
procedure wmncLButtonUp(var msg: TWMncLBUTTONUP); message wm_NclButtonUp;
procedure wmLbuttonUp(var Msg: TMessage); message wm_LbuttonUp;
procedure wmBtnClk(var msg: TMessage); message wm_BtnClk;
public{ Public declarations }procedure DrawBtn;
end;
var
Form1: TForm1;
implementation{$R *.DFM}{ TForm1 }procedure TForm1.WmNcPaint(var Msg: TWmNcPaint);
begininherited;
Drawbtn;{При перерисовке окна прорисовываем кнопку}end;
procedure TForm1.DrawBtn;{Код прорисовки кнопки}var
WDc: HDc;
Cx, Cy: Integer;
XFrame, Yframe: Integer;
begin{Получаем контекст нашего окна, снимаем мерки с оконных размеров,
вычисляем положение нашей кнопки и прорисовываем её в зависимости
от того нажата ли кнопка мыши над ней}
WDc := GetWindowDc(Handle);
Cx := GetSystemMetrics(SM_CXSize);
Cy := GetSystemMetrics(SM_CYSize);
xFrame := GetSystemMetrics(SM_CXFrame);
yFrame := GetSystemMetrics(SM_CYFrame);
R := Bounds(Width - xFrame - 4*Cx + 2, yFrame + 2, Cx - 2, Cy - 4);
if Press then
DrawFrameControl(WDc,R,DFC_BUTTON,DFCS_ButtonPUSH or DFCS_PUSHED)
else
DrawFrameControl(WDc,R,DFC_BUTTON,DFCS_ButtonPUSH);
ReleaseDc(Handle,WDC);
end;
procedure TForm1.WMNcActivate(var msg: TwmncActivate);
begininherited;
DrawBtn;
end;
procedure TForm1.WmNcLButtonDown(var Msg: TWMNCLBUTTONDOWN);
var
pt: TPoint;
begininherited;
drawbtn;
pt := Point(msg.XCursor - Left,msg.YCursor - top);
if PtInRect(R,pt) thenbegin
Press := True;
drawbtn;
end;
end;
procedure TForm1.wmnchittest(var Msg: TWMncHITTEST);
var
pt: tpoint;
begininherited;
pt :=Point(msg.XPos - Left, msg.YPos - Top);
if PtinRect(r,pt) then
msg.Result := htBorder;
end;
procedure TForm1.wmSize(var Msg: TMessage);
begininherited;
RedrawWindow(Handle, PRect(0), 0, RDW_FRAME or RDW_NOINTERNALPAINT
or RDW_INVALIDATE);
end;
procedure TForm1.wmncLButtonUp(var msg: TWMncLBUTTONUP);
var
pt: TPoint;
begininherited;
pt := Point(msg.XCursor - Left,msg.YCursor - top);
if PtInRect(R,pt) thenbegin
Press := False;
drawbtn;
PostMessage(Handle,wm_btnClk,0,0);
end;
end;
procedure TForm1.wmLbuttonUp(var Msg: TMessage);
begininherited;
if Press thenbegin
Press := False;
DrawBtn;
end;
end;
procedure TForm1.wmBtnClk(var msg: TMessage);
begin{Объявили константу своего сообщения,
посылаем его своему окну при отпускании кнопки мыши над новой кнопкой,
а здесь обрабатываем своё сообщение}
ShowMessage('О, круто, наша кнопка нажимается! Спасибо проекту Delphi World!');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
RedrawWindow(Handle, PRect(0), 0, RDW_FRAME or RDW_NOINTERNALPAINT
or RDW_INVALIDATE);
end;
end.
Вот перевод текста на русский язык:
Это проект программирования Delphi, который создает пользовательский кнопку на панели заголовка окна. Кнопка рисуется с помощью функций Windows API и реагирует на клики мыши.
Вот разбивка кода:
Первая секция объявляет константы, типы, переменные и процедуры для основной формы (TForm1).
В разделе interface проект использует различные библиотеки Delphi, включая Windows, Messages, SysUtils и другие.
В разделе type класс TForm1 определяется как наследник от TForm. Он имеет несколько приватных процедур для обработки сообщений окна, таких как WmNcPaint, WMNcActivate, WmNcLButtonDown и другие.
Процедура DrawBtn рисует пользовательскую кнопку на панели заголовка окна.
Основные процедуры в этом коде:
WmNcPaint: Вызывается при перерисовке окна, она перерисовывает пользовательскую кнопку.
WMNcActivate: Вызывается при активации или деактивации окна, она перерисовывает пользовательскую кнопку.
WmNcLButtonDown: Обрабатывает клики мыши на панели заголовка. Если клик происходит внутри границ пользовательской кнопки, она устанавливает флаг (Press) в значение true, указывая, что кнопка нажата.
wmnchittest: Обрабатывает сообщения окна, связанные с панелью заголовка. Она проверяет, произошел ли клик внутри границ пользовательской кнопки, и возвращает результат теста соответствия.
wmSize: Вызывается при изменении размера окна, она инвалидирует окно, чтобы вызвать перерисовку.
wmncLButtonUp: Обрабатывает освобождение мыши на панели заголовка. Если освобождение происходит внутри границ пользовательской кнопки и флаг (Press) имеет значение true (показывая, что кнопка была нажата), она устанавливает флаг в false и отправляет сообщение (wm_btnClk) программе, уведомляя о том, что кнопка была кликнута.
Процедура FormDestroy вызывается при уничтожении формы. Она инвалидирует окно, чтобы обеспечить обработку любых pending перерисовок перед закрытием формы.
В целом, этот код демонстрирует, как создать пользовательскую кнопку на панели заголовка Delphi-приложения и реагировать на клики мыши и другие события.
Четвёртая кнопка на заголовочной полосе окна - это пример программирования на языке Delphi, которая создает кнопку на заголовочной полосе окна и обрабатывает события нажатия и отпускания кнопки.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.