Delphi 如何为'TBitBtn'设置'ElevationRequired'`

Delphi 如何为'TBitBtn'设置'ElevationRequired'`,delphi,delphi-xe4,Delphi,Delphi Xe4,我需要标记一个按钮动作需要提升的TBitBtn(而不是TButton)。我将ElevationRequired设置为True,但没有获得盾牌图标 要复制,请在表单上放置TButton和TBitBtn: procedure TForm1.FormCreate(Sender: TObject); begin Button1.ElevationRequired := True; BitBtn1.ElevationRequired := True; end; 按钮1与屏蔽图标一起显示,

我需要标记一个按钮动作需要提升的
TBitBtn
(而不是
TButton
)。我将
ElevationRequired
设置为True,但没有获得盾牌图标

要复制,请在表单上放置
TButton
TBitBtn

procedure TForm1.FormCreate(Sender: TObject);
begin
    Button1.ElevationRequired := True;
    BitBtn1.ElevationRequired := True;
end;
按钮1
与屏蔽图标一起显示,
位BTN1
不显示。

这是不可能的

VCL是一个Win32控件。你可以在这里看到:

过程TBitBtn.CreateParams(变量参数:TCreateParams);
开始
继承的CreateParams(Params);
使用参数do Style:=Style或BS_OWNERDRAW;
结束;
因此,
TBitBtn
不是由Windows绘制的,而是由
Vcl.Buttons.pas
中的Pascal代码手动绘制的。具体来说,
TBitBtn.DrawItem(const DrawItemStruct:TDrawItemStruct)
进行绘制

在这里,您可以看到没有提到
ElevationRequired

因此,
TBitBtn
不支持此功能

一般来说,不要使用
TBitBtn
;使用
t按钮
获取本机Win32按钮。

这是不可能的

VCL是一个Win32控件。你可以在这里看到:

过程TBitBtn.CreateParams(变量参数:TCreateParams);
开始
继承的CreateParams(Params);
使用参数do Style:=Style或BS_OWNERDRAW;
结束;
因此,
TBitBtn
不是由Windows绘制的,而是由
Vcl.Buttons.pas
中的Pascal代码手动绘制的。具体来说,
TBitBtn.DrawItem(const DrawItemStruct:TDrawItemStruct)
进行绘制

在这里,您可以看到没有提到
ElevationRequired

因此,
TBitBtn
不支持此功能


一般来说,不要使用
TBitBtn
;使用
TButton
获取本机Win32按钮。

因为
TBitBtn
未实现
relationrequired
(请参阅)。我最终通过以下步骤绘制了屏蔽图标(Vista+:

需要程序标记提升(ABitBtn:TBitBtn);
变量
图标:提康;
开始
断言(赋值(ABitBtn));
//---
尝试
图标:=TIcon.Create;
尝试
Icon.Handle:=GetSystemIcon(SIID_SHIELD,TSystemIconSize.Small)//请参阅WinApi.ShellApi
符号分配(图标);
最后
图标。免费;
结束;
除了

//CreateSystemIcon为引发异常,因为
TBitBtn
未实现
所需提升
(请参阅)。我最终通过以下步骤绘制了屏蔽图标(Vista+:

需要程序标记提升(ABitBtn:TBitBtn);
变量
图标:提康;
开始
断言(赋值(ABitBtn));
//---
尝试
图标:=TIcon.Create;
尝试
Icon.Handle:=GetSystemIcon(SIID_SHIELD,TSystemIconSize.Small)//请参阅WinApi.ShellApi
符号分配(图标);
最后
图标。免费;
结束;
除了

//CreateSystemIcon为一个明显的问题抛出了一个异常:为什么是TBitBtn?TButton中缺少什么?
LevationRequired
属性没有为
TBitBtn
发布,因此我猜这种按钮不支持该功能。@uwerabe我尝试操作使用JVCLs
JvDSADialogs.CreateDSAMessageForm
创建的表单
CreateDSAMessageForm
在内部使用
TBitBtn
。明显的问题是:为什么使用TBitBtn?TButton中缺少什么?
LevationRequired
属性没有为
TBitBtn
发布,因此我猜这种按钮不支持该功能。@uwerabe我尝试操作使用JVCLs
JvDSADialogs.CreateDSAMessageForm
创建的表单
CreateDSAMessageForm
内部使用
TBitBtn
。我同意Andreas的观点。不要期望此功能在
TBitBtn
上工作
TBitBtn
实际上留在Delphi中,以便与用遗留代码编写的程序向后兼容。您可以看到,在第一个Delphi版本的日子里,标准的
TButton
不支持显示任何图标。只有一个简单的标题。只有在以后,标准的
t按钮才能通过同时显示图标的功能进行扩展。但是
TBitBtn
被保留了下来,所以即使在现代Delphi版本上,您仍然可以编译旧的遗留程序。如果你被迫使用
TBitBtn
的话,你为什么不自己设计一些已经包含屏蔽的自定义图标,并使用它们来代替你现在可能使用的常规图标呢。屏蔽图标仅是最终用户的视觉辅助。没别的了。因此,屏蔽图标是由系统显示还是由您手动显示并不重要。@SilverWarior:或使用
LoadIcon(0,IDI_shield)
或其他方法,如
LoadIconWithScaleDown
,以获得大小合适的高质量屏蔽。我同意Andreas的观点。不要期望此功能在
TBitBtn
上工作
TBitBtn
实际上留在Delphi中,以便与用遗留代码编写的程序向后兼容。您可以看到,在第一个Delphi版本的日子里,标准的
TButton
不支持显示任何图标。只有一个简单的标题。只有在以后,标准的
t按钮才能通过同时显示图标的功能进行扩展。但是
TBitBtn
被保留了下来,所以即使在现代Delphi版本上,您仍然可以编译旧的遗留程序。如果你被迫使用
TBitBtn
的话,你为什么不自己设计一些已经包含屏蔽的自定义图标,并使用它们来代替你现在可能使用的常规图标呢。屏蔽图标仅是最终用户的视觉辅助。没别的了。因此,屏蔽图标是由系统显示还是由您手动显示并不重要。@SilverWarior:或使用
LoadIcon(0,IDI_屏蔽)procedure MarkElevationRequired(ABitBtn: TBitBtn);
var
    Icon: TIcon;
begin
    Assert(Assigned(ABitBtn));
    //---
    try
        Icon := TIcon.Create;
        try
            Icon.Handle := GetSystemIcon(SIID_SHIELD, TSystemIconSize.Small); //see WinApi.ShellApi
            ABitBtn.Glyph.Assign(Icon);
        finally
            Icon.Free;
        end;
    except
        //CreateSystemIcon throws an exception for <WinVista
    end;
end;
/// Get system icon for SIID, see https://docs.microsoft.com/de-de/windows/win32/api/shellapi/ne-shellapi-shstockiconid
/// Works for Win Vista or better
/// see https://community.idera.com/developer-tools/b/blog/posts/using-windows-stock-icons-in-delphi
function GetSystemIcon(Id: integer; Size: TSystemIconSize = TSystemIconSize.Large;
  Overlay: Boolean = False; Selected: Boolean = False): HICON;
var
    Flags: Cardinal;
    SSII: TSHStockIconInfo;
    ResCode: HResult;
begin
    if not TOSVersion.Check(6, 0) then
      raise Exception.Create('SHGetStockIconInfo is only available in Win Vista or better.');

    case Size of
        TSystemIconSize.Large: Flags := SHGSI_ICON or SHGSI_LARGEICON;
        TSystemIconSize.Small: Flags := SHGSI_ICON or SHGSI_SMALLICON;
        TSystemIconSize.ShellSize: Flags := SHGSI_ICON or SHGSI_SHELLICONSIZE;
    end;

    if Selected then
      Flags := Flags OR SHGSI_SELECTED;
    if Overlay then
      Flags := Flags OR SHGSI_LINKOVERLAY;

    SSII.cbSize := SizeOf(SSII);
    ResCode := SHGetStockIconInfo(Id, Flags, SSII);

    if ResCode <> S_OK then
    begin
        if ResCode = E_INVALIDARG then
          raise Exception.Create(
            'The stock icon identifier [' + IntToStr(id) + '] is invalid')
        else
          raise Exception.Create(
            'Error calling GetSystemIcon: ' + IntToStr(ResCode));
    end
    else
      Result := SSII.hIcon;
end;