X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b2d5a7ee008faae08694abd039f7da235da8bce5..19e30148e18cc99296b26503c155e5cef59045f4:/src/msw/toplevel.cpp diff --git a/src/msw/toplevel.cpp b/src/msw/toplevel.cpp index 83bebdb7f1..8283ec20d6 100644 --- a/src/msw/toplevel.cpp +++ b/src/msw/toplevel.cpp @@ -39,6 +39,14 @@ #include "wx/msw/private.h" +#ifndef ICON_BIG + #define ICON_BIG 1 +#endif + +#ifndef ICON_SMALL + #define ICON_SMALL 0 +#endif + // ---------------------------------------------------------------------------- // stubs for missing functions under MicroWindows // ---------------------------------------------------------------------------- @@ -64,21 +72,25 @@ extern const wxChar *wxCanvasClassName; // wxTopLevelWindowMSW implementation // ============================================================================ +// ---------------------------------------------------------------------------- +// wxDialog helpers +// ---------------------------------------------------------------------------- + // Dialog window proc LONG APIENTRY _EXPORT -wxDlgProc(HWND WXUNUSED(hWnd), UINT message, WPARAM WXUNUSED(wParam), LPARAM WXUNUSED(lParam)) +wxDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - if ( message == WM_INITDIALOG ) + switch ( message ) { - // for this message, returning TRUE tells system to set focus to the - // first control in the dialog box - return TRUE; - } - else - { - // for all the other ones, FALSE means that we didn't process the - // message - return FALSE; + case WM_INITDIALOG: + // for this message, returning TRUE tells system to set focus to the + // first control in the dialog box + return TRUE; + + default: + // for all the other ones, FALSE means that we didn't process the + // message + return FALSE; } } @@ -217,10 +229,13 @@ bool wxTopLevelWindowMSW::CreateDialog(const void *dlgTemplate, } } - m_hWnd = (WXHWND)::CreateDialogIndirect(wxGetInstance(), - (DLGTEMPLATE*)dlgTemplate, - parent ? GetHwndOf(parent) : NULL, - (DLGPROC)wxDlgProc); + m_hWnd = (WXHWND)::CreateDialogIndirect + ( + wxGetInstance(), + (DLGTEMPLATE*)dlgTemplate, + parent ? GetHwndOf(parent) : NULL, + (DLGPROC)wxDlgProc + ); if ( !m_hWnd ) { @@ -344,36 +359,37 @@ bool wxTopLevelWindowMSW::Create(wxWindow *parent, if ( GetExtraStyle() & wxTOPLEVEL_EX_DIALOG ) { - // TODO: it would be better to construct the dialog template in memory - // during run-time than to rely on the limited number of - // templates in wx.rc because: - // a) you wouldn't have to include wx.rc in all wxWin programs - // (and the number of complaints about it would dtop) - // b) we'd be able to provide more templates simply, i.e. - // we could generate the templates for all style - // combinations - // we have different dialog templates to allows creation of dialogs // with & without captions under MSWindows, resizeable or not (but a // resizeable dialog always has caption - otherwise it would look too // strange) - int dlgsize = sizeof(DLGTEMPLATE) + (sizeof(WORD) * 3); - DLGTEMPLATE* dlgTemplate = (DLGTEMPLATE*)malloc( dlgsize ); - memset (dlgTemplate, 0, dlgsize ); + + // we need 3 additional WORDs for dialog menu, class and title (as we + // don't use DS_SETFONT we don't need the fourth WORD for the font) + static const int dlgsize = sizeof(DLGTEMPLATE) + (sizeof(WORD) * 3); + DLGTEMPLATE *dlgTemplate = (DLGTEMPLATE *)malloc(dlgsize); + memset(dlgTemplate, 0, dlgsize); + + // these values are arbitrary, they won't be used normally anyhow dlgTemplate->x = 34; dlgTemplate->y = 22; dlgTemplate->cx = 144; dlgTemplate->cy = 75; - if ( style & wxRESIZE_BORDER ) - dlgTemplate->style = DS_MODALFRAME | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_THICKFRAME; - else if ( style & wxCAPTION ) - dlgTemplate->style = DS_MODALFRAME | WS_CAPTION | WS_POPUP | WS_SYSMENU; - else - dlgTemplate->style = WS_POPUP; + // reuse the code in MSWGetStyle() but correct the results slightly for + // the dialog + dlgTemplate->style = MSWGetStyle(style, NULL); + + // all dialogs are popups + dlgTemplate->style |= WS_POPUP; + + // force 3D-look if necessary, it looks impossibly ugly otherwise + if ( style & (wxRESIZE_BORDER | wxCAPTION) ) + dlgTemplate->style |= DS_MODALFRAME; bool ret = CreateDialog(dlgTemplate, title, pos, size); free(dlgTemplate); + return ret; } else // !dialog @@ -580,14 +596,26 @@ bool wxTopLevelWindowMSW::ShowFullScreen(bool show, long style) void wxTopLevelWindowMSW::SetIcon(const wxIcon& icon) { - // this sets m_icon - wxTopLevelWindowBase::SetIcon(icon); + SetIcons( wxIconBundle( icon ) ); +} + +void wxTopLevelWindowMSW::SetIcons(const wxIconBundle& icons) +{ + wxTopLevelWindowBase::SetIcons(icons); #if defined(__WIN95__) && !defined(__WXMICROWIN__) - if ( m_icon.Ok() ) + const wxIcon& sml = icons.GetIcon( wxSize( 16, 16 ) ); + if( sml.Ok() && sml.GetWidth() == 16 && sml.GetHeight() == 16 ) + { + ::SendMessage( GetHwndOf( this ), WM_SETICON, ICON_SMALL, + (LPARAM)GetHiconOf(sml) ); + } + + const wxIcon& big = icons.GetIcon( wxSize( 32, 32 ) ); + if( big.Ok() && big.GetWidth() == 32 && big.GetHeight() == 32 ) { - ::SendMessage(GetHwnd(), WM_SETICON, - (WPARAM)TRUE, (LPARAM)GetHiconOf(m_icon)); + ::SendMessage( GetHwndOf( this ), WM_SETICON, ICON_BIG, + (LPARAM)GetHiconOf(big) ); } #endif // __WIN95__ }