Mit Delphi möchte ich eine weitere Schaltfläche zu den Rahmensymbolschaltflächen hinzufügen; schließen, maximieren, minimieren. Irgendwelche Ideen, wie man das macht?Hinzufügen eines Rahmensymbols zum Formular
Antwort
Dies war vor Windows Aero einfach zu tun. Sie mussten einfach die Nachrichten WM_NCPAINT
und WM_NCACTIVATE
hören, die über die Titelleiste gezeichnet wurden, und in ähnlicher Weise könnten Sie die anderen WM_NC*
Nachrichten verwenden, um auf Mausklicks usw. zu reagieren, insbesondere WM_NCHITTEST
, WM_NCLBUTTONDOWN
und WM_NCLBUTTONUP
.
Zum Beispiel eine Zeichenfolge auf der Titelleiste ziehen, mußte man nur
tutunit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
protected
procedure WMNCPaint(var Msg: TWMNCPaint); message WM_NCPAINT;
procedure WMNCActivate(var Msg: TWMNCActivate); message WM_NCACTIVATE;
private
procedure DrawOnCaption;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.WMNCActivate(var Msg: TWMNCActivate);
begin
inherited;
DrawOnCaption;
end;
procedure TForm1.WMNCPaint(var Msg: TWMNCPaint);
begin
inherited;
DrawOnCaption;
end;
procedure TForm1.DrawOnCaption;
var
dc: HDC;
begin
dc := GetWindowDC(Handle);
try
TextOut(dc, 20, 2, 'test', 4);
finally
ReleaseDC(Handle, dc);
end;
end;
end.
Nun, dies funktioniert nicht mit Aero aktiviert. Dennoch gibt es eine Möglichkeit, die Beschriftungsleiste zu zeichnen. Ich habe das gemacht, aber es ist viel komplizierter. Ein Arbeitsbeispiel finden Sie unter this article.
Ja, legen Sie die border style-Eigenschaft des Formulars auf bsNone fest und implementieren Sie Ihre eigene Titelleiste mit allen Schaltflächen und benutzerdefiniertem Verhalten, die Sie mögen.
Chris Rolliston hat einen ausführlichen Blog über creating a custom title bar on Vista and Windows 7 geschrieben.
Er schrieb auch eine follow up article und veröffentlichte Beispielcode auf CodeCentral.