From a96b4743ff1eb85279194a28f7c388dc5fcab648 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Sun, 28 Dec 2003 01:07:31 +0000 Subject: [PATCH 1/1] Added wxUSE_POCKETPC_UI to distinguish between using combined toolbar/menubar and using separate ones git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25022 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/msw/wince/readme.txt | 51 +++++++++++++++++++------- include/wx/msw/menu.h | 8 +++- include/wx/msw/wince/setup.h | 23 ++++++++++-- include/wx/toolbar.h | 4 +- src/common/framecmn.cpp | 2 +- src/msw/frame.cpp | 42 ++++++++++++--------- src/msw/menu.cpp | 69 ++++++++++++++++++++++++++--------- src/msw/tbar95.cpp | 2 +- src/msw/wince/tbarwce.cpp | 4 +- src/msw/wince/wxWindowsCE.vcp | 6 +++ 10 files changed, 152 insertions(+), 59 deletions(-) diff --git a/docs/msw/wince/readme.txt b/docs/msw/wince/readme.txt index 8666f0a9bd..8fae0bead1 100644 --- a/docs/msw/wince/readme.txt +++ b/docs/msw/wince/readme.txt @@ -4,8 +4,8 @@ ================================================= You have downloaded version 2.5.1 of the Windows CE port of -the wxWindows GUI library. This runs on PocketPC 2002 -and SmartPhone 2002. +the wxWindows GUI library. This runs on PocketPC 2002, +SmartPhone 2002, and Windows CE .NET 4.x. More information about the wxWindows project as a whole can be found at: @@ -20,7 +20,7 @@ http://wiki.wxwindows.org/wiki.pl?Windows_CE_Port Supported platforms =================== -These are the supported platform at the moment: +These are the supported platforms at the moment: - x86 emulator - PocketPC (StrongARM) @@ -28,37 +28,60 @@ These are the supported platform at the moment: You can test the library and applications using PocketPC emulator and/or Compaq iPAQ or other PDAs using PocketPC -WindowsCE.NET is not supported. - Compiler installation ===================== Get the Visual C++ embedded (FREE) from Microsoft website http://msdn.microsoft.com/vstudio/device/embedded/download.asp -You must use Visual Tools 3.0 for CE 3.0  - (this is the same we are currently using for wxWinCE) +You must use Embedded Visual C++ 3.0 or Embedded Visual C++ 4.x. Install selecting only the two target platforms used: - WCE x86em (PocketPC emulation) - WCE ARM (PocketPC StrongARM) -Download an archive containing the library project file -and a sample project file: +You can install other targets but you will need +to create new configurations for them in the +wxWindows project files. + +wxWindows/CE Configuration +================================ + +You may wish to customize the following file +before compiling wxWinCE: + +include/wx/msw/wince/setup.h -http://www.anthemion.co.uk/wxwin/wxWinCE.zip +These are some of the Windows CE-specific settings +you can adjust. -Unarchive this over your wxWindows installation. +wxUSE_POCKETPC_UI + + If you are compiling with Windows CE .NET, you may + wish to emulate PocketPC behaviour (set it to 1), or + take advantage of the greater flexibility of + Windows CE .NET (set it to 0). + If 0, the PocketPC-specific toolbar class will be + used, which uses commandbar to combine the toolbar + and menubar in one control. If 1, the normal menubar + and toolbar behaviour will be used, as per + desktop Windows. + +wxUSE_SMARTPHONE + + Set this to 1 if you wish to compile for the SmartPhone + platform (with eVC++ 3). wxWindows/CE Compilation ================================ Open src/msw/wince/wxWindowsCE.vcp, select an -ARM or x86 target, and compile. +ARM or x86 target (or emulator target for eVC++ 4), +and compile. Then open samples/minimal/minimalCE.vcp, select an -ARM or x86 target, and compile. You can +ARM, x86 or emulator target, and compile. You can use the emulator or real hardware to run the sample. @@ -69,7 +92,7 @@ Currently under development. For further information about what has been done and what needs to be done, see: -http://wiki.wxwindows.org/wiki.pl?Windows_CE_Port +http://wiki.wxwindows.org/wiki.pl?Developers_Notebook/WxWinCE Disclaimer ========== diff --git a/include/wx/msw/menu.h b/include/wx/msw/menu.h index 90bc786920..55d7d5c786 100644 --- a/include/wx/msw/menu.h +++ b/include/wx/msw/menu.h @@ -172,7 +172,7 @@ public: virtual void Detach(); virtual void Attach(wxFrame *frame); -#if defined(__WXWINCE__) && wxUSE_TOOLBAR +#if wxUSE_TOOLBAR && defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI) // Under WinCE, a menubar is owned by the frame's toolbar void SetToolBar(wxToolBar* toolBar) { m_toolBar = toolBar; } wxToolBar* GetToolBar() const { return m_toolBar; } @@ -214,6 +214,12 @@ protected: #if defined(__WXWINCE__) && wxUSE_TOOLBAR wxToolBar* m_toolBar; #endif + // Not using a combined wxToolBar/wxMenuBar? then use + // a commandbar in WinCE .NET to implement the + // menubar, since there is no ::SetMenu function. +#if defined(__WXWINCE__) && (_WIN32_WCE >= 400 && !wxUSE_POCKETPC_UI) + WXHWND m_commandBar; +#endif private: DECLARE_DYNAMIC_CLASS_NO_COPY(wxMenuBar) diff --git a/include/wx/msw/wince/setup.h b/include/wx/msw/wince/setup.h index 79de00e12c..b468eef0dd 100644 --- a/include/wx/msw/wince/setup.h +++ b/include/wx/msw/wince/setup.h @@ -146,9 +146,9 @@ // // Default is 0 // -// Recommended setting: 0 (unless you only plan to use Windows NT/2000/XP) +// Recommended setting: 1 #ifndef wxUSE_UNICODE - #define wxUSE_UNICODE 0 + #define wxUSE_UNICODE 1 #endif // Set wxUSE_UNICODE_MSLU to 1 if you want to compile wxWindows in Unicode mode @@ -1061,9 +1061,26 @@ // (notably, wxNotebook pages) #define wxUSE_UXTHEME_AUTO 0 -// Set to 1 to if you're developing for MS SmartPhone +// Set to 1 if you're developing for MS SmartPhone #define wxUSE_SMARTPHONE 0 +// Set to 1 if you want to maintain a PocketPC-style UI on +// Windows CE .NET. If 0, wxWindows will use a commandbar +// for the menubar, and a normal separate toolbar as per the +// desktop implementation. If 1, wxWindows will combine +// the toolbar and menubar as per the PocketPC implementation. +// +// Note that at present, the dynamic loading of PocketPC +// shell functions on WinCE .NET is not yet done, and a +// simple commandbar implementation is used instead of the +// PocketPC one. The intention is to use the PocketPC style +// when available (when wxUSE_POCKETPC_UI is 1). +// +// So if you're using WinCE .NET, and wxUSE_POCKETPC_UI is 0, +// you will be able to create separate toolbars and menubars, +// but _not_ the combined toolbar/menubar. +#define wxUSE_POCKETPC_UI 1 + // ---------------------------------------------------------------------------- // obsolete settings // ---------------------------------------------------------------------------- diff --git a/include/wx/toolbar.h b/include/wx/toolbar.h index 61abe5d7f6..ff1ae8a51f 100644 --- a/include/wx/toolbar.h +++ b/include/wx/toolbar.h @@ -123,10 +123,10 @@ enum #else // wxUSE_TOOLBAR_NATIVE #if defined(__WXUNIVERSAL__) #include "wx/univ/toolbar.h" + #elif defined(__WXMSW__) && (!defined(_WIN32_WCE) || (_WIN32_WCE >= 400 && !wxUSE_POCKETPC_UI)) + #include "wx/msw/tbar95.h" #elif defined(__WXWINCE__) #include "wx/msw/wince/tbarwce.h" - #elif defined(__WXMSW__) && defined(__WIN95__) - #include "wx/msw/tbar95.h" #elif defined(__WXMSW__) #include "wx/msw/tbarmsw.h" #elif defined(__WXMOTIF__) diff --git a/src/common/framecmn.cpp b/src/common/framecmn.cpp index 78d72ccbd0..36ff939b35 100644 --- a/src/common/framecmn.cpp +++ b/src/common/framecmn.cpp @@ -519,7 +519,7 @@ void wxFrameBase::SetMenuBar(wxMenuBar *menubar) DetachMenuBar(); - AttachMenuBar(menubar); + this->AttachMenuBar(menubar); } #endif // wxUSE_MENUS diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index 2885c3ed50..75a1b4e4ef 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -320,6 +320,18 @@ void wxFrame::PositionStatusBar() void wxFrame::AttachMenuBar(wxMenuBar *menubar) { +#if defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI) + if (!GetToolBar()) + { + wxToolBar* toolBar = new wxToolBar(this, -1, + wxDefaultPosition, wxDefaultSize, + wxBORDER_NONE | wxTB_HORIZONTAL, + wxToolBarNameStr, GetMenuBar()); + SetToolBar(toolBar); + menubar->SetToolBar(toolBar); + } +#endif + wxFrameBase::AttachMenuBar(menubar); if ( !menubar ) @@ -330,7 +342,7 @@ void wxFrame::AttachMenuBar(wxMenuBar *menubar) } else // set new non NULL menu bar { -#ifndef __WXWINCE__ +#if !defined(__WXWINCE__) || (_WIN32_WCE >= 400 && !wxUSE_POCKETPC_UI) // Can set a menubar several times. if ( menubar->GetHMenu() ) { @@ -353,18 +365,8 @@ void wxFrame::AttachMenuBar(wxMenuBar *menubar) void wxFrame::InternalSetMenuBar() { -#ifdef __WXMICROWIN__ +#if defined(__WXMICROWIN__) || defined(__WXWINCE__) // Nothing -#elif defined(__WXWINCE__) - - if (!GetToolBar()) - { - wxToolBar* toolBar = new wxToolBar(this, -1, - wxDefaultPosition, wxDefaultSize, - wxBORDER_NONE | wxTB_HORIZONTAL, - wxToolBarNameStr, GetMenuBar()); - SetToolBar(toolBar); - } #else if ( !::SetMenu(GetHwnd(), (HMENU)m_hMenu) ) { @@ -403,7 +405,7 @@ bool wxFrame::ShowFullScreen(bool show, long style) if (show) { #if wxUSE_TOOLBAR -#ifdef __WXWINCE__ +#if defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI) // TODO: hide commandbar #else wxToolBar *theToolBar = GetToolBar(); @@ -420,8 +422,10 @@ bool wxFrame::ShowFullScreen(bool show, long style) #endif // __WXWINCE__ #endif // wxUSE_TOOLBAR +#if defined(__WXMICROWIN__) +#elif defined(__WXWINCE__) // TODO: make it work for WinCE -#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) +#else if (style & wxFULLSCREEN_NOMENUBAR) SetMenu((HWND)GetHWND(), (HMENU) NULL); #endif @@ -446,7 +450,7 @@ bool wxFrame::ShowFullScreen(bool show, long style) else { #if wxUSE_TOOLBAR -#ifdef __WXWINCE__ +#if defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI) // TODO: show commandbar #else wxToolBar *theToolBar = GetToolBar(); @@ -472,8 +476,10 @@ bool wxFrame::ShowFullScreen(bool show, long style) } #endif // wxUSE_STATUSBAR +#if defined(__WXMICROWIN__) +#elif defined(__WXWINCE__) // TODO: make it work for WinCE -#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) +#else if ((m_fsStyle & wxFULLSCREEN_NOMENUBAR) && (m_hMenu != 0)) SetMenu((HWND)GetHWND(), (HMENU)m_hMenu); #endif @@ -490,7 +496,7 @@ bool wxFrame::ShowFullScreen(bool show, long style) wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID id, const wxString& name) { -#ifdef __WXWINCE__ +#if defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI) // We may already have a toolbar from calling SetMenuBar. if (GetToolBar()) return GetToolBar(); @@ -508,7 +514,7 @@ void wxFrame::PositionToolBar() wxToolBar *toolbar = GetToolBar(); if ( toolbar && toolbar->IsShown() ) { -#ifdef __WXWINCE__ +#if defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI) // We want to do something different in WinCE, because // the toolbar should be associated with the commandbar, // and not an independent window. diff --git a/src/msw/menu.cpp b/src/msw/menu.cpp index bcc1febf1d..f8b1c4377b 100644 --- a/src/msw/menu.cpp +++ b/src/msw/menu.cpp @@ -673,8 +673,14 @@ void wxMenuBar::Init() { m_eventHandler = this; m_hMenu = 0; -#ifdef __WXWINCE__ +#if wxUSE_TOOLBAR && defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI) m_toolBar = NULL; +#endif + // Not using a combined wxToolBar/wxMenuBar? then use + // a commandbar in WinCE .NET just to implement the + // menubar. +#if defined(__WXWINCE__) && (_WIN32_WCE >= 400 && !wxUSE_POCKETPC_UI) + m_commandBar = NULL; #endif } @@ -705,9 +711,9 @@ wxMenuBar::wxMenuBar(int count, wxMenu *menus[], const wxString titles[]) wxMenuBar::~wxMenuBar() { - // In Windows CE, the menubar is always associated + // In Windows CE (not .NET), the menubar is always associated // with a toolbar, which destroys the menu implicitly. -#ifdef __WXWINCE__ +#if defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI) if (GetToolBar()) GetToolBar()->SetMenuBar(NULL); #else @@ -715,7 +721,12 @@ wxMenuBar::~wxMenuBar() // which happens if we're attached to a frame if (m_hMenu && !IsAttached()) { +#if defined(__WXWINCE__) && (_WIN32_WCE >= 400 && !wxUSE_POCKETPC_UI) + ::DestroyWindow((HWND) m_commandBar); + m_commandBar = (WXHWND) NULL; +#else ::DestroyMenu((HMENU)m_hMenu); +#endif m_hMenu = (WXHMENU)NULL; } #endif @@ -729,11 +740,14 @@ void wxMenuBar::Refresh() { wxCHECK_RET( IsAttached(), wxT("can't refresh unattached menubar") ); -#ifdef __WXWINCE__ +#if defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI) if (GetToolBar()) { CommandBar_DrawMenuBar((HWND) GetToolBar()->GetHWND(), 0); } +#elif defined(__WXWINCE__) && (_WIN32_WCE >= 400 && !wxUSE_POCKETPC_UI) + if (m_commandBar) + DrawMenuBar((HWND) m_commandBar); #else DrawMenuBar(GetHwndOf(GetFrame())); #endif @@ -806,17 +820,6 @@ WXHMENU wxMenuBar::Create() } } -#if _WIN32_WCE >= 400 - if (GetToolBar()) - { - HWND hCommandBar = (HWND) GetToolBar()->GetHWND(); - if (!CommandBar_InsertMenubarEx(hCommandBar, NULL, (LPTSTR) m_hMenu, 0)) - { - wxLogLastError(wxT("CommandBar_InsertMenubarEx")); - } - } -#endif - return m_hMenu; #endif } @@ -953,7 +956,7 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) if ( IsAttached() ) { -#ifdef __WXWINCE__ +#if defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI) if (!GetToolBar()) return FALSE; TBBUTTON tbButton; @@ -1007,7 +1010,7 @@ bool wxMenuBar::Append(wxMenu *menu, const wxString& title) if ( IsAttached() ) { -#ifdef __WXWINCE__ +#if defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI) if (!GetToolBar()) return FALSE; TBBUTTON tbButton; @@ -1058,7 +1061,7 @@ wxMenu *wxMenuBar::Remove(size_t pos) if ( IsAttached() ) { -#ifdef __WXWINCE__ +#if defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI) if (GetToolBar()) { if (!::SendMessage((HWND) GetToolBar()->GetHWND(), TB_DELETEBUTTON, (UINT) pos, (LPARAM) 0)) @@ -1125,6 +1128,36 @@ void wxMenuBar::Attach(wxFrame *frame) { wxMenuBarBase::Attach(frame); +#if defined(__WXWINCE__) && _WIN32_WCE >= 400 + if (!m_hMenu) + this->Create(); +#if wxUSE_POCKETPC_UI + if (GetToolBar()) + { + HWND hCommandBar = (HWND) GetToolBar()->GetHWND(); + if (!CommandBar_InsertMenubarEx(hCommandBar, NULL, (LPTSTR) m_hMenu, 0)) + { + wxLogLastError(wxT("CommandBar_InsertMenubarEx")); + } + } +#else + if (!m_commandBar) + m_commandBar = (WXHWND) CommandBar_Create(wxGetInstance(), (HWND) frame->GetHWND(), NewControlId()); + if (m_commandBar) + { + if (m_hMenu) + { + if (!CommandBar_InsertMenubarEx((HWND) m_commandBar, NULL, (LPTSTR) m_hMenu, 0)) + { + wxLogLastError(wxT("CommandBar_InsertMenubarEx")); + } + } + } +#endif + // wxUSE_POCKETPC_UI +#endif + // __WXWINCE__ && _WIN32_WCE >= 400 + #if wxUSE_ACCEL RebuildAccelTable(); #endif // wxUSE_ACCEL diff --git a/src/msw/tbar95.cpp b/src/msw/tbar95.cpp index 304a161756..58ddd04fa7 100644 --- a/src/msw/tbar95.cpp +++ b/src/msw/tbar95.cpp @@ -39,7 +39,7 @@ #include "wx/control.h" #endif -#if wxUSE_TOOLBAR && defined(__WIN95__) && wxUSE_TOOLBAR_NATIVE +#if wxUSE_TOOLBAR && wxUSE_TOOLBAR_NATIVE && (!defined(_WIN32_WCE) || (_WIN32_WCE >= 400 && !wxUSE_POCKETPC_UI)) #include "wx/toolbar.h" diff --git a/src/msw/wince/tbarwce.cpp b/src/msw/wince/tbarwce.cpp index 79baa1c7b2..f5b7b164ef 100644 --- a/src/msw/wince/tbarwce.cpp +++ b/src/msw/wince/tbarwce.cpp @@ -39,7 +39,9 @@ #include "wx/control.h" #endif -#if wxUSE_TOOLBAR && wxUSE_TOOLBAR_NATIVE +// Use the WinCE-specific toolbar only if we're either compiling +// with a WinCE earlier than 4, or we wish to emulate a PocketPC-style UI +#if wxUSE_TOOLBAR && wxUSE_TOOLBAR_NATIVE && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI) #include "wx/toolbar.h" diff --git a/src/msw/wince/wxWindowsCE.vcp b/src/msw/wince/wxWindowsCE.vcp index f2aa6637f4..5afe33a36d 100644 --- a/src/msw/wince/wxWindowsCE.vcp +++ b/src/msw/wince/wxWindowsCE.vcp @@ -2253,6 +2253,12 @@ SOURCE=..\tabctrl.cpp SOURCE=..\taskbar.cpp +# End Source File +# Begin Source File + +SOURCE=..\tbar95.cpp + + # End Source File # Begin Source File -- 2.45.2