Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I set window titlebar icon and alt-tab icon in SDL2 / C++ / Visual Studio 2012 express program?

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

like image 605
Tony Park Avatar asked Oct 11 '13 06:10

Tony Park


2 Answers

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
like image 192
Chase Avatar answered Nov 15 '22 03:11

Chase


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 ;)

like image 24
Olivier Avatar answered Nov 15 '22 03:11

Olivier