Ownerdrawn stuff. Text display done, image display next.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9572 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -75,6 +75,7 @@ bool wxOwnerDrawn::OnMeasureItem(
|
||||
|
||||
wxString sStr = wxStripMenuCodes(m_strName);
|
||||
|
||||
#if 0
|
||||
wxString sTgt = "\t";
|
||||
size_t nIndex;
|
||||
|
||||
@@ -85,7 +86,7 @@ bool wxOwnerDrawn::OnMeasureItem(
|
||||
nIndex = sStr.Find(sTgt.c_str());
|
||||
if (nIndex != -1)
|
||||
sStr.Replace(sTgt.c_str(), "", TRUE);
|
||||
|
||||
#endif
|
||||
vDC.GetTextExtent( sStr
|
||||
,(long *)pWidth
|
||||
,(long *)pHeight
|
||||
@@ -120,6 +121,7 @@ bool wxOwnerDrawn::OnDrawItem(
|
||||
wxColour vColBack;
|
||||
wxColour vColText;
|
||||
COLORREF vRef;
|
||||
RECTL vRect = {rRect.x + 4, rRect.y + 1, rRect.x + (rRect.width - 2), rRect.y + rRect.height};
|
||||
char zMsg[128];
|
||||
|
||||
//
|
||||
@@ -133,17 +135,18 @@ bool wxOwnerDrawn::OnDrawItem(
|
||||
{
|
||||
::GpiSetCharSet(hPS, LCID_DEFAULT);
|
||||
}
|
||||
|
||||
//
|
||||
// Base on the status of the menu item pick the right colors
|
||||
//
|
||||
if (eStatus & wxODSelected)
|
||||
{
|
||||
vRef = (ULONG)::WinQuerySysColor( HWND_DESKTOP
|
||||
,SYSCLR_MENUHILITEBGND // Light gray
|
||||
,0L
|
||||
);
|
||||
vColBack.Set( GetRValue(vRef)
|
||||
,GetGValue(vRef)
|
||||
,GetBValue(vRef)
|
||||
);
|
||||
vColText = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_MENUTEXT);
|
||||
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)
|
||||
{
|
||||
@@ -186,24 +189,14 @@ bool wxOwnerDrawn::OnDrawItem(
|
||||
,GetBValue(vRef)
|
||||
);
|
||||
}
|
||||
vRef = vColBack.GetPixel();
|
||||
vCbnd.lBackColor = (LONG)vRef;
|
||||
rDC.SetTextBackground(vColBack);
|
||||
rDC.SetTextForeground(vColText);
|
||||
rDC.SetBackgroundMode(wxTRANSPARENT);
|
||||
|
||||
vRef = vColText.GetPixel();
|
||||
vCbnd.lColor = (LONG)vRef;
|
||||
|
||||
sprintf(zMsg, "Color: %ld", vRef);
|
||||
wxMessageBox( "wxWindows Menu Sample"
|
||||
,zMsg
|
||||
,wxICON_INFORMATION
|
||||
);
|
||||
|
||||
::GpiSetAttrs( hPS
|
||||
,PRIM_CHAR
|
||||
,CBB_COLOR | CBB_BACK_COLOR
|
||||
,0
|
||||
,&vCbnd
|
||||
);
|
||||
//
|
||||
// Paint the background
|
||||
//
|
||||
::WinFillRect(hPS, &vRect, vColBack.GetPixel());
|
||||
|
||||
//
|
||||
// Determine where to draw and leave space for a check-mark.
|
||||
@@ -215,34 +208,99 @@ bool wxOwnerDrawn::OnDrawItem(
|
||||
// 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.
|
||||
// strings either. We cannot handle mneumonics either. We display
|
||||
// it, though, in hopes we can figure it out some day.
|
||||
//
|
||||
|
||||
//
|
||||
// Manually replace the tab with spaces
|
||||
// Display main text and accel text separately to allign better
|
||||
//
|
||||
wxString sTgt = "\t";
|
||||
wxString sReplace = " ";
|
||||
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;
|
||||
|
||||
nIndex = m_strName.Find(sTgt.c_str());
|
||||
//
|
||||
// Deal with the tab, extracting the Accel text
|
||||
//
|
||||
nIndex = sFullString.Find(sTgt.c_str());
|
||||
if (nIndex != -1)
|
||||
m_strName.Replace(sTgt.c_str(), sReplace.c_str(), TRUE);
|
||||
{
|
||||
bFoundAccel = TRUE;
|
||||
sAccel = sFullString.Mid(nIndex + 1);
|
||||
sFullString.Remove(nIndex);
|
||||
}
|
||||
|
||||
//
|
||||
// Deal with the mneumonic character
|
||||
//
|
||||
sTgt = "~";
|
||||
nIndex = m_strName.Find(sTgt.c_str());
|
||||
nIndex = sFullString.Find(sTgt.c_str());
|
||||
if (nIndex != -1)
|
||||
m_strName.Replace(sTgt.c_str(), "", TRUE);
|
||||
{
|
||||
wxString sTmp = sFullString;
|
||||
|
||||
POINTL vPoint;
|
||||
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);
|
||||
}
|
||||
|
||||
vPoint.x = nX;
|
||||
vPoint.y = rRect.y + 4;
|
||||
::GpiCharStringAt( hPS
|
||||
,&vPoint
|
||||
,m_strName.length()
|
||||
,(PCH)m_strName.c_str()
|
||||
);
|
||||
//
|
||||
// Draw the main item text sans the accel text
|
||||
rDC.DrawText( sFullString
|
||||
,nX
|
||||
,rRect.y + 4
|
||||
);
|
||||
if (bFoundMneumonic)
|
||||
{
|
||||
//
|
||||
// Underline the mneumonic -- still won't work, but at least it "looks" right
|
||||
//
|
||||
wxPen vPen;
|
||||
POINTL vPntStart = {nX + nWidth - 1, rRect.y + 2}; // Make it look pretty!
|
||||
POINTL vPntEnd = {nX + nWidth + nCharWidth - 3, rRect.y + 2}; //CharWidth is bit wide
|
||||
|
||||
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.GetTextExtent( sAccel
|
||||
,(long *)&nWidth
|
||||
,(long *)&nHeight
|
||||
);
|
||||
//
|
||||
// Back off the starting position from the right edge
|
||||
//
|
||||
rDC.DrawText( sAccel
|
||||
,rRect.width - (nWidth + 7) // this seems to mimic the default OS/2 positioning
|
||||
,rRect.y + 4
|
||||
);
|
||||
}
|
||||
|
||||
#if 0
|
||||
//
|
||||
// Draw the bitmap
|
||||
// ---------------
|
||||
@@ -316,7 +374,7 @@ bool wxOwnerDrawn::OnDrawItem(
|
||||
};
|
||||
LINEBUNDLE vLine;
|
||||
|
||||
vLine.lColor = lColBack;
|
||||
vLine.lColor = vColBack.GetPixel();
|
||||
::GpiSetAttrs( hPS
|
||||
,PRIM_LINE
|
||||
,LBB_COLOR
|
||||
@@ -332,7 +390,6 @@ bool wxOwnerDrawn::OnDrawItem(
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return TRUE;
|
||||
} // end of wxOwnerDrawn::OnDrawItem
|
||||
|
||||
|
||||
Reference in New Issue
Block a user