]> git.saurik.com Git - wxWidgets.git/commitdiff
OwnerDrawn updates
authorDavid Webster <Dave.Webster@bhmi.com>
Wed, 21 Mar 2001 22:30:48 +0000 (22:30 +0000)
committerDavid Webster <Dave.Webster@bhmi.com>
Wed, 21 Mar 2001 22:30:48 +0000 (22:30 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9567 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/os2/dc.cpp
src/os2/dcmemory.cpp
src/os2/menu.cpp
src/os2/ownerdrw.cpp
src/os2/window.cpp

index 5b740a9cc480e5490c4b25d729fc71b49e331d30..5a22aabc731e62bad7db5ef472cb78be600be5bc 100644 (file)
@@ -1208,17 +1208,6 @@ void wxDC::DoGetTextExtent(
         if(vPtMax.x < avPoint[i].x) vPtMax.x = avPoint[i].x;
         if(vPtMax.y < avPoint[i].y) vPtMax.y = avPoint[i].y;
     }
-#if 0
-    sprintf(zMsg, "Extents for %s, are: Minx: %ld, Miny: %ld, Maxx: %ld, Maxy: %ld", vPtMin.x
-                                                                                   , vPtMin.y
-                                                                                   , vPtMax.x
-                                                                                   , vPtMax.y
-                                                                                  );
-    (void)wxMessageBox( "wxWindows Menu sample"
-                       ,zMsg
-                       ,wxICON_INFORMATION
-                      );
-#endif
     ::GpiQueryFontMetrics( m_hPS
                           ,sizeof(FONTMETRICS)
                           ,&vFM
index 9e6515d0bfa940e10024e4b2f0d9839502aee217..d9d6a2201f54d3ff1f62d9b7ccac21222e5b25aa 100644 (file)
 
 IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC, wxDC)
 
-/*
- * Memory DC
- *
- */
+/////////////////////////////////////////////////////////////////////////////
+// Memory DC
+/////////////////////////////////////////////////////////////////////////////
 
 wxMemoryDC::wxMemoryDC(void)
 {
-  // TODO:
-/*
-  m_hDC = (WXHDC) ::CreateCompatibleDC((HDC) NULL);
-  m_ok = (m_hDC != 0);
-  m_bOwnsDC = TRUE;
-
-  SetBrush(*wxWHITE_BRUSH);
-  SetPen(*wxBLACK_PEN);
-
-  // the background mode is only used for text background
-  // and is set in DrawText() to OPAQUE as required, other-
-  // wise always TRANSPARENT, RR
-  ::SetBkMode( GetHdc(), TRANSPARENT );
-*/
-}
-
-wxMemoryDC::wxMemoryDC(wxDC *old_dc)
+    HDC                             hDC;
+    HPS                             hPS;
+    DEVOPENSTRUC                    vDOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
+    SIZEL                           vSize = {0, 0};
+
+    //
+    // Create a memory device context
+    //
+    hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDOP, NULLHANDLE);
+    if (hDC != DEV_ERROR)
+    {
+        hPS = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
+        if (hPS != GPI_ERROR)
+        {
+            m_hPS = hPS;
+            m_hDC = hDC;
+            m_ok = TRUE;
+            m_bOwnsDC = TRUE;
+            SetBrush(*wxWHITE_BRUSH);
+            SetPen(*wxBLACK_PEN);
+        }
+        else
+        {
+            m_hPS = NULLHANDLE;
+            m_hDC = NULLHANDLE;
+            m_ok  = FALSE;
+            m_bOwnsDC = FALSE;
+        }
+    }
+    else
+    {
+        m_hPS = NULLHANDLE;
+        m_hDC = NULLHANDLE;
+        m_ok  = FALSE;
+        m_bOwnsDC = FALSE;
+    }
+} // end of wxMemoryDC::wxMemoryDC
+
+wxMemoryDC::wxMemoryDC(
+  wxDC*                             pOldDC
+)
 {
-  // TODO:
-/*
-  old_dc->BeginDrawing();
-
-  m_hDC = (WXHDC) ::CreateCompatibleDC((HDC) old_dc->GetHDC());
-  m_ok = (m_hDC != 0);
-
-  old_dc->EndDrawing();
-
-  SetBrush(*wxWHITE_BRUSH);
-  SetPen(*wxBLACK_PEN);
-
-  // the background mode is only used for text background
-  // and is set in DrawText() to OPAQUE as required, other-
-  // wise always TRANSPARENT, RR
-  ::SetBkMode( GetHdc(), TRANSPARENT );
-*/
-}
-
-wxMemoryDC::~wxMemoryDC(void)
+    HDC                             hDC;
+    HPS                             hPS;
+    DEVOPENSTRUC                    vDOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
+    SIZEL                           vSize = {0, 0};
+
+    pOldDC->BeginDrawing();
+
+    //
+    // Create a memory device context
+    //
+    hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDOP, GetHdcOf(*pOldDC));
+    if (hDC != DEV_ERROR)
+    {
+        hPS = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
+        if (hPS != GPI_ERROR)
+        {
+            m_hPS = hPS;
+            m_hDC = hDC;
+            m_ok = TRUE;
+            m_bOwnsDC = TRUE;
+            pOldDC->EndDrawing();
+            SetBrush(*wxWHITE_BRUSH);
+            SetPen(*wxBLACK_PEN);
+        }
+        else
+        {
+            pOldDC->EndDrawing();
+            m_hPS = NULLHANDLE;
+            m_hDC = NULLHANDLE;
+            m_ok  = FALSE;
+            m_bOwnsDC = FALSE;
+        }
+    }
+    else
+    {
+        pOldDC->EndDrawing();
+        m_hPS = NULLHANDLE;
+        m_hDC = NULLHANDLE;
+        m_ok  = FALSE;
+        m_bOwnsDC = FALSE;
+    }
+} // end of wxMemoryDC::wxMemoryDC
+
+wxMemoryDC::~wxMemoryDC()
 {
-};
-
-void wxMemoryDC::SelectObject( const wxBitmap& bitmap )
+    if (m_hPS != NULLHANDLE)
+        ::GpiDestroyPS(m_hPS);
+    if (m_hDC != NULLHANDLE)
+        ::DevCloseDC(m_hDC);
+} // end of wxMemoryDC::~wxMemoryDC
+
+void wxMemoryDC::SelectObject(
+  const wxBitmap&                   rBitmap
+)
 {
-   // TODO:
-};
-
-void wxMemoryDC::DoGetSize( int *width, int *height ) const
+    //
+    // Select old bitmap out of the device context
+    //
+    if (m_hOldBitmap)
+    {
+        ::GpiSetBitmap(m_hPS, NULLHANDLE);
+        if (m_vSelectedBitmap.Ok())
+        {
+            m_vSelectedBitmap.SetSelectedInto(NULL);
+            m_vSelectedBitmap = wxNullBitmap;
+        }
+    }
+
+    //
+    // Check for whether the bitmap is already selected into a device context
+    //
+    wxCHECK_RET( !rBitmap.GetSelectedInto() ||
+                 (rBitmap.GetSelectedInto() == this),
+                 wxT("Bitmap is selected in another wxMemoryDC, delete the first wxMemoryDC or use SelectObject(NULL)") );
+
+    m_vSelectedBitmap = rBitmap;
+
+    WXHBITMAP                       hBmp = m_vSelectedBitmap.GetHBITMAP();
+
+    if (!hBmp)
+        return;
+
+    m_vSelectedBitmap.SetSelectedInto(this);
+    hBmp = (WXHBITMAP)::GpiSetBitmap(m_hPS, (HBITMAP)hBmp);
+
+    if (hBmp != HBM_ERROR)
+    {
+        wxLogLastError(wxT("SelectObject(memDC, bitmap)"));
+        wxFAIL_MSG(wxT("Couldn't select a bitmap into wxMemoryDC"));
+    }
+    else if (!m_hOldBitmap)
+    {
+        m_hOldBitmap = hBmp;
+    }
+} // end of wxMemoryDC::SelectObject
+
+void wxMemoryDC::DoGetSize(
+  int*                              pWidth
+, int*                              pHeight
+) const
 {
-  if (!m_vSelectedBitmap.Ok())
-  {
-    *width = 0; *height = 0;
-    return;
-  }
-  *width = m_vSelectedBitmap.GetWidth();
-  *height = m_vSelectedBitmap.GetHeight();
-};
+    if (!m_vSelectedBitmap.Ok())
+    {
+        *pWidth  = 0;
+        *pHeight = 0;
+        return;
+    }
+    *pWidth = m_vSelectedBitmap.GetWidth();
+    *pHeight = m_vSelectedBitmap.GetHeight();
+} // end of wxMemoryDC::DoGetSize
 
 
index 07327e565b438f0a1b62d203527f2ae5b23c4acd..f6f689e9eb4232940e3c511db7cf3b808a58203d 100644 (file)
@@ -330,7 +330,7 @@ bool wxMenu::DoInsertOrAppend(
         // Will eventually need to set the image handle somewhere into vItem.hItem
         //
         rItem.afStyle |= MIS_OWNERDRAW;
-        pData = (BYTE*)pItem;
+        pData = (BYTE*)NULL;
         rItem.hItem = (HBITMAP)pItem->GetBitmap().GetHBITMAP();
         pItem->m_vMenuData.afStyle = rItem.afStyle;
         pItem->m_vMenuData.hItem = rItem.hItem;
index c0fbe632fdd4c5d0ffc0aaf962e4a49fdca8d278..7b25a242a717bd8f77f9872d8a3a537c5cfe8257 100644 (file)
@@ -75,39 +75,27 @@ bool wxOwnerDrawn::OnMeasureItem(
 
     wxString                        sStr = wxStripMenuCodes(m_strName);
 
-    //
-    // # without this menu items look too tightly packed (at least under Windows)
-    //
-    sStr += wxT('W'); // 'W' is typically the widest letter
+    wxString                        sTgt = "\t";
+    size_t                          nIndex;
+
+    nIndex = sStr.Find(sTgt.c_str());
+    if (nIndex != -1)
+        sStr.Remove(nIndex);
+    sTgt = "~";
+    nIndex = sStr.Find(sTgt.c_str());
+    if (nIndex != -1)
+        sStr.Replace(sTgt.c_str(), "", TRUE);
+
     vDC.GetTextExtent( sStr
                       ,(long *)pWidth
                       ,(long *)pHeight
                      );
-    // DEBUG
-    char                            zMsg[128];
-    sprintf(zMsg, "GetTextExtent for %s: Width: %ld, Height: %ld", m_strName.c_str(), *pWidth, *pHeight);
-    (void)wxMessageBox( "wxWindows Menu sample"
-                       ,zMsg
-                       ,wxICON_INFORMATION
-                      );
-    // end DEBUG
 
-    //
-    // JACS: items still look too tightly packed, so adding 2 pixels.
-    //
     (*pHeight) = (*pHeight) + 2;
     m_nHeight = *pHeight;        // remember height for use in OnDrawItem
     return TRUE;
 } // end of wxOwnerDrawn::OnMeasureItem
 
-// searching for this macro you'll find all the code where I'm using the native
-// Win32 GDI functions and not wxWindows ones. Might help to whoever decides to
-// port this code to X. (VZ)
-
-// JACS: TODO. Why does a disabled but highlighted item still
-// get drawn embossed? How can we tell DrawState that we don't want the
-// embossing?
-
 // draw the item
 bool wxOwnerDrawn::OnDrawItem(
   wxDC&                             rDC
@@ -117,12 +105,9 @@ bool wxOwnerDrawn::OnDrawItem(
 )
 {
     //
-    // For now we let PM deal with highlighting and framing and such in a
-    // default manner.  So we leave fsAttribute and fsOldAttribute ( or
-    // fsState and fsOldState ) the same and pass it on. We may want to add
-    // code later to draw theseattributes in a more custom manner.
-    //
-
+    // We do nothing on focus change
+    if (eAction == wxODFocusChanged )
+        return TRUE;
     //
     // WxWinGdi_CColour <-> RGB
     //
@@ -137,22 +122,22 @@ bool wxOwnerDrawn::OnDrawItem(
 
     if (eStatus & wxODSelected)
     {
-        lColBack = (DWORD)::WinQuerySysColor( HWND_DESKTOP
+        lColBack = (ULONG)::WinQuerySysColor( HWND_DESKTOP
                                              ,SYSCLR_MENUHILITEBGND // Light gray
                                              ,0L
                                             );
-        lColText = (DWORD)::WinQuerySysColor( HWND_DESKTOP
+        lColText = (ULONG)::WinQuerySysColor( HWND_DESKTOP
                                              ,SYSCLR_MENUTEXT // Black
                                              ,0L
                                             );
     }
     else if (eStatus & wxODDisabled)
     {
-        lColBack = (DWORD)::WinQuerySysColor( HWND_DESKTOP
+        lColBack = (ULONG)::WinQuerySysColor( HWND_DESKTOP
                                              ,SYSCLR_MENU // Light gray
                                              ,0L
                                             );
-        lColText = (DWORD)::WinQuerySysColor( HWND_DESKTOP
+        lColText = (ULONG)::WinQuerySysColor( HWND_DESKTOP
                                              ,SYSCLR_MENUDISABLEDTEXT // dark gray
                                              ,0L
                                             );
@@ -217,11 +202,27 @@ bool wxOwnerDrawn::OnDrawItem(
     // to handle them ourselves. Notice Win32 can't handle \t in ownerdrawn
     // strings either.
 
+    //
+    // Manually replace the tab with spaces
+    //
+    wxString                        sTgt = "\t";
+    wxString                        sReplace = " ";
+    size_t                          nIndex;
+
+    nIndex = m_strName.Find(sTgt.c_str());
+    if (nIndex != -1)
+        m_strName.Replace(sTgt.c_str(), sReplace.c_str(), TRUE);
+    sTgt = "~";
+    nIndex = m_strName.Find(sTgt.c_str());
+    if (nIndex != -1)
+        m_strName.Replace(sTgt.c_str(), "", TRUE);
+
     rDC.DrawText( m_strName
                  ,nX
-                 ,rRect.y
+                 ,rRect.y + 4
                 );
 
+#if 0
     //
     // Draw the bitmap
     // ---------------
@@ -311,8 +312,8 @@ bool wxOwnerDrawn::OnDrawItem(
             }
         }
     }
-
-  return TRUE;
-}
+#endif
+    return TRUE;
+} // end of wxOwnerDrawn::OnDrawItem
 
 #endif //wxUSE_OWNER_DRAWN
index 654424d2e385d6fe0d630eadee3b9bab74ac071a..d5489b0daff80bd624197d058bc39c7d5c261522 100644 (file)
@@ -1988,13 +1988,6 @@ MRESULT wxWindow::OS2WindowProc(
 
                 if ( uMsg == WM_DRAWITEM )
                 {
-                    // DEBUG
-                    sprintf(zMsg, "In OS2OnDrawItem, id: %d", nIdCtrl);
-                    (void)wxMessageBox( "wxWindows Menu sample"
-                                       ,zMsg
-                                       ,wxICON_INFORMATION
-                                      );
-                    // end DEBUG
                     bProcessed = OS2OnDrawItem(nIdCtrl,
                                               (WXDRAWITEMSTRUCT *)lParam);
                 }
@@ -2672,48 +2665,75 @@ bool wxWindow::OS2OnDrawItem(
     if (vId == 0)
     {
         POWNERITEM                  pMeasureStruct = (POWNERITEM)pItemStruct;
-        BYTE*                       pData;
-        wxMenuItem*                 pMenuItem;
+        wxFrame*                    pFrame = (wxFrame*)this;
+        wxMenuItem*                 pMenuItem = pFrame->GetMenuBar()->FindItem(pMeasureStruct->idItem, pMeasureStruct->hItem);
         HDC                         hDC = ::GpiQueryDevice(pMeasureStruct->hps);
-
+        wxRect                      vRect( pMeasureStruct->rclItem.xLeft
+                                          ,pMeasureStruct->rclItem.yBottom
+                                          ,pMeasureStruct->rclItem.xRight - pMeasureStruct->rclItem.xLeft
+                                          ,pMeasureStruct->rclItem.yTop - pMeasureStruct->rclItem.yBottom
+                                         );
         vDc.SetHDC( hDC
                    ,FALSE
                   );
         vDc.SetHPS(pMeasureStruct->hps);
-#if 0
-        //
-        // We stored the CMenuItem itself into the menuitem text field so now
-        // we need to extract it.
-        //
-        ::WinSendMsg( pMeasureStruct->hItem
-                     ,MM_QUERYITEMTEXT
-                     ,MPFROM2SHORT( (USHORT)pMeasureStruct->idItem
-                                   ,(SHORT)(sizeof(wxMenuItem))
-                                  )
-                     ,(PSZ)pData
-                    );
-        wxRect                      vRect( pMeasureStruct->rclItem.xLeft
-                                          ,pMeasureStruct->rclItem.yTop
-                                          ,pMeasureStruct->rclItem.xRight
-                                          ,pMeasureStruct->rclItem.yBottom
-                                         );
 
-        wxOwnerDrawn::wxODAction eAction;
+        wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
+
+
+        int                         eAction = 0;
+        int                         eStatus = 0;
 
-        //
-        // Attribute applies to menuitems, fsState to listbox and other controls
-        //
         if (pMeasureStruct->fsAttribute == pMeasureStruct->fsAttributeOld)
+        {
+            //
+            // Entire Item needs to be redrawn (either it has reappeared from
+            // behind another window or is being displayed for the first time
+            //
             eAction = wxOwnerDrawn::wxODDrawAll;
+
+            if (pMeasureStruct->fsAttribute & MIA_HILITED)
+            {
+                //
+                // If it is currently selected we let the system handle it
+                //
+                eStatus |= wxOwnerDrawn::wxODSelected;
+            }
+            if (pMeasureStruct->fsAttribute & MIA_CHECKED)
+            {
+                //
+                // If it is currently checked we draw our own
+                //
+                eStatus |= wxOwnerDrawn::wxODChecked;
+                pMeasureStruct->fsAttributeOld = pMeasureStruct->fsAttribute &= ~MIA_CHECKED;
+            }
+            if (pMeasureStruct->fsAttribute & MIA_DISABLED)
+            {
+                //
+                // If it is currently disabled we let the system handle it
+                //
+                eStatus |= wxOwnerDrawn::wxODDisabled;
+            }
+            //
+            // Don't really care about framed (indicationg focus) or NoDismiss
+            //
+        }
         else
-            eAction = wxOwnerDrawn::wxODSelectChanged;
-        pMenuItem = (wxMenuItem*)pData;
+        {
+            //
+            // For now we don't care about doing our own highlighting so we'll
+            // just ignore the entie message!
+            //
+            return TRUE;
+        }
+        //
+        // Now redraw the item
+        //
         return(pMenuItem->OnDrawItem( vDc
                                      ,vRect
-                                     ,eAction
-                                     ,(wxOwnerDrawn::wxODStatus)pMeasureStruct->fsAttribute
+                                     ,(wxOwnerDrawn::wxODAction)eAction
+                                     ,(wxOwnerDrawn::wxODStatus)eStatus
                                     ));
-#endif
         //
         // leave the fsAttribute and fsOldAttribute unchanged.  If different,
         // the system will do the highlight or fraeming or disabling for us,