C++ – How to set window titlebar icon and alt-tab icon in SDL2 / C++ / Visual Studio 2012 express program

ciconssdlvisual studio 2012

I have added a .rc file to my project with just the following:

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

The .ico file contains icons at 16×16, 32×32, 48×48 and 256×256 resolutions.

I see the icon in the taskbar and explorer (so there is no doubt the .ico is successfully embedded in the .exe), but I see the default Windows 7 application icon in the application's own title bar, and in alt-tab.

Is there a way to get the OS to see the embedded icon by itself in all cases, or do I need to write some application code for this? I notice that there is an SDL2 function

void SDL_SetWindowIcon(SDL_Window*  window, SDL_Surface* icon)  

but that takes an SDL surface, not the embedded icon resource from the executable.

Any ideas gratefully received,
Tony

Best Answer

As it stands, no. SDL for some reason eats the icon for the actual application window. However you can use WINDOWS specific code to fix this. Keep in mind that this is not portable.

#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
Related Topic