With default Windows settings, accelerator keys are not meant to be shown on dialogs until the user presses the ALT key.
Delphi\'s TLabel
control
I think I've worked out a way of handling it.
function HideAccelFlag(Control: TControl): Integer;
begin
//ask the top level window about its UI state
while Assigned(Control.Parent) do begin
Control := Control.Parent;
end;
if (Control.Perform(WM_QUERYUISTATE, 0, 0) and UISF_HIDEACCEL)=UISF_HIDEACCEL then begin
Result := DT_HIDEPREFIX;
end else begin
Result := 0;
end;
end;
type
TUIStateAwareLabel = class(TLabel)
protected
procedure DoDrawText(var Rect: TRect; Flags: Longint); override;
end;
procedure TUIStateAwareLabel.DoDrawText(var Rect: TRect; Flags: Integer);
begin
if ShowAccelChar then begin
Flags := Flags or HideAccelFlag(Self);
end;
inherited;
end;
I make sure that I always create TUIStateAwareLabel
rather than TLabel
by hooking the form streaming mechanism with TReader.OnFindComponentClass
.
Dealing with TCustomGroupBox
descendents is more messy. For them I resorted to copying the source code of TCustomGroupBox.Paint
into my descendent and making use of HideAccelFlag
again.
Next task is to write it up as a QC report.