我正在尝试使用LoadIconWithScaleDown API。 我正在使用Delphi 2007,我编写了一个简单的示例程序,在按下按钮时我调用了COMMCTRL.LoadIconWithScaleDown。我尝试了各种组合,实例为零,实例设置为hInstance,对于第二个参数,我试图传递当前模块名称,MAKEINTRESOURCE(IDI_APPLICATION),...总是没有运气,我总是得到-2147467263的返回值。知道我做错了吗?
根据David的建议编辑,以显示我是如何调用API的。
procedure TForm31.Button1Click(Sender: TObject);
var moduleName : string;
var moduleNameW : widestring;
var retVal : HRESULT;
var iconHandle : HICON;
begin
iconHandle := 0;
SetLength( moduleName, 1024);
WINDOWS.GetModuleFileName(
hInstance,
PCHAR(moduleName),
LENGTH(moduleName));
moduleNameW := moduleName;
retVal := COMMCTRL.LoadIconWithScaleDown(
HINSTANCE,
PWidechar(moduleNameW),
image1.width,
image1.height,
iconHandle);
end;
答案 0 :(得分:0)
这是一个很好的演示,说明为什么你应该不使用WinAPI函数而不阅读和理解文档。
LoadIconWithScaleDown的文档清楚地解释了参数是什么以及如何使用它们。没有理由使用GetModuleFileName
,而且您传递它的参数无论如何都是错误的,文档明确指出。
以下是双向使用函数的示例,首先从外部磁盘文件加载图标,然后从应用程序中的图标资源加载。它是在Delphi 10 Seattle下编译和测试的,只要文件或资源存在于您使用它的位置,它就可以工作。
uses
CommCtrl;
var
hIco: HICON;
Ico: TIcon;
NewWidth, NewHeight: Integer;
begin
NewWidth := 16;
NewHeight := 16;
if Succeeded(LoadIconWithScaleDown(0,
'C:\Images\SomeFile.ico',
NewWidth, NewHeight, hIco)) then
begin
Ico := TIcon.Create;
Ico.Handle := hIco;
// Do whatever with the icon. Clean up is left to you
end;
if Succeeded(LoadIconWithScaleDown(hInstance,
'MYRESOURCENAME',
NewWidth, NewHeight, hIco)) then
begin
// See code above
end;
end;
(不,问题不是你需要先调用InitCommonControlsEx
。包括CommCtrl会为你做必要的初始化。)