Zitat:
biHelp [....] Werden die Konstanten biMinimize und biMaximize nicht angegeben, erscheint in der Titelleiste ein Fragezeichen. Ansonsten wird kein Fragezeichen angezeigt.
Nun, das stimmt nicht ganz: Bei aktiviertem Minimize-Button wird dieser Fragezeichen-Button doch wenigstens angezeigt, ist jedoch leider nicht bedienbar, biMaximize läßt ihn, wie beschrieben, hingegen gänzlich verschwinden.
Doch, das stimmt, jedenfalls bei mir in Delphi XE6 und Windows 8.1. Welche Version benutzt du?
Der entsprechende Code ist in der
Unit Vcl.Forms zu finden:
Delphi-Quellcode:
procedure TFormStyleHook.PaintNC(Canvas: TCanvas);
// ...
if (biHelp in Form.BorderIcons) and (biSystemMenu in Form.BorderIcons) and
((not (biMaximize in Form.BorderIcons) and
not (biMinimize in Form.BorderIcons)) or (Form.BorderStyle = bsDialog))
then
// ...
Damit biHelp beachtet wird, muss also immer biSystemMenu gesetzt sein. Weder biMaximize noch biMinimize dürfen gesetzt sein, es sei denn BorderStyle ist bsDialog, da werden biMaximize und biMinimize einfach ignoriert.
Ist dieses einschränkende Verhalten windows-bedingt oder eine Schwäche der
VCL?
Windows, siehe MSDN.
biHelp entspricht dem Extended Style Flag WS_EX_CONTEXTHELP:
"WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles."
Kann man das irgendwie überlisten? Ich hätte nämlich gern den Minimize- und Help-Button, natürlich beide bedienbar.
Klar, du kannst komplett eigene Elemente in die Titelleiste von Fenstern setzen/malen. Wie das genau geht kann ich dir leider nicht erklären, und es scheint auch darauf anzukommen, ob du für alte Windows-Versionen (XP und älter), oder für neuere mit Desktop Window Manager (DWM, seit Vista) programmierst.
Hier weitere Informationen.
Wieso nicht mit case? Außerdem halte ich Application.Terminate für nicht angebracht, es sei denn man möchte wirklich das Programm beenden und nicht das aktuelle Fenster schließen. Für Anwendungen mit nur einem Fenster läuf das aufs Selbe hinaus, nicht aber für Anwendungen mit mehreren Fenstern.
Delphi-Quellcode:
procedure TForm1.WMNCLButtonDown(var Message: TWMNCLButtonDown);
begin
case Message.HitTest of
HTCAPTION: WindowState:= wsMinimized;
// HTCLOSE: Close; // kann man sich sparen, ist die Standardaktion
HTHELP: begin ShowMessage('hello world'); Message.Result := 0; end
else
inherited;
end;
end;