TLabel displays accelerator keys even when the UI state says not to

后端 未结 3 627
故里飘歌
故里飘歌 2021-02-09 09:35

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

3条回答
  •  旧巷少年郎
    2021-02-09 10:12

    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.

提交回复
热议问题