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
vDC.GetTextExtent( sStr
,(long *)pWidth
,(long *)pHeight
);
- //
- // 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
)
{
//
- // 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
+ // Select the font and draw the text
+ // ---------------------------------
//
- #define ToRGB(col) OS2RGB(col.Red(), col.Green(), col.Blue())
- #define UnRGB(col) GetRValue(col), GetGValue(col), GetBValue(col)
- CHARBUNDLE vCbndText;
- CHARBUNDLE vCbndBack;
+ CHARBUNDLE vCbnd;
HPS hPS= rDC.GetHPS();
- ULONG lColBack;
- ULONG lColText;
+ wxColour vColBack;
+ wxColour vColText;
+ COLORREF vRef;
+ RECTL vRect = {rRect.x + 4, rRect.y + 1, rRect.x + (rRect.width - 2), rRect.y + rRect.height};
+ memset(&vCbnd, 0, sizeof(CHARBUNDLE));
+
+ //
+ // Use default font if no font set
+ //
+ if (m_font.Ok())
+ {
+ m_font.RealizeResource();
+ }
+ else
+ {
+ ::GpiSetCharSet(hPS, LCID_DEFAULT);
+ }
+
+ //
+ // Base on the status of the menu item pick the right colors
+ //
if (eStatus & wxODSelected)
{
- lColBack = (DWORD)::WinQuerySysColor( HWND_DESKTOP
- ,SYSCLR_MENUHILITEBGND // Light gray
- ,0L
- );
- lColText = (DWORD)::WinQuerySysColor( HWND_DESKTOP
- ,SYSCLR_MENUTEXT // Black
- ,0L
- );
+ wxColour vCol2("WHITE");
+ vColBack.Set( (unsigned char)0
+ ,(unsigned char)0
+ ,(unsigned char)160
+ ); // no dark blue in color table
+ vColText = vCol2;
}
else if (eStatus & wxODDisabled)
{
- lColBack = (DWORD)::WinQuerySysColor( HWND_DESKTOP
- ,SYSCLR_MENU // Light gray
- ,0L
- );
- lColText = (DWORD)::WinQuerySysColor( HWND_DESKTOP
- ,SYSCLR_MENUDISABLEDTEXT // dark gray
- ,0L
- );
+ vRef = (ULONG)::WinQuerySysColor( HWND_DESKTOP
+ ,SYSCLR_MENU // Light gray
+ ,0L
+ );
+ vColBack.Set( GetRValue(vRef)
+ ,GetGValue(vRef)
+ ,GetBValue(vRef)
+ );
+ vRef = (ULONG)::WinQuerySysColor( HWND_DESKTOP
+ ,SYSCLR_MENUDISABLEDTEXT // dark gray
+ ,0L
+ );
+ vColText.Set( GetRValue(vRef)
+ ,GetGValue(vRef)
+ ,GetBValue(vRef)
+ );
}
else
{
//
// Fall back to default colors if none explicitly specified
//
- lColBack = m_colBack.Ok() ? ToRGB(m_colBack) : ::WinQuerySysColor( HWND_DESKTOP
- ,SYSCLR_MENU // we are using gray for all our window backgrounds in wxWindows
- ,0L
- );
- lColText = m_colText.Ok() ? ToRGB(m_colText) : ::WinQuerySysColor( HWND_DESKTOP
- ,SYSCLR_WINDOWTEXT // Black
- ,0L
- );
+ vRef = ::WinQuerySysColor( HWND_DESKTOP
+ ,SYSCLR_MENU // we are using gray for all our window backgrounds in wxWindows
+ ,0L
+ );
+ vColBack.Set( GetRValue(vRef)
+ ,GetGValue(vRef)
+ ,GetBValue(vRef)
+ );
+ vRef = ::WinQuerySysColor( HWND_DESKTOP
+ ,SYSCLR_WINDOWTEXT // Black
+ ,0L
+ );
+ vColText.Set( GetRValue(vRef)
+ ,GetGValue(vRef)
+ ,GetBValue(vRef)
+ );
}
- vCbndText.lColor = (LONG)lColText;
- vCbndBack.lColor = (LONG)lColBack;
+ rDC.SetTextBackground(vColBack);
+ rDC.SetTextForeground(vColText);
+ rDC.SetBackgroundMode(wxTRANSPARENT);
+ vCbnd.lColor = vColText.GetPixel();
+ vCbnd.lBackColor = vColBack.GetPixel();
::GpiSetAttrs( hPS
,PRIM_CHAR
- ,CBB_BACK_COLOR
- ,0
- ,&vCbndBack
- );
- ::GpiSetAttrs( hPS
- ,PRIM_CHAR
- ,CBB_COLOR
+ ,CBB_BACK_COLOR | CBB_COLOR
,0
- ,&vCbndText
+ ,&vCbnd
);
+ ::GpiSetBackMix( hPS
+ ,BM_LEAVEALONE
+ );
+ //
+ // Paint the background
+ //
+ ::WinFillRect(hPS, &vRect, vColBack.GetPixel());
//
// Determine where to draw and leave space for a check-mark.
int nX = rRect.x + GetMarginWidth();
//
- // Select the font and draw the text
- // ---------------------------------
+ // Unfortunately, unlike Win32, PM has no owner drawn specific text
+ // drawing methods like ::DrawState that can cleanly handle accel
+ // pneumonics and deal, automatically, with various states, so we have
+ // to handle them ourselves. Notice Win32 can't handle \t in ownerdrawn
+ // strings either. We cannot handle mneumonics either. We display
+ // it, though, in hopes we can figure it out some day.
//
//
- // Use default font if no font set
+ // Display main text and accel text separately to allign better
//
- if (m_font.Ok())
+ wxString sTgt = "\t";
+ wxString sFullString = m_strName; // need to save the original text
+ wxString sAccel;
+ size_t nIndex;
+ size_t nWidth;
+ size_t nCharWidth;
+ size_t nHeight;
+ bool bFoundMneumonic = FALSE;
+ bool bFoundAccel = FALSE;
+
+ //
+ // Deal with the tab, extracting the Accel text
+ //
+ nIndex = sFullString.Find(sTgt.c_str());
+ if (nIndex != -1)
{
- m_font.RealizeResource();
+ bFoundAccel = TRUE;
+ sAccel = sFullString.Mid(nIndex + 1);
+ sFullString.Remove(nIndex);
}
- else
+
+ //
+ // Deal with the mneumonic character
+ //
+ sTgt = "~";
+ nIndex = sFullString.Find(sTgt.c_str());
+ if (nIndex != -1)
{
- ::GpiSetCharSet(hPS, LCID_DEFAULT);
+ wxString sTmp = sFullString;
+
+ bFoundMneumonic = TRUE;
+ sTmp.Remove(nIndex);
+ rDC.GetTextExtent( sTmp
+ ,(long *)&nWidth
+ ,(long *)&nHeight
+ );
+ sTmp = sFullString[nIndex + 1];
+ rDC.GetTextExtent( sTmp
+ ,(long *)&nCharWidth
+ ,(long *)&nHeight
+ );
+ sFullString.Replace(sTgt.c_str(), "", TRUE);
}
//
- // Unfortunately, unlike Win32, PM has no owner drawn specific text
- // drawing methods like ::DrawState that can cleanly handle accel
- // pneumonics and deal, automatically, with various states, so we have
- // to handle them ourselves. Notice Win32 can't handle \t in ownerdrawn
- // strings either.
+ // Draw the main item text sans the accel text
+ //
+ POINTL vPntStart = {nX, rRect.y + 4};
+ ::GpiCharStringAt( rDC.GetHPS()
+ ,&vPntStart
+ ,sFullString.length()
+ ,(PCH)sFullString.c_str()
+ );
+ if (bFoundMneumonic)
+ {
+ //
+ // Underline the mneumonic -- still won't work, but at least it "looks" right
+ //
+ wxPen vPen;
+ POINTL vPntEnd = {nX + nWidth + nCharWidth - 3, rRect.y + 2}; //CharWidth is bit wide
+
+ vPntStart.x = nX + nWidth - 1;
+ vPntStart.y = rRect.y + 2; // Make it look pretty!
+ vPen = wxPen(vColText, 1, wxSOLID); // Assuming we are always black
+ rDC.SetPen(vPen);
+ ::GpiMove(hPS, &vPntStart);
+ ::GpiLine(hPS, &vPntEnd);
+ }
+
+ //
+ // Now draw the accel text
+ //
+ if (bFoundAccel)
+ {
+ size_t nWidth;
+ size_t nHeight;
- rDC.DrawText( m_strName
- ,nX
- ,rRect.y
- );
+ rDC.GetTextExtent( sAccel
+ ,(long *)&nWidth
+ ,(long *)&nHeight
+ );
+ //
+ // Back off the starting position from the right edge
+ //
+ vPntStart.x = rRect.width - (nWidth + 7);
+ vPntStart.y = rRect.y + 4;
+ ::GpiCharStringAt( rDC.GetHPS()
+ ,&vPntStart
+ ,sAccel.length()
+ ,(PCH)sAccel.c_str()
+ );
+ }
//
// Draw the bitmap
vRect.xLeft = rRect.x;
vRect.xRight = rRect.x + GetMarginWidth();
vRect.yBottom = rRect.y;
- vRect.yTop = rRect.y + m_nHeight;
+ vRect.yTop = rRect.y + m_nHeight - 3;
::WinDrawBitmap( hPS // PS for this menuitem
,hBmpCheck // system checkmark
if (vBmp.Ok())
{
+
wxMemoryDC vDCMem(&rDC);
+ wxMemoryDC* pOldDC = (wxMemoryDC*)vBmp.GetSelectedInto();
+ if(pOldDC != NULL)
+ {
+ vBmp.SetSelectedInto(NULL);
+ }
vDCMem.SelectObject(vBmp);
//
,rRect.x + GetMarginWidth()
,rRect.y + m_nHeight
};
+ POINTL vPnt1 = {rRect.x + 1, rRect.y + 3}; // Leave a little background border
+ POINTL vPnt2 = {rRect.x + GetMarginWidth(), rRect.y + m_nHeight - 3};
+
LINEBUNDLE vLine;
- vLine.lColor = lColBack;
+ vLine.lColor = vColBack.GetPixel();
::GpiSetAttrs( hPS
,PRIM_LINE
,LBB_COLOR
,0
,&vLine
);
+ ::GpiMove(hPS, &vPnt1);
::GpiBox( hPS
,DRO_OUTLINE
- ,(PPOINTL)&vRectBmp
+ ,&vPnt2
,0L
,0L
);
}
+ vBmp.SetSelectedInto(NULL);
}
}
-
- return TRUE;
-}
+ return TRUE;
+} // end of wxOwnerDrawn::OnDrawItem
#endif //wxUSE_OWNER_DRAWN