]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/frame.cpp
fix of previous commit
[wxWidgets.git] / src / os2 / frame.cpp
index d697f9ca5d0be16d0a5b4c185179050d382732c2..0adff13a4b31c3183e648f5ba0ee6f13eb187328 100644 (file)
@@ -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;
 
@@ -446,11 +440,16 @@ void wxFrame::SetIcon(
 
     if (m_icon.Ok())
     {
-        WinSendMsg( GetHwnd()
-                   ,WM_SETICON
-                   ,(MPARAM)((HICON)m_icon.GetHICON())
-                   ,NULL
-                  );
+        ::WinSendMsg( GetHwnd()
+                     ,WM_SETICON
+                     ,(MPARAM)((HICON)m_icon.GetHICON())
+                     ,NULL
+                    );
+        ::WinSendMsg( GetHwnd()
+                     ,WM_UPDATEFRAME
+                     ,(MPARAM)FCF_ICON
+                     ,(MPARAM)0
+                    );
     }
 } // end of wxFrame::SetIcon
 
@@ -555,12 +554,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
 
 //
@@ -727,90 +721,166 @@ 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;
+    SWP                             vSwp;
+    SWP                             vSwpTitlebar;
+    SWP                             vSwpVScroll;
+    SWP                             vSwpHScroll;
 
     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 (pParent)
+        hParent = GetWinHwnd(pParent);
+    else
+        hParent = HWND_DESKTOP;
 
-    if ((ulStyle & wxCAPTION) == wxCAPTION)
-        ulPmFlags = FCF_TASKLIST;
+    if (ulStyle == wxDEFAULT_FRAME_STYLE)
+        ulCreateFlags = FCF_SIZEBORDER | FCF_TITLEBAR | FCF_SYSMENU |
+                        FCF_MINMAX | FCF_VERTSCROLL | FCF_HORZSCROLL | FCF_TASKLIST;
     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;
-    if ((ulStyle & wxMINIMIZE) || (ulStyle & wxICONIZE))
-        ulPmFlags |= WS_MINIMIZED;
-    if (ulStyle & wxMAXIMIZE)
-        ulPmFlags |= WS_MAXIMIZED;
-    if (ulStyle & wxCAPTION)
-        ulPmFlags |= FCF_TASKLIST;
-    if (ulStyle & wxCLIP_CHILDREN)
     {
-        // Invalid for frame windows under PM
+        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))
+        ulStyleFlags |= WS_MINIMIZED;
+    if (ulStyle & wxMAXIMIZE)
+        ulStyleFlags |= WS_MAXIMIZED;
 
     //
-    // Keep this in wxFrame because it saves recoding this function
-    // in wxTinyFrame
+    // Clear the visible flag, we always call show
     //
-#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;
+    ulStyleFlags &= (unsigned long)~WS_VISIBLE;
+    m_bIconized = FALSE;
 
-    if (ulStyle & wxSTAY_ON_TOP)
-        ulPmFlags |= FCF_SYSMODAL;
+    //
+    // Set the frame control block
+    //
+    vFrameCtlData.cb            = sizeof(vFrameCtlData);
+    vFrameCtlData.flCreateFlags = ulCreateFlags;
+    vFrameCtlData.hmodResources = 0L;
+    vFrameCtlData.idResources   = 0;
 
-    if (ulPmFlags & ulTempFlags)
-        ulPmFlags = FCF_STANDARD;
     //
-    // Clear the visible flag, we always call show
+    // Create the frame window
     //
-    ulPmFlags &= (unsigned long)~WS_VISIBLE;
-    m_bIconized = FALSE;
-    if ( !wxWindow::OS2Create( nId
-                              ,pParent
-                              ,zWclass
-                              ,pWxWin
-                              ,zTitle
-                              ,nX
-                              ,nY
-                              ,nWidth
-                              ,nHeight
-                              ,ulPmFlags
-                              ,NULL
-                              ,ulExtraFlags))
+    if (!wxWindow::OS2Create( hParent
+                             ,WC_FRAME
+                             ,zTitle
+                             ,ulStyleFlags
+                             ,(long)nX
+                             ,(long)nY
+                             ,(long)nWidth
+                             ,(long)nHeight
+                             ,NULLHANDLE
+                             ,HWND_TOP
+                             ,(long)nId
+                             ,(void*)&vFrameCtlData
+                             ,NULL
+                            ))
     {
         return FALSE;
     }
+
+    //
+    // 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 ((hClient = ::WinCreateWindow( GetHwnd()   // Frame is parent
+                                     ,zWclass     // Custom client class
+                                     ,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;
+    }
+
+    //
+    // Now size everything.  If adding a menu the client will need to be resized.
+    //
+    if (!::WinSetWindowPos( GetHwnd()
+                           ,HWND_TOP
+                           ,nX
+                           ,nY
+                           ,nWidth
+                           ,nHeight
+                           ,SWP_SIZE | SWP_MOVE | SWP_ACTIVATE
+                          ))
+        return FALSE;
+
+    WinQueryWindowPos(GetHwnd(), &vSwp);
+
+    if (ulCreateFlags & FCF_TITLEBAR)
+    {
+        hTitlebar = WinWindowFromID(GetHwnd(), FID_TITLEBAR);
+        WinQueryWindowPos(hTitlebar, &vSwpTitlebar);
+    }
+    if (ulCreateFlags & FCF_HORZSCROLL)
+    {
+        hHScroll = WinWindowFromID(GetHwnd(), FID_HORZSCROLL);
+        WinQueryWindowPos(hHScroll, &vSwpHScroll);
+    }
+    if (ulCreateFlags & FCF_VERTSCROLL)
+    {
+        hVScroll = WinWindowFromID(GetHwnd(), 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;
     return TRUE;
 } // end of wxFrame::OS2Create