Fix wxTaskBarIcon to work under all Windows versions.
When the code was compiled using a new SDK, creating wxTaskBarIcon failed under older Windows systems because of a too big NOTIFYICONDATA size specified by the program. Fix this by using the fixed NOTIFYICONDATA_V2_SIZE to get old version of the struct which nevertheless contains everything we need and even fall back to NOTIFYICONDATA_V1_SIZE for Win9x if needed. Closes #11886. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63849 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -530,6 +530,7 @@ MSW:
|
|||||||
- Allow to not create wxPaintDC in EVT_PAINT handler.
|
- Allow to not create wxPaintDC in EVT_PAINT handler.
|
||||||
- Fix sending of wxEVT_COMMAND_LIST_COL_DRAGGING events in wxListCtrl.
|
- Fix sending of wxEVT_COMMAND_LIST_COL_DRAGGING events in wxListCtrl.
|
||||||
- Allow putting the UAC symbol on buttons (Chris Spencer).
|
- Allow putting the UAC symbol on buttons (Chris Spencer).
|
||||||
|
- Fix wxTaskBarIcon for older Windows systems (Daniel Wyatt).
|
||||||
|
|
||||||
i18n:
|
i18n:
|
||||||
|
|
||||||
|
@@ -45,6 +45,21 @@
|
|||||||
#define NIF_INFO 0x00000010
|
#define NIF_INFO 0x00000010
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef NOTIFYICONDATA_V1_SIZE
|
||||||
|
#ifdef UNICODE
|
||||||
|
#define NOTIFYICONDATA_V1_SIZE 0x0098
|
||||||
|
#else
|
||||||
|
#define NOTIFYICONDATA_V1_SIZE 0x0058
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NOTIFYICONDATA_V2_SIZE
|
||||||
|
#ifdef UNICODE
|
||||||
|
#define NOTIFYICONDATA_V2_SIZE 0x03A8;
|
||||||
|
#else
|
||||||
|
#define NOTIFYICONDATA_V2_SIZE 0x01E8;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
// initialized on demand
|
// initialized on demand
|
||||||
static UINT gs_msgTaskbar = 0;
|
static UINT gs_msgTaskbar = 0;
|
||||||
@@ -133,7 +148,19 @@ struct NotifyIconData : public NOTIFYICONDATA
|
|||||||
NotifyIconData(WXHWND hwnd)
|
NotifyIconData(WXHWND hwnd)
|
||||||
{
|
{
|
||||||
memset(this, 0, sizeof(NOTIFYICONDATA));
|
memset(this, 0, sizeof(NOTIFYICONDATA));
|
||||||
cbSize = sizeof(NOTIFYICONDATA);
|
|
||||||
|
// Do _not_ use sizeof(NOTIFYICONDATA) here, it may be too big if we're
|
||||||
|
// compiled with newer headers but running on an older system and while
|
||||||
|
// we could do complicated tests for the exact system version it's
|
||||||
|
// easier to just use an old size which should be supported everywhere
|
||||||
|
// from Windows 2000 up and which is all we need as we don't use any
|
||||||
|
// newer features so far. But if we're running under a really ancient
|
||||||
|
// system (Win9x), fall back to even smaller size -- then the balloon
|
||||||
|
// related features won't be available but the rest will still work.
|
||||||
|
cbSize = wxTheApp->GetShell32Version() >= 500
|
||||||
|
? NOTIFYICONDATA_V2_SIZE
|
||||||
|
: NOTIFYICONDATA_V1_SIZE;
|
||||||
|
|
||||||
hWnd = (HWND) hwnd;
|
hWnd = (HWND) hwnd;
|
||||||
uCallbackMessage = gs_msgTaskbar;
|
uCallbackMessage = gs_msgTaskbar;
|
||||||
uFlags = NIF_MESSAGE;
|
uFlags = NIF_MESSAGE;
|
||||||
@@ -231,7 +258,7 @@ wxTaskBarIcon::ShowBalloon(const wxString& title,
|
|||||||
// the balloon disappearance
|
// the balloon disappearance
|
||||||
NotifyIconData notifyData(hwnd);
|
NotifyIconData notifyData(hwnd);
|
||||||
notifyData.uFlags = 0;
|
notifyData.uFlags = 0;
|
||||||
notifyData.uVersion = 3 /* NOTIFYICON_VERSION for Windows XP */;
|
notifyData.uVersion = 3 /* NOTIFYICON_VERSION for Windows 2000/XP */;
|
||||||
|
|
||||||
if ( !wxShellNotifyIcon(NIM_SETVERSION, ¬ifyData) )
|
if ( !wxShellNotifyIcon(NIM_SETVERSION, ¬ifyData) )
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user