【问题标题】:LoadIconWithScaleDown always failsLoadIconWithScaleDown 总是失败
【发布时间】:2016-01-29 20:13:57
【问题描述】:

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

【问题讨论】:

  • 您做错了什么是在不包含minimal reproducible example的情况下询问有关您的代码的问题
  • 我理解您的评论大卫,但我尝试了各种组合,但都没有奏效。如果您只有一个有效的,我将不胜感激。我将编辑我的消息以举例说明我的尝试。
  • 您根本不检查错误。下一步阅读文档。听起来很明显,但你还没有做到。仔细阅读。两次。您传递的资源名称是错误的,这是我的猜测。错误会告诉你。再次,阅读文档。这就是他们的目的。
  • 我所要求的只是一个使用该 API 取得成功的人的 3 行示例。我确实阅读了文档并尝试了各种组合,但没有任何运气。
  • 这不是 Stack Overflow 的意义所在。如果您需要聘请程序员,则需要寻找其他地方。如果您无法理解此功能的简单文档,那么我们如何提供帮助。我们在这里帮助您和其他人学习,而不是完成您的工作。我已经告诉过你该怎么做。检查错误。传递正确的资源名称。

标签: delphi icons


【解决方案1】:

这很好地说明了为什么您应该在不阅读和理解文档的情况下使用 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 会为您进行必要的初始化。)

【讨论】:

  • 嗨,Ken,我同意我使用模块名称作为第二个参数很厚。问题是我之前尝试过其他东西图标,MAKEINTRESOURCE,但没有运气。在我的 Delphi (2007) 版本中,我需要明确调用 InitCommControlsEx,这一点我很确定。我调试了 COMMCTRL。所以请不要太嚣张。有时你也可能是错的。 :-)
  • 我不喜欢肯你傲慢的语气。
  • 虽然我意识到我在这个问题上和在问问题的过程中都很紧张,但我昨天碰巧很累,我知道那不是借口......你可能永远不会累。 .. 我认为你没有理由这样对我说话。你应该学会在帮助和友善的同时。
  • 我同意投反对票并不是很聪明。我当然感谢您或 David Heffernan、Remy Lebeau、Sertac 等人提供的帮助……但有时,我真的发现您在与用户的互动中不是很好。不过,当一个问题没有很好地表达时,我可以理解你的愤怒。
猜你喜欢
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多