Secara normal hanya terdapat tiga tombol pada title bar, yaitu tombol maximize, minimize, dan close. Jika Anda menginginkan untuk menambahkan button pada title bar, jawabnya bisa. Untuk dapat menambahkan dan memfungsikan tombol tersebut ada beberapa message atau pesan yang perlu dilibatkan, yaitu:
- WM_NCPAINT adalah pesan yang dikirim untuk menggambar ulang title bar termasuk tombol tambahan.
- WM_NCACTIVATE adalah pesan yang dikirim saat nonclient area perlu diubah untuk mengindikasikan keadaan aktif dan nonaktif.
- WM_NCHITTEST adalah pesan yang dikirim saat cursor digerakkan (dipindah) atau tombol mouse ditekan.
- WM_NCLBUTTONDOWN adalah pesan yang dikirim saat pengguna menekan tombol kiri mouse.
- WM_NCLBUTTONUP adalah pesan yang dikirim saat pengguna melepaskan tombol kiri mouse.
Untuk menggambar tombol pada title bar Anda dapat menggunakan fungsi DrawButtonFace.
Berikut adalah listing lengkapnya:
unit UMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Buttons; type TForm1 = class(TForm) procedure FormResize(Sender: TObject); private { Private declarations } CaptionBtn: TRect; procedure DrawCaptButton; procedure WMNCPaint(var Msg: TWMNCPaint); message WM_NCPaint; procedure WMNCActivate(var Msg: TWMNCActivate); message WM_NCACTIVATE; procedure WMSetText(var Msg: TWMSetText); message WM_SETTEXT; procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST; procedure WMNCLButtonDown(var Msg: TWMNCLButtonDown); message WM_NCLBUTTONDOWN; public { Public declarations } end; var Form1: TForm1; implementation const htCaptionBtn = htSizeLast + 1; {$R *.dfm} procedure TForm1.DrawCaptButton; var xFrame, yFrame, xSize, ySize: Integer; R: TRect; begin xFrame:= GetSystemMetrics(SM_CXFRAME); yFrame:= GetSystemMetrics(SM_CYFRAME); xSize:= GetSystemMetrics(SM_CXSIZE); ySize:= GetSystemMetrics(SM_CYSIZE); CaptionBtn:= Bounds(Width - xFrame - 4*xSize + 2, yFrame + 2, xSize - 2, ySize - 4); Canvas.Handle:= GetWindowDC(Self.Handle); Canvas.Font.Name:= 'Symbol'; Canvas.Font.Color:= clBlue; Canvas.Font.Style:= [fsBold]; Canvas.Pen.Color:= clYellow; Canvas.Brush.Color:= clBtnFace; try DrawButtonFace(canvas, CaptionBtn, 1, bsAutoDetect, False, False, False); R:= Bounds(Width - xFrame - 4*xSize + 2, yFrame + 3, xSize - 6, ySize - 7); with CaptionBtn do canvas.TextRect(R, R.Left + 2, R.Top - 1, 'W'); finally ReleaseDC(Self.Handle, Canvas.Handle); Canvas.Handle:= 0; end; end; procedure TForm1.WMNCPaint(var Msg: TWMNCPaint); begin inherited; DrawCaptButton; end; procedure TForm1.FormResize(Sender: TObject); begin Perform(WM_NCACTIVATE, Word(Active), 0); end; procedure TForm1.WMNCActivate(var Msg: TWMNCActivate); begin inherited; DrawCaptButton; end; procedure TForm1.WMSetText(var Msg: TWMSetText); begin inherited; DrawCaptButton; end; procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest); begin inherited; with Msg do if PtInRect(CaptionBtn, Point(XPos - Left, YPos - Top)) then Result:= htCaptionBtn; end; procedure TForm1.WMNCLButtonDown(var Msg: TWMNCHitMessage); begin inherited; if (Msg.HitTest = htCaptionBtn) then Application.MessageBox('You clicked the button', 'Message', MB_OK or MB_ICONASTERISK); end; end.
Comments
Post a Comment