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
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
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 ;)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With