c++ - 自定义图标不显示在左上角或任务栏上

标签 c++ winapi icons

我已经使用 Windows API 创建了一个基本应用程序。它只显示一个小窗口。我从主要功能开始,获取实例,创建我的 Windows 类等。一切正常。然而,我遇到的问题是我的自定义图标不会显示在窗口的左上角或任务栏上,它只显示窗口的默认小图片。但是,它确实显示为我实际可点击的 exe 文件的图标。我使用 resedit 来制作我的资源,并创建了所有 4 种图标大小,因此它应该有一个合适大小的可用图标。我得到了句柄

HICON hMyIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));

然后我使用 WNDCLASSEX 并将句柄提供给 hIcon 和 hIconsm。 如果有任何可能导致它不显示在角落或任务栏中,请帮助。

#include <Windows.h>
#include <iostream>
#include "resource.h"
//globals
    MSG msg;
    HWND hwndwnd;
    HICON hMyIcon;
//Windows Procedure
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam )
{
    switch ( message )
    {
    case WM_CLOSE:    
        exit( 0 );
        break;    
    case WM_CREATE:
        SendMessage(hwndwnd,WM_SETICON,ICON_SMALL,(LPARAM)hMyIcon);
        break;
    }
    return DefWindowProc( hwnd, message, wparam, lparam );
}

int main(int ArgumentNum, char *arg[])
{
    //get instance
    char title[500];
    GetConsoleTitleA( title, 500 );
    HWND hwndConsole = FindWindowA( NULL, title );
    HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hwndConsole, GWLP_HINSTANCE);
    //get icon handle
    hMyIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
    if (hMyIcon == NULL)
    {
         std::cout<< "NULL\n";
    }
    //create & register class
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_DROPSHADOW;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = hMyIcon;
    wc.hCursor = LoadCursor(hInstance, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
    wc.lpszMenuName = 0;
    wc.lpszClassName = "Jacob";
    wc.hIconSm = hMyIcon;
    RegisterClassEx(&wc);
    //create window
    hwndwnd = CreateWindow("Jacob", "My Window", 
    WS_OVERLAPPEDWINDOW, 520, 20, 300, 300, NULL, NULL, hInstance, NULL);
    //Tried sendmessage here as well
    //SendMessage(hwndwnd,WM_SETICON,ICON_SMALL,(LPARAM)hMyIcon);
    ShowWindow( hwndwnd, SW_SHOWNORMAL);
    UpdateWindow( hwndwnd );
    //hide console, not using to see if icon is null
    //ShowWindow( hwndConsole, 0 );
    //message loop
    while(GetMessage( &msg, hwndwnd, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

这是我的源代码。我开始怀疑我的问题是否与我的资源有关。当我使用 resedit 时,我疯狂地制作了各种可能大小的图标。希望这会有所帮助,并感谢您的耐心等待。

最佳答案

我的第一个建议是尝试加载标准图标而不是您自己的图标:

hMyIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_ERROR));

这应该可以工作,您应该会看到红色的错误消息图标。

接下来要做的是尝试以不同的方式获取实例句柄。控制台窗口是一个奇怪的品种,不要将它们与 Win32 API 的其余部分混合太多。尝试:

hInstance = GetModuleHandle(NULL);

关于c++ - 自定义图标不显示在左上角或任务栏上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3859610/

相关文章:

sql-server - 如何在 ODBC 中启动事务?

ios - 黄金比例角圆角框矩形按钮

c++ - 如何了解 C++ 链接/依赖项?

python - 如何使用 SWIG 接口(interface)访问 python 中的 C++ typedef 结构

c# - WinAPI CredEnumerate 仅返回 Windows 凭据

c++ - 从左侧调整大小时窗口闪烁

c++ - 关于 C++ 中 double 和 int 之间转换的奇怪结果

c++ - 为什么下面的代码没有抛出错误?

java - 如何更改程序图标

java - 如何在 eclipse-rcp 应用程序的公共(public)导航器 View 中更改文件夹图标(例如源文件夹)?