X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/542875a8c4f12b16fef8c1c25ee7e8166902f9bb..89e60357485b3da6e7ed7995fbcf8722d3df7ef4:/src/os2/frame.cpp diff --git a/src/os2/frame.cpp b/src/os2/frame.cpp index 4c15e005b4..f3c22d5db5 100644 --- a/src/os2/frame.cpp +++ b/src/os2/frame.cpp @@ -125,12 +125,6 @@ bool wxFrame::Create( m_bIconized = FALSE; - // - // We pass NULL as parent to MSWCreate because frames with parents behave - // very strangely under Win95 shell. - // Alteration by JACS: keep normal Windows behaviour (float on top of parent) - // with this ulStyle. - // if ((m_windowStyle & wxFRAME_FLOAT_ON_PARENT) == 0) pParent = NULL; @@ -345,31 +339,60 @@ void wxFrame::DoGetPosition( // ---------------------------------------------------------------------------- void wxFrame::DoShowWindow( - int nShowCmd + int bShowCmd ) { - ::WinShowWindow(GetHwnd(), nShowCmd); - m_bIconized = nShowCmd == SWP_MINIMIZE; + HWND hClient; + HWND hTitlebar = NULLHANDLE; + HWND hHScroll = NULLHANDLE; + HWND hVScroll = NULLHANDLE; + HWND hMenuBar = NULLHANDLE; + SWP vSwp; + SWP vSwpTitlebar; + SWP vSwpVScroll; + SWP vSwpHScroll; + SWP vSwpMenu; + + // + // Send anything to initialize the frame + // + WinQueryWindowPos(GetHwnd(), &vSwp); + hClient = WinWindowFromID(GetHwnd(), FID_CLIENT); + hTitlebar = WinWindowFromID(GetHwnd(), FID_TITLEBAR); + WinQueryWindowPos(hTitlebar, &vSwpTitlebar); + hHScroll = WinWindowFromID(GetHwnd(), FID_HORZSCROLL); + WinQueryWindowPos(hHScroll, &vSwpHScroll); + hVScroll = WinWindowFromID(GetHwnd(), FID_VERTSCROLL); + WinQueryWindowPos(hVScroll, &vSwpVScroll); + hMenuBar = WinWindowFromID(GetHwnd(), FID_MENU); + WinQueryWindowPos(hMenuBar, &vSwpMenu); + WinSetWindowPos( hClient + ,HWND_TOP + ,SV_CXSIZEBORDER + ,(SV_CYSIZEBORDER - 1) + vSwpHScroll.cy + ,vSwp.cx - ((SV_CXSIZEBORDER * 2) + vSwpVScroll.cx) + ,vSwp.cy - ((SV_CYSIZEBORDER * 2) + 1 + vSwpTitlebar.cy + vSwpMenu.cy + vSwpHScroll.cy) + ,SWP_SIZE | SWP_MOVE + ); + ::WinShowWindow(GetHwnd(), (BOOL)bShowCmd); + ::WinShowWindow(hClient, (BOOL)bShowCmd); } // end of wxFrame::DoShowWindow bool wxFrame::Show( bool bShow ) { - DoShowWindow(bShow ? SWP_SHOW : SWP_HIDE); + SWP vSwp; + + DoShowWindow((int)bShow); if (bShow) { wxActivateEvent vEvent(wxEVT_ACTIVATE, TRUE, m_windowId); - ::WinSetWindowPos( (HWND) GetHWND() - ,HWND_TOP - ,0 - ,0 - ,0 - ,0 - ,SWP_ZORDER - ); + ::WinQueryWindowPos(GetHwnd(), &vSwp); + m_bIconized = vSwp.fl & SWP_MINIMIZE; + ::WinEnableWindow(GetHwnd(), TRUE); vEvent.SetEventObject(this); GetEventHandler()->ProcessEvent(vEvent); } @@ -382,15 +405,18 @@ bool wxFrame::Show( { HWND hWndParent = GetHwndOf(GetParent()); + ::WinQueryWindowPos(hWndParent, &vSwp); + m_bIconized = vSwp.fl & SWP_MINIMIZE; if (hWndParent) ::WinSetWindowPos( hWndParent ,HWND_TOP - ,0 - ,0 - ,0 - ,0 - ,SWP_ZORDER + ,vSwp.x + ,vSwp.y + ,vSwp.cx + ,vSwp.cy + ,SWP_ZORDER | SWP_ACTIVATE | SWP_SHOW | SWP_MOVE ); + ::WinEnableWindow(hWndParent, TRUE); } } return TRUE; @@ -444,13 +470,18 @@ void wxFrame::SetIcon( { wxFrameBase::SetIcon(rIcon); - if (m_icon.Ok()) + if ((m_icon.GetHICON()) != NULLHANDLE) { - WinSendMsg( GetHwnd() - ,WM_SETICON - ,(MPARAM)((HICON)m_icon.GetHICON()) - ,NULL - ); + ::WinSendMsg( GetHwnd() + ,WM_SETICON + ,(MPARAM)((HPOINTER)m_icon.GetHICON()) + ,NULL + ); + ::WinSendMsg( GetHwnd() + ,WM_UPDATEFRAME + ,(MPARAM)FCF_ICON + ,(MPARAM)0 + ); } } // end of wxFrame::SetIcon @@ -521,30 +552,51 @@ void wxFrame::SetMenuBar( wxMenuBar* pMenuBar ) { + ERRORID vError; + wxString sError; + if (!pMenuBar) { DetachMenuBar(); return; } - wxCHECK_RET(!pMenuBar->GetFrame(), wxT("this menubar is already attached")); + m_frameMenuBar = NULL; - if (m_frameMenuBar) - delete m_frameMenuBar; - - m_hMenu = pMenuBar->Create(); - m_ulMenubarId = pMenuBar->GetMenubarId(); - if (m_ulMenubarId != FID_MENU) + // Can set a menubar several times. + // TODO: how to prevent a memory leak if you have a currently-unattached + // menubar? wxWindows assumes that the frame will delete the menu (otherwise + // there are problems for MDI). + if (pMenuBar->GetHMenu()) { - ::WinSetWindowUShort( m_hMenu - ,QWS_ID - ,(unsigned short)m_ulMenubarId - ); + m_hMenu = pMenuBar->GetHMenu(); } + else + { + pMenuBar->Detach(); - if (!m_hMenu) - return; + m_hMenu = pMenuBar->Create(); + + if (!m_hMenu) + return; + } + + // + // Set the parent and owner of the menubar to be the frame + // + if (!::WinSetParent(m_hMenu, GetHwnd(), FALSE)) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + wxLogError("Error setting parent for submenu. Error: %s\n", sError); + } + if (!::WinSetOwner(m_hMenu, GetHwnd())) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + wxLogError("Error setting parent for submenu. Error: %s\n", sError); + } InternalSetMenuBar(); m_frameMenuBar = pMenuBar; @@ -553,12 +605,7 @@ void wxFrame::SetMenuBar( void wxFrame::InternalSetMenuBar() { - - ::WinPostMsg( GetHwnd() - ,WM_UPDATEFRAME - ,(MPARAM)FCF_MENU - ,NULL - ); + WinSendMsg((HWND)GetHwnd(), WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); } // end of wxFrame::InternalSetMenuBar // @@ -725,90 +772,196 @@ bool wxFrame::OS2Create( , long ulStyle ) { - ULONG ulPmFlags = 0; - ULONG ulExtraFlags = 0; - ULONG ulTempFlags = FCF_TITLEBAR | - FCF_SYSMENU | - FCF_MINBUTTON | - FCF_MAXBUTTON | - FCF_SIZEBORDER | - FCF_ICON | - FCF_MENU | - FCF_ACCELTABLE | - FCF_SHELLPOSITION | - FCF_TASKLIST; + ULONG ulCreateFlags = 0L; + ULONG ulStyleFlags = 0L; + ULONG ulExtraFlags = 0L; + FRAMECDATA vFrameCtlData; + HWND hParent = NULLHANDLE; + HWND hClient = NULLHANDLE; + HWND hTitlebar = NULLHANDLE; + HWND hHScroll = NULLHANDLE; + HWND hVScroll = NULLHANDLE; + HWND hMenuBar = NULLHANDLE; + HWND hMenu1 = NULLHANDLE; + HWND hMenu2 = NULLHANDLE; + HWND hFrame = NULLHANDLE; + SWP vSwp; + SWP vSwpTitlebar; + SWP vSwpVScroll; + SWP vSwpHScroll; + SWP vSwpMenu; + RGB2 vRgb; m_hDefaultIcon = (WXHICON) (wxSTD_FRAME_ICON ? wxSTD_FRAME_ICON : wxDEFAULT_FRAME_ICON); + memset(&vSwp, '\0', sizeof(SWP)); + memset(&vSwpTitlebar, '\0', sizeof(SWP)); + memset(&vSwpVScroll, '\0', sizeof(SWP)); + memset(&vSwpHScroll, '\0', sizeof(SWP)); - if ((ulStyle & wxCAPTION) == wxCAPTION) - ulPmFlags = FCF_TASKLIST; + if (pParent) + hParent = GetWinHwnd(pParent); else - ulPmFlags = FCF_NOMOVEWITHOWNER; - - if (ulStyle & wxMINIMIZE_BOX) - ulPmFlags |= FCF_MINBUTTON; - if (ulStyle & wxMAXIMIZE_BOX) - ulPmFlags |= FCF_MAXBUTTON; - if (ulStyle & wxTHICK_FRAME) - ulPmFlags |= FCF_DLGBORDER; - if (ulStyle & wxSYSTEM_MENU) - ulPmFlags |= FCF_SYSMENU; + hParent = HWND_DESKTOP; + + if (ulStyle == wxDEFAULT_FRAME_STYLE) + ulCreateFlags = FCF_SIZEBORDER | FCF_TITLEBAR | FCF_SYSMENU | + FCF_MINMAX | FCF_VERTSCROLL | FCF_HORZSCROLL | FCF_TASKLIST; + else + { + if ((ulStyle & wxCAPTION) == wxCAPTION) + ulCreateFlags = FCF_TASKLIST; + else + ulCreateFlags = FCF_NOMOVEWITHOWNER; + + if (ulStyle & wxMINIMIZE_BOX) + ulCreateFlags |= FCF_MINBUTTON; + if (ulStyle & wxMAXIMIZE_BOX) + ulCreateFlags |= FCF_MAXBUTTON; + if (ulStyle & wxTHICK_FRAME) + ulCreateFlags |= FCF_DLGBORDER; + if (ulStyle & wxSYSTEM_MENU) + ulCreateFlags |= FCF_SYSMENU; + if (ulStyle & wxCAPTION) + ulCreateFlags |= FCF_TASKLIST; + if (ulStyle & wxCLIP_CHILDREN) + { + // Invalid for frame windows under PM + } + + if (ulStyle & wxTINY_CAPTION_VERT) + ulCreateFlags |= FCF_TASKLIST; + if (ulStyle & wxTINY_CAPTION_HORIZ) + ulCreateFlags |= FCF_TASKLIST; + + if ((ulStyle & wxTHICK_FRAME) == 0) + ulCreateFlags |= FCF_BORDER; + if (ulStyle & wxFRAME_TOOL_WINDOW) + ulExtraFlags = kFrameToolWindow; + + if (ulStyle & wxSTAY_ON_TOP) + ulCreateFlags |= FCF_SYSMODAL; + } if ((ulStyle & wxMINIMIZE) || (ulStyle & wxICONIZE)) - ulPmFlags |= WS_MINIMIZED; + ulStyleFlags |= WS_MINIMIZED; if (ulStyle & wxMAXIMIZE) - ulPmFlags |= WS_MAXIMIZED; - if (ulStyle & wxCAPTION) - ulPmFlags |= FCF_TASKLIST; - if (ulStyle & wxCLIP_CHILDREN) + ulStyleFlags |= WS_MAXIMIZED; + + // + // Clear the visible flag, we always call show + // + ulStyleFlags &= (unsigned long)~WS_VISIBLE; + m_bIconized = FALSE; + + // + // Set the frame control block + // + vFrameCtlData.cb = sizeof(vFrameCtlData); + vFrameCtlData.flCreateFlags = ulCreateFlags; + vFrameCtlData.hmodResources = 0L; + vFrameCtlData.idResources = 0; + + // + // Create the frame window + // + if (!wxWindow::OS2Create( hParent + ,WC_FRAME + ,zTitle + ,ulStyleFlags + ,(long)nX + ,(long)nY + ,(long)nWidth + ,(long)nHeight + ,NULLHANDLE + ,HWND_TOP + ,(long)nId + ,(void*)&vFrameCtlData + ,NULL + )) { - // Invalid for frame windows under PM + return FALSE; } // - // Keep this in wxFrame because it saves recoding this function - // in wxTinyFrame + // Create the client window. We must call the API from here rather than + // the static base class create because we need a separate handle // -#if wxUSE_ITSY_BITSY - if (ulStyle & wxTINY_CAPTION_VERT) - ulExtraFlags |= kVertCaption; - if (ulStyle & wxTINY_CAPTION_HORIZ) - ulExtraFlags |= kHorzCaption; -#else - if (ulStyle & wxTINY_CAPTION_VERT) - ulPmFlags |= FCF_TASKLIST; - if (ulStyle & wxTINY_CAPTION_HORIZ) - ulPmFlags |= FCF_TASKLIST; -#endif - if ((ulStyle & wxTHICK_FRAME) == 0) - ulPmFlags |= FCF_BORDER; - if (ulStyle & wxFRAME_TOOL_WINDOW) - ulExtraFlags = kFrameToolWindow; + if ((hClient = ::WinCreateWindow( hFrame // Frame is parent + ,wxFrameClassName + ,NULL // Window title + ,0 // No styles + ,0, 0, 0, 0 // Window position + ,NULLHANDLE // Owner + ,HWND_TOP // Sibling + ,FID_CLIENT // standard client ID + ,NULL // Creation data + ,NULL // Window Pres Params + )) == 0L) + { + return FALSE; + } + // + // Send anything to initialize the frame + // + ::WinSendMsg( hFrame + ,WM_UPDATEFRAME + ,(MPARAM)FCF_TASKLIST + ,(MPARAM)0 + ); + + // + // Now size everything. If adding a menu the client will need to be resized. + // + if (!::WinSetWindowPos( hFrame + ,HWND_TOP + ,nX + ,nY + ,nWidth + ,nHeight + ,SWP_SIZE | SWP_MOVE | SWP_ACTIVATE + )) + return FALSE; - if (ulStyle & wxSTAY_ON_TOP) - ulPmFlags |= FCF_SYSMODAL; + WinQueryWindowPos(hFrame, &vSwp); - if (ulPmFlags & ulTempFlags) - ulPmFlags = FCF_STANDARD; // - // Clear the visible flag, we always call show + // Set the client window's background, otherwise it is transparent! // - ulPmFlags &= (unsigned long)~WS_VISIBLE; - m_bIconized = FALSE; - if ( !wxWindow::OS2Create( nId - ,pParent - ,zWclass - ,pWxWin - ,zTitle - ,nX - ,nY - ,nWidth - ,nHeight - ,ulPmFlags - ,NULL - ,ulExtraFlags)) + wxColour vColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW); + + vRgb.bRed = (BYTE)vColour.Red(); + vRgb.bGreen = (BYTE)vColour.Green(); + vRgb.bBlue = (BYTE)vColour.Blue(); + WinSetPresParam( hClient + ,PP_BACKGROUNDCOLOR + ,(ULONG)sizeof(RGB2) + ,(PVOID)&vRgb + ); + if (ulCreateFlags & FCF_TITLEBAR) { - return FALSE; + hTitlebar = WinWindowFromID(hFrame, FID_TITLEBAR); + WinQueryWindowPos(hTitlebar, &vSwpTitlebar); } + if (ulCreateFlags & FCF_HORZSCROLL) + { + hHScroll = WinWindowFromID(hFrame, FID_HORZSCROLL); + WinQueryWindowPos(hHScroll, &vSwpHScroll); + } + if (ulCreateFlags & FCF_VERTSCROLL) + { + hVScroll = WinWindowFromID(hFrame, FID_VERTSCROLL); + WinQueryWindowPos(hVScroll, &vSwpVScroll); + } + if (!::WinSetWindowPos( hClient + ,HWND_TOP + ,SV_CXSIZEBORDER + ,(SV_CYSIZEBORDER - 1) + vSwpHScroll.cy + ,vSwp.cx - ((SV_CXSIZEBORDER * 2) + vSwpVScroll.cx) + ,vSwp.cy - ((SV_CYSIZEBORDER * 2) + 1 + vSwpTitlebar.cy + vSwpHScroll.cy) + ,SWP_SIZE | SWP_MOVE + )) + return FALSE; + WinQueryWindowPos(hClient, &vSwp); + ::WinShowWindow(hClient, TRUE); return TRUE; } // end of wxFrame::OS2Create