4
votes

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 16x16, 32x32, 48x48 and 256x256 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

2
Convert the icon to a bitmap format and load it as such.this

2 Answers

4
votes

You should be able to get a SDL_Surface from a .png file using

SDL_Surface *IMG_Load(const char *file)

then pass it to your SDL_SetWindowIcon(SDL_Window* window, SDL_Surface* icon) method. I don't think the IMG_Load(...) method takes .ico files though, but a 32x32 .png version of your icon would be a good compromise... Not ideal but the best workaround I can think of ;)

6
votes

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