Einzelnen Beitrag anzeigen

SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#4

AW: Kontextsensitive Hilfe / biHelp-Button trotz Minimize-Button?

  Alt 20. Dez 2015, 14:08
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.

Dann mach es so:
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;

Geändert von SMO (20. Dez 2015 um 14:24 Uhr)
  Mit Zitat antworten Zitat