如何在SDL2 / C++ / Visual Studio 2012 Express程序中设置窗口标题栏图标和alt-tab图标?

问题描述 投票:0回答:2

我已将 .rc 文件添加到我的项目中,其中包含以下内容:

IDI_MAIN_ICON          ICON          "..\\..\\icon_artwork\\windows_icons\\project.ico"  

.ico 文件包含分辨率为 16x16、32x32、48x48 和 256x256 的图标。

我在任务栏和资源管理器中看到该图标(因此毫无疑问 .ico 已成功嵌入 .exe 中),但我在应用程序自己的标题栏和 alt-tab 中看到默认的 Windows 7 应用程序图标。

有没有办法让操作系统在所有情况下都能看到嵌入的图标,还是我需要为此编写一些应用程序代码?我注意到有一个 SDL2 函数

void SDL_SetWindowIcon(SDL_Window*  window, SDL_Surface* icon)  

但这需要 SDL 图面,而不是可执行文件中的嵌入式图标资源。

任何想法都感激不尽,
托尼

c++ visual-studio-2012 icons sdl
2个回答
8
投票

就目前情况而言,没有。由于某种原因,SDL 会占用实际应用程序窗口的图标。不过,您可以使用 WINDOWS 特定代码来解决此问题。请记住,这不是便携式的。

#if defined(_WIN32) && defined(GCL_HICON)
void setWindowsIcon(SDL_Window *sdlWindow) {
    HINSTANCE handle = ::GetModuleHandle(nullptr);
    HICON icon = ::LoadIcon(handle, "IDI_MAIN_ICON");
    if(icon != nullptr){
        SDL_SysWMinfo wminfo;
        SDL_VERSION(&wminfo.version);
        if(SDL_GetWindowWMInfo(sdlWindow,&wminfo) == 1){
            HWND hwnd = wminfo.info.win.window;
            ::SetClassLong(hwnd, GCL_HICON, reinterpret_cast<LONG>(icon));
        }
    }
}
#endif

5
投票

您应该能够使用以下方法从 .png 文件获取 SDL_Surface:

SDL_Surface *IMG_Load(const char *file)

然后将其传递给您的

SDL_SetWindowIcon(SDL_Window* window, SDL_Surface* icon)
方法。 我认为
IMG_Load(...)
方法不需要 .ico 文件,但 32x32 .png 版本的图标应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.