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我尝试操作使用JVCLsJvDSADialogs.CreateDSAMessageForm
创建的表单CreateDSAMessageForm
在内部使用TBitBtn
。明显的问题是:为什么使用TBitBtn?TButton中缺少什么?LevationRequired
属性没有为TBitBtn
发布,因此我猜这种按钮不支持该功能。@uwerabe我尝试操作使用JVCLsJvDSADialogs.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;