X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/51c1d535fc3314e5de95fc4472f4a7e27a2ebeb6..ef70f0ecdbc4268923e132b257c95e8a2525f4ca:/src/os2/frame.cpp diff --git a/src/os2/frame.cpp b/src/os2/frame.cpp index 26b4572eec..f21c945ae6 100644 --- a/src/os2/frame.cpp +++ b/src/os2/frame.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: frame.cpp -// Purpose: wxFrame +// Purpose: wxFrameOS2 // Author: David Webster // Modified by: // Created: 10/27/99 @@ -55,18 +55,24 @@ extern wxList WXDLLEXPORT wxPendingDelete; extern wxChar wxFrameClassName[]; extern wxMenu *wxCurrentPopupMenu; -extern void wxAssociateWinWithHandle( HWND hWnd,wxWindow* pWin); +extern void wxAssociateWinWithHandle( HWND hWnd + ,wxWindow* pWin + ); // ---------------------------------------------------------------------------- // event tables // ---------------------------------------------------------------------------- -BEGIN_EVENT_TABLE(wxFrame, wxFrameBase) - EVT_ACTIVATE(wxFrame::OnActivate) - EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged) +BEGIN_EVENT_TABLE(wxFrameOS2, wxFrameBase) + EVT_ACTIVATE(wxFrameOS2::OnActivate) + EVT_SYS_COLOUR_CHANGED(wxFrameOS2::OnSysColourChanged) END_EVENT_TABLE() -IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow) +IMPLEMENT_DYNAMIC_CLASS(wxFrameOS2, wxWindow) + +#ifndef __WXUNIVERSAL__ +IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxFrameMSW) +#endif // ============================================================================ // implementation @@ -78,9 +84,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow) #if wxUSE_STATUSBAR #if wxUSE_NATIVE_STATUSBAR - bool wxFrame::m_bUseNativeStatusBar = TRUE; + bool wxFrameOS2::m_bUseNativeStatusBar = TRUE; #else - bool wxFrame::m_bUseNativeStatusBar = FALSE; + bool wxFrameOS2::m_bUseNativeStatusBar = FALSE; #endif #endif //wxUSE_STATUSBAR @@ -89,7 +95,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow) // creation/destruction // ---------------------------------------------------------------------------- -void wxFrame::Init() +void wxFrameOS2::Init() { m_bIconized = FALSE; @@ -123,9 +129,9 @@ void wxFrame::Init() memset(&m_vSwpVScroll, 0, sizeof(SWP)); memset(&m_vSwpStatusBar, 0, sizeof(SWP)); memset(&m_vSwpToolBar, 0, sizeof(SWP)); -} // end of wxFrame::Init +} // end of wxFrameOS2::Init -bool wxFrame::Create( +bool wxFrameOS2::Create( wxWindow* pParent , wxWindowID vId , const wxString& rsTitle @@ -185,9 +191,9 @@ bool wxFrame::Create( wxModelessWindows.Append(this); } return(bOk); -} // end of wxFrame::Create +} // end of wxFrameOS2::Create -wxFrame::~wxFrame() +wxFrameOS2::~wxFrameOS2() { m_isBeingDeleted = TRUE; @@ -229,29 +235,36 @@ wxFrame::~wxFrame() ); } } -} // end of wxFrame::~wxFrame +} // end of wxFrameOS2::~wxFrame // // Get size *available for subwindows* i.e. excluding menu bar, toolbar etc. // -void wxFrame::DoGetClientSize( +void wxFrameOS2::DoGetClientSize( int* pX , int* pY ) const { RECTL vRect; ::WinQueryWindowRect(GetHwnd(), &vRect); + + // + // No need to use statusbar code as in WIN32 as the FORMATFRAME + // window procedure ensures PM knows about the new frame client + // size internally. A ::WinQueryWindowRect is all that is needed! + // + if (pX) *pX = vRect.xRight - vRect.xLeft; if (pY) *pY = vRect.yTop - vRect.yBottom; -} // end of wxFrame::DoGetClientSize +} // end of wxFrameOS2::DoGetClientSize // // Set the client size (i.e. leave the calculation of borders etc. // to wxWindows) // -void wxFrame::DoSetClientSize( +void wxFrameOS2::DoSetClientSize( int nWidth , int nHeight ) @@ -309,9 +322,9 @@ void wxFrame::DoSetClientSize( ); vEvent.SetEventObject(this); GetEventHandler()->ProcessEvent(vEvent); -} // end of wxFrame::DoSetClientSize +} // end of wxFrameOS2::DoSetClientSize -void wxFrame::DoGetSize( +void wxFrameOS2::DoGetSize( int* pWidth , int* pHeight ) const @@ -321,9 +334,9 @@ void wxFrame::DoGetSize( ::WinQueryWindowRect(m_hFrame, &vRect); *pWidth = vRect.xRight - vRect.xLeft; *pHeight = vRect.yTop - vRect.yBottom; -} // end of wxFrame::DoGetSize +} // end of wxFrameOS2::DoGetSize -void wxFrame::DoGetPosition( +void wxFrameOS2::DoGetPosition( int* pX , int* pY ) const @@ -332,30 +345,24 @@ void wxFrame::DoGetPosition( POINTL vPoint; ::WinQueryWindowRect(m_hFrame, &vRect); - vPoint.x = vRect.xLeft; - - // - // OS/2 is backwards [WIN32 it is vRect.yTop] - // - vPoint.y = vRect.yBottom; - *pX = vPoint.x; - *pY = vPoint.y; -} // end of wxFrame::DoGetPosition + *pX = vRect.xRight - vRect.xLeft; + *pY = vRect.yTop - vRect.yBottom; +} // end of wxFrameOS2::DoGetPosition // ---------------------------------------------------------------------------- // variations around ::ShowWindow() // ---------------------------------------------------------------------------- -void wxFrame::DoShowWindow( +void wxFrameOS2::DoShowWindow( int bShowCmd ) { ::WinShowWindow(m_hFrame, (BOOL)bShowCmd); m_bIconized = bShowCmd == SWP_MINIMIZE; -} // end of wxFrame::DoShowWindow +} // end of wxFrameOS2::DoShowWindow -bool wxFrame::Show( +bool wxFrameOS2::Show( bool bShow ) { @@ -398,27 +405,27 @@ bool wxFrame::Show( } } return TRUE; -} // end of wxFrame::Show +} // end of wxFrameOS2::Show -void wxFrame::Iconize( +void wxFrameOS2::Iconize( bool bIconize ) { DoShowWindow(bIconize ? SWP_MINIMIZE : SWP_RESTORE); -} // end of wxFrame::Iconize +} // end of wxFrameOS2::Iconize -void wxFrame::Maximize( +void wxFrameOS2::Maximize( bool bMaximize) { DoShowWindow(bMaximize ? SWP_MAXIMIZE : SWP_RESTORE); -} // end of wxFrame::Maximize +} // end of wxFrameOS2::Maximize -void wxFrame::Restore() +void wxFrameOS2::Restore() { DoShowWindow(SWP_RESTORE); -} // end of wxFrame::Restore +} // end of wxFrameOS2::Restore -bool wxFrame::IsIconized() const +bool wxFrameOS2::IsIconized() const { SWP vSwp; @@ -429,19 +436,19 @@ bool wxFrame::IsIconized() const else ((wxFrame*)this)->m_bIconized = FALSE; return m_bIconized; -} // end of wxFrame::IsIconized +} // end of wxFrameOS2::IsIconized // Is it maximized? -bool wxFrame::IsMaximized() const +bool wxFrameOS2::IsMaximized() const { SWP vSwp; bool bIconic; ::WinQueryWindowPos(m_hFrame, &vSwp); return (vSwp.fl & SWP_MAXIMIZE); -} // end of wxFrame::IsMaximized +} // end of wxFrameOS2::IsMaximized -void wxFrame::SetIcon( +void wxFrameOS2::SetIcon( const wxIcon& rIcon ) { @@ -460,10 +467,10 @@ void wxFrame::SetIcon( ,(MPARAM)0 ); } -} // end of wxFrame::SetIcon +} // end of wxFrameOS2::SetIcon #if wxUSE_STATUSBAR -wxStatusBar* wxFrame::OnCreateStatusBar( +wxStatusBar* wxFrameOS2::OnCreateStatusBar( int nNumber , long lulStyle , wxWindowID vId @@ -498,9 +505,9 @@ wxStatusBar* wxFrame::OnCreateStatusBar( ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)~0, 0); return pStatusBar; -} // end of wxFrame::OnCreateStatusBar +} // end of wxFrameOS2::OnCreateStatusBar -void wxFrame::PositionStatusBar() +void wxFrameOS2::PositionStatusBar() { SWP vSwp; ERRORID vError; @@ -545,19 +552,19 @@ void wxFrame::PositionStatusBar() return; } } -} // end of wxFrame::PositionStatusBar +} // end of wxFrameOS2::PositionStatusBar #endif // wxUSE_STATUSBAR -void wxFrame::DetachMenuBar() +void wxFrameOS2::DetachMenuBar() { if (m_frameMenuBar) { m_frameMenuBar->Detach(); m_frameMenuBar = NULL; } -} // end of wxFrame::DetachMenuBar +} // end of wxFrameOS2::DetachMenuBar -void wxFrame::SetMenuBar( +void wxFrameOS2::SetMenuBar( wxMenuBar* pMenuBar ) { @@ -606,11 +613,48 @@ void wxFrame::SetMenuBar( } InternalSetMenuBar(); m_frameMenuBar = pMenuBar; - pMenuBar->Attach(this); + pMenuBar->Attach((wxFrame*)this); + } +} // end of wxFrameOS2::SetMenuBar + +void wxFrameOS2::AttachMenuBar( + wxMenuBar* pMenubar +) +{ + m_frameMenuBar = pMenubar; + + if (!pMenubar) + { + // + // Actually remove the menu from the frame + // + m_hMenu = (WXHMENU)0; + InternalSetMenuBar(); + } + else // Set new non NULL menu bar + { + // + // Can set a menubar several times. + // + if (pMenubar->GetHMenu()) + { + m_hMenu = pMenubar->GetHMenu(); + } + else + { + if (pMenubar->IsAttached()) + pMenubar->Detach(); + + m_hMenu = pMenubar->Create(); + + if (!m_hMenu) + return; + } + InternalSetMenuBar(); } -} // end of wxFrame::SetMenuBar +} // end of wxFrameOS2::AttachMenuBar -void wxFrame::InternalSetMenuBar() +void wxFrameOS2::InternalSetMenuBar() { ERRORID vError; wxString sError; @@ -630,13 +674,13 @@ void wxFrame::InternalSetMenuBar() sError = wxPMErrorToStr(vError); wxLogError("Error setting parent for submenu. Error: %s\n", sError); } - WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); -} // end of wxFrame::InternalSetMenuBar + ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); +} // end of wxFrameOS2::InternalSetMenuBar // // Responds to colour changes, and passes event on to children // -void wxFrame::OnSysColourChanged( +void wxFrameOS2::OnSysColourChanged( wxSysColourChangedEvent& rEvent ) { @@ -657,10 +701,10 @@ void wxFrame::OnSysColourChanged( // Propagate the event to the non-top-level children // wxWindow::OnSysColourChanged(rEvent); -} // end of wxFrame::OnSysColourChanged +} // end of wxFrameOS2::OnSysColourChanged // Pass TRUE to show full screen, FALSE to restore. -bool wxFrame::ShowFullScreen( +bool wxFrameOS2::ShowFullScreen( bool bShow , long lStyle ) @@ -706,9 +750,9 @@ bool wxFrame::ShowFullScreen( if (lStyle & wxFULLSCREEN_NOMENUBAR) { - ::WinSetParent(m_hMenu, GetHWND(), FALSE); - ::WinSetOwner(m_hMenu, GetHWND()); - ::WinSendMsg((HWND)GetHWND(), WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); + ::WinSetParent(m_hMenu, m_hFrame, FALSE); + ::WinSetOwner(m_hMenu, m_hFrame); + ::WinSendMsg((HWND)m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); } #if wxUSE_STATUSBAR @@ -732,16 +776,16 @@ bool wxFrame::ShowFullScreen( // // Save the 'normal' window style // - m_lFsOldWindowStyle = ::WinQueryWindowULong((HWND)GetHWND(), QWL_STYLE); + m_lFsOldWindowStyle = ::WinQueryWindowULong(m_hFrame, QWL_STYLE); // - // Save the old position, width & height, maximize state + // Save the old position, width & height, maximize state // m_vFsOldSize = GetRect(); m_bFsIsMaximized = IsMaximized(); // - // Decide which window style flags to turn off + // Decide which window style flags to turn off // LONG lNewStyle = m_lFsOldWindowStyle; LONG lOffFlags = 0; @@ -756,7 +800,7 @@ bool wxFrame::ShowFullScreen( // // Change our window style to be compatible with full-screen mode // - ::WinSetWindowULong((HWND)GetHWND(), QWL_STYLE, (ULONG)lNewStyle); + ::WinSetWindowULong((HWND)m_hFrame, QWL_STYLE, (ULONG)lNewStyle); // // Resize to the size of the desktop @@ -827,13 +871,13 @@ bool wxFrame::ShowFullScreen( if ((m_lFsStyle & wxFULLSCREEN_NOMENUBAR) && (m_hMenu != 0)) { - ::WinSetParent(m_hMenu, GetHWND(), FALSE); - ::WinSetOwner(m_hMenu, GetHWND()); - ::WinSendMsg((HWND)GetHWND(), WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); + ::WinSetParent(m_hMenu, m_hFrame, FALSE); + ::WinSetOwner(m_hMenu, m_hFrame); + ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); } Maximize(m_bFsIsMaximized); - ::WinSetWindowULong( (HWND)GetHWND() + ::WinSetWindowULong( m_hFrame ,QWL_STYLE ,(ULONG)m_lFsOldWindowStyle ); @@ -847,12 +891,12 @@ bool wxFrame::ShowFullScreen( ); return TRUE; } -} // end of wxFrame::ShowFullScreen +} // end of wxFrameOS2::ShowFullScreen // // Frame window // -bool wxFrame::OS2Create( +bool wxFrameOS2::OS2Create( int nId , wxWindow* pParent , const wxChar* zWclass @@ -982,6 +1026,22 @@ bool wxFrame::OS2Create( wxAssociateWinWithHandle(m_hWnd, this); wxAssociateWinWithHandle(m_hFrame, this); + m_backgroundColour.Set(wxString("GREY")); + + LONG lColor = (LONG)m_backgroundColour.GetPixel(); + + if (!::WinSetPresParam( m_hWnd + ,PP_BACKGROUNDCOLOR + ,sizeof(LONG) + ,(PVOID)&lColor + )) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + wxLogError("Error creating frame. Error: %s\n", sError); + return FALSE; + } + // // Now need to subclass window. Instead of calling the SubClassWin in wxWindow // we manually subclass here because we don't want to use the main wxWndProc @@ -1012,10 +1072,10 @@ bool wxFrame::OS2Create( // if (!::WinSetWindowPos( m_hWnd ,HWND_TOP - ,nX + 20 - ,nY + 20 - ,nWidth - 60 - ,nHeight - 60 + ,nX // + 20 + ,nY // + 20 + ,nWidth // - 60 + ,nHeight // - 60 ,SWP_SIZE | SWP_MOVE | SWP_ACTIVATE | SWP_ZORDER )) { @@ -1024,55 +1084,65 @@ bool wxFrame::OS2Create( wxLogError("Error sizing client. Error: %s\n", sError); return FALSE; } - -/* - uCtlCount = SHORT1FROMMP(::WinSendMsg(GetHWND(), WM_FORMATFRAME, (MPARAM)vSwp, (MPARAM)vRect)); - for (int i = 0; i < uCtlCount; i++) - { - if (vSwp[i].hwnd == GetHWND()) - memcpy(&m_vSwp, &vSwp[i], sizeof(SWP)); - else if (vSwp[i].hwnd == m_hVScroll) - memcpy(&m_vSwpVScroll, &vSwp[i], sizeof(SWP)); - else if (vSwp[i].hwnd == m_hHScroll) - memcpy(&m_vSwpVScroll, &vSwp[i], sizeof(SWP)); - else if (vSwp[i].hwnd == m_hTitleBar) - memcpy(&m_vSwpTitleBar, &vSwp[i], sizeof(SWP)); - }*/ return TRUE; -} // end of wxFrame::OS2Create +} // end of wxFrameOS2::OS2Create // // Default activation behaviour - set the focus for the first child // subwindow found. // -void wxFrame::OnActivate( +void wxFrameOS2::OnActivate( wxActivateEvent& rEvent ) { - for (wxWindowList::Node* pNode = GetChildren().GetFirst(); - pNode; - pNode = pNode->GetNext()) + if ( rEvent.GetActive() ) + { + // restore focus to the child which was last focused + wxLogTrace(_T("focus"), _T("wxFrame %08x activated."), m_hWnd); + + wxWindow* pParent = m_pWinLastFocused ? m_pWinLastFocused->GetParent() + : NULL; + if (!pParent) + { + pParent = this; + } + + wxSetFocusToChild( pParent + ,&m_pWinLastFocused + ); + } + else // deactivating { - // FIXME all this is totally bogus - we need to do the same as wxPanel, - // but how to do it without duplicating the code? + // + // Remember the last focused child if it is our child + // + m_pWinLastFocused = FindFocus(); + + for (wxWindowList::Node* pNode = GetChildren().GetFirst(); + pNode; + pNode = pNode->GetNext()) + { + // FIXME all this is totally bogus - we need to do the same as wxPanel, + // but how to do it without duplicating the code? - // restore focus - wxWindow* pChild = pNode->GetData(); + // restore focus + wxWindow* pChild = pNode->GetData(); - if (!pChild->IsTopLevel() + if (!pChild->IsTopLevel() #if wxUSE_TOOLBAR - && !wxDynamicCast(pChild, wxToolBar) + && !wxDynamicCast(pChild, wxToolBar) #endif // wxUSE_TOOLBAR #if wxUSE_STATUSBAR - && !wxDynamicCast(pChild, wxStatusBar) + && !wxDynamicCast(pChild, wxStatusBar) #endif // wxUSE_STATUSBAR - ) - { - pChild->SetFocus(); - return; + ) + { + pChild->SetFocus(); + return; + } } } -} // end of wxFrame::OnActivate +} // end of wxFrameOS2::OnActivate // ---------------------------------------------------------------------------- // wxFrame size management: we exclude the areas taken by menu/status/toolbars @@ -1081,7 +1151,7 @@ void wxFrame::OnActivate( // ---------------------------------------------------------------------------- // Checks if there is a toolbar, and returns the first free client position -wxPoint wxFrame::GetClientAreaOrigin() const +wxPoint wxFrameOS2::GetClientAreaOrigin() const { wxPoint vPoint(0, 0); @@ -1107,7 +1177,7 @@ wxPoint wxFrame::GetClientAreaOrigin() const } #endif //wxUSE_TOOLBAR return vPoint; -} // end of wxFrame::GetClientAreaOrigin +} // end of wxFrameOS2::GetClientAreaOrigin // ---------------------------------------------------------------------------- // tool/status bar stuff @@ -1115,7 +1185,7 @@ wxPoint wxFrame::GetClientAreaOrigin() const #if wxUSE_TOOLBAR -wxToolBar* wxFrame::CreateToolBar( +wxToolBar* wxFrameOS2::CreateToolBar( long lStyle , wxWindowID vId , const wxString& rName @@ -1129,9 +1199,9 @@ wxToolBar* wxFrame::CreateToolBar( PositionToolBar(); } return m_frameToolBar; -} // end of wxFrame::CreateToolBar +} // end of wxFrameOS2::CreateToolBar -void wxFrame::PositionToolBar() +void wxFrameOS2::PositionToolBar() { HWND hWndClient; RECTL vRect; @@ -1152,12 +1222,12 @@ void wxFrame::PositionToolBar() } #endif // wxUSE_STATUSBAR - if ( GetToolBar() ) + if ( m_frameToolBar ) { int nToolbarWidth; int nToolbarHeight; - GetToolBar()->GetSize( &nToolbarWidth + m_frameToolBar->GetSize( &nToolbarWidth ,&nToolbarHeight ); @@ -1180,7 +1250,7 @@ void wxFrame::PositionToolBar() ,wxSIZE_NO_ADJUSTMENTS ); } -} // end of wxFrame::PositionToolBar +} // end of wxFrameOS2::PositionToolBar #endif // wxUSE_TOOLBAR // ---------------------------------------------------------------------------- @@ -1192,7 +1262,7 @@ void wxFrame::PositionToolBar() // Windows behaviour where child frames float independently of the parent one // on the desktop, but are iconized/restored with it // -void wxFrame::IconizeChildFrames( +void wxFrameOS2::IconizeChildFrames( bool bIconize ) { @@ -1207,7 +1277,7 @@ void wxFrame::IconizeChildFrames( ((wxFrame *)pWin)->Iconize(bIconize); } } -} // end of wxFrame::IconizeChildFrames +} // end of wxFrameOS2::IconizeChildFrames // =========================================================================== // message processing @@ -1216,7 +1286,7 @@ void wxFrame::IconizeChildFrames( // --------------------------------------------------------------------------- // preprocessing // --------------------------------------------------------------------------- -bool wxFrame::OS2TranslateMessage( +bool wxFrameOS2::OS2TranslateMessage( WXMSG* pMsg ) { @@ -1234,12 +1304,12 @@ bool wxFrame::OS2TranslateMessage( #else return FALSE; #endif //wxUSE_ACCEL -} // end of wxFrame::OS2TranslateMessage +} // end of wxFrameOS2::OS2TranslateMessage // --------------------------------------------------------------------------- // our private (non virtual) message handlers // --------------------------------------------------------------------------- -bool wxFrame::HandlePaint() +bool wxFrameOS2::HandlePaint() { RECTL vRect; @@ -1253,7 +1323,7 @@ bool wxFrame::HandlePaint() HPOINTER hIcon; if (m_icon.Ok()) - hIcon = (HPOINTER)::WinSendMsg(GetHWND(), WM_QUERYICON, 0L, 0L); + hIcon = (HPOINTER)::WinSendMsg(m_hFrame, WM_QUERYICON, 0L, 0L); else hIcon = (HPOINTER)m_hDefaultIcon; @@ -1288,7 +1358,7 @@ bool wxFrame::HandlePaint() } else { - return wxWindow::HandlePaint(); + return(wxWindow::HandlePaint()); } } else @@ -1297,9 +1367,9 @@ bool wxFrame::HandlePaint() return TRUE; } return FALSE; -} // end of wxFrame::HandlePaint +} // end of wxFrameOS2::HandlePaint -bool wxFrame::HandleSize( +bool wxFrameOS2::HandleSize( int nX , int nY , WXUINT nId @@ -1321,6 +1391,7 @@ bool wxFrame::HandleSize( // restore all child frames too // IconizeChildFrames(FALSE); + (void)SendIconizeEvent(FALSE); // // fall through @@ -1335,6 +1406,7 @@ bool wxFrame::HandleSize( // Iconize all child frames too // IconizeChildFrames(TRUE); + (void)SendIconizeEvent(); m_bIconized = TRUE; break; } @@ -1373,9 +1445,9 @@ bool wxFrame::HandleSize( bProcessed = GetEventHandler()->ProcessEvent(vEvent); } return bProcessed; -} // end of wxFrame::HandleSize +} // end of wxFrameOS2::HandleSize -bool wxFrame::HandleCommand( +bool wxFrameOS2::HandleCommand( WXWORD nId , WXWORD nCmd , WXHWND hControl @@ -1416,9 +1488,9 @@ bool wxFrame::HandleCommand( } } return FALSE; -} // end of wxFrame::HandleCommand +} // end of wxFrameOS2::HandleCommand -bool wxFrame::HandleMenuSelect( +bool wxFrameOS2::HandleMenuSelect( WXWORD nItem , WXWORD nFlags , WXHMENU hMenu @@ -1440,7 +1512,7 @@ bool wxFrame::HandleMenuSelect( } } return TRUE; -} // end of wxFrame::HandleMenuSelect +} // end of wxFrameOS2::HandleMenuSelect // --------------------------------------------------------------------------- // Main Frame window proc @@ -1553,13 +1625,6 @@ MRESULT EXPENTRY wxFrameWndProc( // When we get the first message for the HWND we just created, we associate // it with wxWindow stored in wxWndHook // -// if (!pWnd && wxWndHook) -// { -// wxAssociateWinWithHandle(hWnd, wxWndHook); -// pWnd = wxWndHook; -// wxWndHook = NULL; -// pWnd->SetHWND((WXHWND)hWnd); -// } MRESULT rc = (MRESULT)0; bool bProcessed = FALSE; @@ -1575,92 +1640,15 @@ MRESULT EXPENTRY wxFrameWndProc( } else { - switch (ulMsg) - { - case WM_CLOSE: - // - // If we can't close, tell the system that we processed the - // message - otherwise it would close us - // - bProcessed = !pWnd->Close(); - break; - - case WM_PAINT: - { - HPS hPS; - RECTL vRect; - - hPS = WinBeginPaint(hWnd, 0L, &vRect); - WinFillRect(hPS, &vRect, CLR_BLUE /* SYSCLR_WINDOW */); - WinEndPaint(hPS); - rc = FALSE; - break; - } - break; - - case WM_COMMAND: - { - WORD wId; - WORD wCmd; - WXHWND hWnd; - - pWnd->UnpackCommand( (WXWPARAM)wParam - ,(WXLPARAM)lParam - ,&wId - ,&hWnd - ,&wCmd - ); - rc = (MRESULT) pWnd->HandleCommand( wId - ,wCmd - ,(WXHWND)hWnd - ); - } - break; - - case WM_MENUSELECT: - { - WXWORD wItem; - WXWORD wFlags; - WXHMENU hMenu; - - pWnd->UnpackMenuSelect( wParam - ,lParam - ,&wItem - ,&wFlags - ,&hMenu - ); - bProcessed = pWnd->HandleMenuSelect( wItem - ,wFlags - ,hMenu - ); - rc = (MRESULT)TRUE; - } - break; - - case WM_SIZE: - { - SHORT nScxold = SHORT1FROMMP(wParam); // Old horizontal size. - SHORT nScyold = SHORT2FROMMP(wParam); // Old vertical size. - SHORT nScxnew = SHORT1FROMMP(lParam); // New horizontal size. - SHORT nScynew = SHORT2FROMMP(lParam); // New vertical size. - - lParam = MRFROM2SHORT( nScxnew - 20 - ,nScynew - 30 - ); - } - - bProcessed = pWnd->HandleSize(LOWORD(lParam), HIWORD(lParam), (WXUINT)wParam); - rc = (MRESULT)FALSE; - break; - - default: - rc = ::WinDefWindowProc(hWnd, ulMsg, wParam, lParam); - } + if (pWnd) + rc = pWnd->OS2WindowProc(ulMsg, wParam, lParam); + else + rc = ::WinDefWindowProc(hWnd, ulMsg, wParam, lParam); } return rc; } // end of wxFrameWndProc -MRESULT wxFrame::OS2WindowProc( +MRESULT wxFrameOS2::OS2WindowProc( WXUINT uMessage , WXWPARAM wParam , WXLPARAM lParam @@ -1679,18 +1667,34 @@ MRESULT wxFrame::OS2WindowProc( bProcessed = !Close(); break; - case WM_COMMAND: + case WM_PAINT: + bProcessed = HandlePaint(); + mRc = (MRESULT)FALSE; + break; + + case WM_ERASEBACKGROUND: + // + // Returning TRUE to requests PM to paint the window background + // in SYSCLR_WINDOW. We capture this here because the PS returned + // in Frames is the PS for the whole frame, which we can't really + // use at all. If you want to paint a different background, do it + // in an OnPaint using a wxPaintDC. + // + mRc = (MRESULT)(TRUE); + break; + + case WM_COMMAND: { WORD wId; WORD wCmd; WXHWND hWnd; UnpackCommand( (WXWPARAM)wParam - ,(WXLPARAM)lParam - ,&wId - ,&hWnd - ,&wCmd - ); + ,(WXLPARAM)lParam + ,&wId + ,&hWnd + ,&wCmd + ); bProcessed = HandleCommand( wId ,wCmd @@ -1719,17 +1723,19 @@ MRESULT wxFrame::OS2WindowProc( } break; - case WM_PAINT: - bProcessed = HandlePaint(); - break; + case WM_SIZE: + { + SHORT nScxold = SHORT1FROMMP(wParam); // Old horizontal size. + SHORT nScyold = SHORT2FROMMP(wParam); // Old vertical size. + SHORT nScxnew = SHORT1FROMMP(lParam); // New horizontal size. + SHORT nScynew = SHORT2FROMMP(lParam); // New vertical size. - case WM_ERASEBACKGROUND: - // - // Return TRUE to request PM to paint the window background - // in SYSCLR_WINDOW. - // - bProcessed = TRUE; - mRc = (MRESULT)(TRUE); + lParam = MRFROM2SHORT( nScxnew - 20 + ,nScynew - 30 + ); + } + bProcessed = HandleSize(LOWORD(lParam), HIWORD(lParam), (WXUINT)wParam); + mRc = (MRESULT)FALSE; break; case CM_QUERYDRAGIMAGE: @@ -1744,91 +1750,6 @@ MRESULT wxFrame::OS2WindowProc( bProcessed = mRc != 0; } break; - - case WM_SIZE: - bProcessed = HandleSize(LOWORD(lParam), HIWORD(lParam), (WXUINT)wParam); - break; - - case WM_QUERYFRAMECTLCOUNT: - { - USHORT itemCount = SHORT1FROMMR(OS2GetOldWndProc()(GetHWND(), uMessage, wParam, lParam)); -#if wxUSE_STATUSBAR - if(m_frameStatusBar) - ++itemCount; -#endif //wxUSE_STATUSBAR - - bProcessed = TRUE; - mRc = MRFROMSHORT( itemCount ); - } - break; - - case WM_FORMATFRAME: - { - PSWP pSWP = 0; - USHORT usClient = 0; - SWP swp; - USHORT itemCount; - char s[128]; - - itemCount = SHORT1FROMMR(OS2GetOldWndProc()(GetHWND(), uMessage, wParam, lParam)); - pSWP = (PSWP)PVOIDFROMMP( wParam ); - - while(pSWP[usClient].hwnd != WinWindowFromID(GetHWND(), FID_CLIENT) - && usClient < itemCount) - usClient++; - -#if wxUSE_STATUSBAR - if(m_frameStatusBar) - { - int height; - - m_frameStatusBar->GetSize(NULL, &height); - - if(usClient == itemCount) - { - // frame has no client window - // using another method of calculation - RECTL wRectl; - - ::WinQueryWindowRect(GetHWND(), &wRectl); - ::WinMapWindowPoints(GetHWND(), HWND_DESKTOP, (PPOINTL)&wRectl, 2); - ::WinCalcFrameRect(GetHWND(), &wRectl, TRUE); - ::WinMapWindowPoints(HWND_DESKTOP, GetHWND(), (PPOINTL)&wRectl, 2); - - pSWP[itemCount].x = wRectl.xLeft; - pSWP[itemCount].y = wRectl.yBottom; - pSWP[itemCount].cx = wRectl.xRight - wRectl.xLeft - 1; - pSWP[itemCount].cy = height; - pSWP[itemCount].fl = SWP_SIZE | - SWP_MOVE | - SWP_SHOW; - pSWP[itemCount].hwnd = m_frameStatusBar->GetHWND(); - pSWP[itemCount].hwndInsertBehind = HWND_TOP; - ++itemCount; - } - else - { - pSWP[itemCount].x = pSWP[usClient].x; - pSWP[itemCount].y = pSWP[usClient].y; - pSWP[itemCount].cx = pSWP[usClient].cx; - pSWP[itemCount].cy = height; - pSWP[itemCount].fl = SWP_SIZE | - SWP_MOVE | - SWP_SHOW; - pSWP[itemCount].hwnd = m_frameStatusBar->GetHWND(); - pSWP[itemCount].hwndInsertBehind = HWND_TOP; - pSWP[usClient].cy -= height; - pSWP[usClient].y += height; - - ++itemCount; - } - } -#endif //wxUSE_STATUSBAR - - bProcessed = TRUE; - mRc = MRFROMSHORT(itemCount); - } - break; } if (!bProcessed ) @@ -1837,14 +1758,14 @@ MRESULT wxFrame::OS2WindowProc( ,lParam ); return (MRESULT)mRc; -} // wxFrame::OS2WindowProc +} // wxFrameOS2::OS2WindowProc -void wxFrame::SetClient(WXHWND c_Hwnd) +void wxFrameOS2::SetClient(WXHWND c_Hwnd) { // Duh...nothing to do under OS/2 } -void wxFrame::SetClient( +void wxFrameOS2::SetClient( wxWindow* pWindow ) { @@ -1865,7 +1786,7 @@ void wxFrame::SetClient( pOldClient->Show( FALSE ); ::WinSetWindowUShort(pOldClient->GetHWND(), QWS_ID, (USHORT)pOldClient->GetId()); // to avoid OS/2 bug need to update frame - ::WinSendMsg((HWND)this->GetHWND(), WM_UPDATEFRAME, (MPARAM)~0, 0); + ::WinSendMsg((HWND)this->GetFrame(), WM_UPDATEFRAME, (MPARAM)~0, 0); return; } @@ -1890,11 +1811,11 @@ void wxFrame::SetClient( if( this->IsShown() ) { this->Show(); - ::WinSendMsg(GetHWND(), WM_UPDATEFRAME, (MPARAM)~0, 0); + ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)~0, 0); } } -wxWindow* wxFrame::GetClient() +wxWindow* wxFrameOS2::GetClient() { - return wxFindWinFromHandle((WXHWND)::WinWindowFromID(GetHWND(), FID_CLIENT)); + return wxFindWinFromHandle((WXHWND)::WinWindowFromID(m_hFrame, FID_CLIENT)); }