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:
David Webster
2001-03-22 23:23:19 +00:00
parent 9c0b55475a
commit 5afb945835
6 changed files with 392 additions and 69 deletions

View File

@@ -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