【问题标题】:Changing Window icon using the windows api in C++ [duplicate]在 C++ 中使用 windows api 更改窗口图标 [重复]
【发布时间】:2020-10-02 17:52:38
【问题描述】:

我正在尝试更改窗口图标,但是 main.cpp (hIcon != 0) 中的断言总是失败,我在项目解决方案的根目录中有一个 Icon.ico (128x128) 文件但仍然收到执行时出错。任何建议

main.cpp:

#include <windows.h>
#include <tchar.h>
#include "resource.h"
#include <crtdbg.h>

LRESULT CALLBACK WndProc (HWND hwnd, unsigned int msg, WPARAM wParam, LPARAM lParam)
{
  switch (msg)
  {
    case WM_CREATE:
    {
      HINSTANCE hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
      HICON hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON1));
      _ASSERTE (hIcon != 0);
      SendMessage (hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
      return 0;
    }
    case WM_COMMAND:
    {
      return 0;
    }
    case WM_DESTROY:
    {
      PostQuitMessage (0);
      return 0;
    }
  }

  return (DefWindowProc (hwnd, msg, wParam, lParam));
}


int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevIns, LPSTR lpszArgument, int iShow)
{
  TCHAR szClassName[] = _T("Template");
  TCHAR szWindowName[] = _T("Template");
  WNDCLASSEX wc = { 0 };
  MSG messages;
  HWND hWnd;

  wc.lpszClassName = szClassName;
  wc.lpfnWndProc = WndProc;
  wc.cbSize = sizeof (WNDCLASSEX);
  wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;
  wc.hInstance = hInstance;
  
  _ASSERTE(RegisterClassEx (&wc) !=0);
  
  hWnd = CreateWindowEx (0, szClassName, szWindowName, WS_OVERLAPPEDWINDOW, 
      CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
      HWND_DESKTOP, 0, hInstance, 0);
      
  _ASSERTE(::IsWindow(hWnd));
  
  ShowWindow (hWnd, iShow);
  while (GetMessage (&messages, NULL, 0, 0))
  {
    TranslateMessage (&messages);
    DispatchMessage (&messages);
  }

  return static_cast<int>(messages.wParam);
}

resource.h:

#define IDI_ICON1                       101

resource.rc:

#include "resource.h"
IDI_ICON1               ICON                    "Icon.ico"

【问题讨论】:

  • GetLastError() 返回什么?
  • @PaulSanders 它返回“端口(null)无法打开”这很奇怪,因为窗口更改了它的图标,但我不确定为什么会显示错误消息。
  • stackoverflow.com/questions/23852864/… 也许这会有所帮助?

标签: c++ windows winapi


【解决方案1】:

根据 MSDN:

LoadIcon 只能加载大小符合 SM_CXICON 的图标 和 SM_CYICON 系统指标值。使用LoadImage函数加载 其他尺寸的图标。

检查是否都

GetSystemMetrics(SM_CXICON); GetSystemMetrics(SM_CYICON);

返回 128(因为您正在加载 128x128 图标)。如果不使用 LoadImage 函数。

【讨论】:

    猜你喜欢
    • 2017-06-21
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2012-09-26
    • 2017-06-23
    • 1970-01-01
    • 2011-08-14
    • 2011-11-16
    相关资源
    最近更新 更多