LoadIconWithScaleDown始终失败

时间:2016-01-29 20:13:58

标签: delphi icons

我正在尝试使用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;

1 个答案:

答案 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会为你做必要的初始化。)