diff --git a/uppsrc/CtrlCore/TopWin32.cpp b/uppsrc/CtrlCore/TopWin32.cpp index ed21f534f..91a165f61 100644 --- a/uppsrc/CtrlCore/TopWin32.cpp +++ b/uppsrc/CtrlCore/TopWin32.cpp @@ -79,17 +79,6 @@ void TopWindow::SyncTitle() ::SetWindowTextW(hwnd, ToSystemCharsetW(title)); } -void TopWindow::DeleteIco() -{ - GuiLock __; - LLOG("TopWindow::DeleteIco " << UPP::Name(this)); - if(ico) - DestroyIcon(ico); - if(lico) - DestroyIcon(lico); - ico = lico = NULL; -} - String WindowStyleAsString(dword style, dword exstyle) { String r1; @@ -192,14 +181,41 @@ void TopWindow::SyncCaption() FlashWindowEx(&fi); } } - DeleteIco(); + SetIco(); + Ptr ptr = this; + PostCallback([=] { // windows 11 ignores icon if Window does not start processing messages within ~200ms + if(ptr) ptr->SetIco(); // set it again when we are processing events + }); +} + +void TopWindow::SetIco() +{ + HWND hwnd = GetHWND(); if(hwnd) { - ::SendMessage(hwnd, WM_SETICON, false, (LPARAM)(ico = SystemDraw::IconWin32(icon))); - ::SendMessage(hwnd, WM_SETICON, true, (LPARAM)(lico = SystemDraw::IconWin32(largeicon))); + HICON new_ico = SystemDraw::IconWin32(Nvl(icon, largeicon)); + HICON new_lico = SystemDraw::IconWin32(Nvl(largeicon, icon)); + ::SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)(new_ico)); + ::SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)(new_lico)); + + DeleteIco(); + + ico = new_ico; + lico = new_lico; } } +void TopWindow::DeleteIco() +{ + GuiLock __; + LLOG("TopWindow::DeleteIco " << UPP::Name(this)); + if(ico) + DestroyIcon(ico); + if(lico) + DestroyIcon(lico); + ico = lico = NULL; +} + void TopWindow::CenterRect(HWND hwnd, int center) { GuiLock __; diff --git a/uppsrc/CtrlCore/Win32Msg.i b/uppsrc/CtrlCore/Win32Msg.i index 47e189694..52a1c80ca 100644 --- a/uppsrc/CtrlCore/Win32Msg.i +++ b/uppsrc/CtrlCore/Win32Msg.i @@ -9,6 +9,8 @@ x_MSG(WM_SETFOCUS) x_MSG(WM_KILLFOCUS) x_MSG(WM_ENABLE) x_MSG(WM_SETREDRAW) +x_MSG(WM_SETICON) +x_MSG(WM_GETICON) x_MSG(WM_SETTEXT) x_MSG(WM_GETTEXT) x_MSG(WM_GETTEXTLENGTH) diff --git a/uppsrc/CtrlCore/Win32Top.h b/uppsrc/CtrlCore/Win32Top.h index 5d2cb43da..0a430c3d6 100644 --- a/uppsrc/CtrlCore/Win32Top.h +++ b/uppsrc/CtrlCore/Win32Top.h @@ -7,6 +7,7 @@ private: HICON ico, lico; void DeleteIco(); + void SetIco(); void CenterRect(HWND owner, int center); public: diff --git a/upptst/TestBigIcon/main.cpp b/upptst/TestBigIcon/main.cpp index 3b72fdd06..d64cb229b 100644 --- a/upptst/TestBigIcon/main.cpp +++ b/upptst/TestBigIcon/main.cpp @@ -13,6 +13,12 @@ using namespace Upp; GUI_APP_MAIN { TopWindow win; + win.Title("TEST"); win.LargeIcon(TestImg::Icon()); + DLOG("*********** OPEN MAIN"); + win.OpenMain(); + DLOG("*********** SLEEP 500"); + Sleep(5000); + DLOG("*********** RUN"); win.Run(); }