![]() |
![]() ![]() ![]() ![]() |
|
Добавляем дополнительную кнопку в заголовок формыDelphi , Программа и Интерфейс , Заголовок формы
Оформил: DeeCo Автор: Vimil Saju Чтобы добавить дополнительную кнопку, нам прийдётся создать обработчики
для следующих событий:
type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormCreate(Sender: TObject);
private { Private declarations
} public procedure
WMNCPAINT(var msg: tmessage); message WM_NCPAINT;
procedure WMNCACTIVATE(var
msg: tmessage); message WM_NCACTIVATE;
procedure
WMNCMOUSEDOWN(var msg: tmessage); message WM_NCLBUTTONDOWN;
procedure WMNCMOUSEMOVE(var
msg: tmessage); message WM_NCMOUSEMOVE;
procedure WMMOVE(var msg: tmessage); message
WM_MOUSEMOVE;
procedure WMLBUTTONUP(var
msg: tmessage); message WM_LBUTTONUP;
procedure
WMNCMOUSEUP(var msg: tmessage); message WM_NCLBUTTONUP;
procedure WNCLBUTTONDBLCLICK(var
msg: tmessage); message WM_NCLBUTTONDBLCLK;
end;
var
Form1: TForm1;
h1: thandle;
pressed: boolean;
focuslost: boolean;
rec: trect;
implementation{$R *.DFM}
procedure tform1.WMLBUTTONUP(var msg: tmessage);
begin
pressed := false;
invalidaterect(form1.handle, @rec, true);
inherited;
end;
procedure tform1.WMMOVE(var msg: tmessage);
var
tmp: boolean
begin
tmp := focuslost;
focuslost := true;
if tmp <> focuslost then
invalidaterect(form1.handle, @rec, true);
inherited;
end;
procedure tform1.WMNCMOUSEMOVE(var msg: tmessage);
var
pt1: tpoint;
tmp: boolean;
begin
tmp := focuslost;
pt1.x := msg.LParamLo - form1.left;
pt1.y := msg.LParamHi - form1.top;
if not (ptinrect(rec, pt1)) then
focuslost := true
else
focuslost := false;
if tmp <> focuslost then
invalidaterect(form1.handle, @rec, true);
end;
procedure tform1.WNCLBUTTONDBLCLICK(var msg: tmessage);
var
pt1: tpoint;
begin
pt1.x := msg.LParamLo - form1.left;
pt1.y := msg.LParamHi - form1.top;
if not (ptinrect(rec, pt1)) then
inherited;
end;
procedure
tform1.WMNCMOUSEUP(var msg: tmessage);
var
pt1: tpoint;
begin
pt1.x := msg.LParamLo - form1.left;
pt1.y := msg.LParamHi - form1.top;
if (ptinrect(rec, pt1)) and (focuslost = false) then
begin
pressed := false; {
enter your code here when the button is
clicked }
invalidaterect(form1.handle, @rec, true);
end
else
begin
pressed := false;
focuslost := true;
inherited;
end;
end;
procedure tform1.WMNCMOUSEDOWN(var msg: tmessage);
var
pt1: tpoint;
begin
pt1.x := msg.LParamLo - form1.left;
pt1.y := msg.LParamHi - form1.top;
if ptinrect(rec, pt1) then
begin
pressed := true;
invalidaterect(form1.handle, @rec, true);
end
else
begin
form1.paint;
inherited;
end;
end;
procedure
tform1.WMNCACTIVATE(var msg: tmessage);
begin
invalidaterect(form1.handle, @rec, true);
inherited;
end;
procedure tform1.WMNCPAINT(var msg: tmessage);
begin
invalidaterect(form1.handle, @rec, true);
inherited;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
h1 := getwindowdc(form1.handle);
rec.left := form1.width - 75;
rec.top := 6;
rec.right := form1.width - 60;
rec.bottom := 20;
selectobject(h1, getstockobject(ltgray_BRUSH));
rectangle(h1, rec.left, rec.top, rec.right, rec.bottom);
if
(pressed = false) or (focuslost = true) then
drawedge(h1, rec, EDGE_RAISED, BF_RECT)
else if
(pressed = true) and (focuslost = false) then
drawedge(h1, rec, EDGE_SUNKEN, BF_RECT);
releasedc(form1.handle, h1);
end;
procedure
TForm1.FormResize(Sender: TObject);
begin
form1.paint;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
rec.left := 0;
rec.top := 0;
rec.bottom := 0;
rec.right := 0;
end;
Комментарии
специалистов:
Дата: 25 Августа 2000г. InvalidateRect на событие Resize ничего не даёт. Но даже без
него
procedure
TMainForm.FormPaint(Sender:
TObject);
var
h1: THandle;
begin
h1 := GetWindowDC(MainForm.Handle);
rec := Rect(MainForm.Width - 75, 6, MainForm.Width - 60, 20);
if
Pressed and not FocusLost then
DrawFrameControl(h1, rec, DFC_BUTTON,
DFCS_BUTTONPUSH or DFCS_PUSHED)
else
DrawFrameControl(h1, rec,
DFC_BUTTON,
DFCS_BUTTONPUSH);
ReleaseDC(MainForm.Handle, h1);
end;
Но
вообще-то рисовать эту кнопку надо только при WM_NCPAINT, а
невсегда... И вычислять координаты по другому... Вдруг размер элементов заголовка у юзера в системе не стандартный? А это просто настраивается... Добавляем дополнительную кнопку в заголовок формы, создавая обработчики для событий WM_NCPAINT, WM_NCACTIVATE и других. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш :: Главная :: Заголовок формы ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 | ||||