case WM_MEASUREITEM:
{
int nIdCtrl = (UINT)wParam;
- char zMsg[128];
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);
}
//
if (vId == 0)
{
+ ERRORID vError;
+ wxString sError;
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.
+ // Load the wxWindows Pallete and set to RGB mode
//
- ::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;
-
+ if (!::GpiCreateLogColorTable( pMeasureStruct->hps
+ ,0L
+ ,LCOLF_CONSECRGB
+ ,0L
+ ,(LONG)wxTheColourDatabase->m_nSize
+ ,(PLONG)wxTheColourDatabase->m_palTable
+ ))
+ {
+ vError = ::WinGetLastError(vHabmain);
+ sError = wxPMErrorToStr(vError);
+ wxLogError("Unable to set current color table. Error: %s\n", sError);
+ }
//
- // Attribute applies to menuitems, fsState to listbox and other controls
+ // Set the color table to RGB mode
//
+ if (!::GpiCreateLogColorTable( pMeasureStruct->hps
+ ,0L
+ ,LCOLF_RGB
+ ,0L
+ ,0L
+ ,NULL
+ ))
+ {
+ vError = ::WinGetLastError(vHabmain);
+ sError = wxPMErrorToStr(vError);
+ wxLogError("Unable to set current color table. Error: %s\n", sError);
+ }
+
+ wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
+
+
+ int eAction = 0;
+ int eStatus = 0;
+
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;
+ {
+ if (pMeasureStruct->fsAttribute & MIA_HILITED)
+ {
+ eAction = wxOwnerDrawn::wxODDrawAll;
+ eStatus |= wxOwnerDrawn::wxODSelected;
+ //
+ // Keep the system from trying to highlight with its bogus colors
+ //
+ pMeasureStruct->fsAttributeOld = pMeasureStruct->fsAttribute &= ~MIA_HILITED;
+ }
+ else if (!(pMeasureStruct->fsAttribute & MIA_HILITED))
+ {
+ eAction = wxOwnerDrawn::wxODDrawAll;
+ eStatus = 0;
+ //
+ // Keep the system from trying to highlight with its bogus colors
+ //
+ pMeasureStruct->fsAttribute = pMeasureStruct->fsAttributeOld &= ~MIA_HILITED;
+ }
+ else
+ {
+ //
+ // For now we don't care about anything else
+ // just ignore the entire 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,