)
{
HWND hParent = NULLHANDLE;
+ wxPoint vPos = rPos; // The OS/2 position
wxCHECK_MSG(pParent, FALSE, wxT("can't create wxWindow without parent"));
{
pParent->AddChild(this);
hParent = GetWinHwnd(pParent);
+ //
+ // OS2 uses normal coordinates, no bassackwards Windows ones
+ //
+ vPos.y = pParent->GetSize().y - (vPos.y + rSize.y);
}
else
- hParent = HWND_DESKTOP;
+ {
+ RECTL vRect;
+
+ ::WinQueryWindowRect(HWND_DESKTOP, &vRect);
+ hParent = HWND_DESKTOP;
+ vPos.y = vRect.yTop - (vPos.y + rSize.y);
+ }
ULONG ulCreateFlags = 0L;
,(PSZ)wxCanvasClassName
,rName.c_str()
,ulCreateFlags
- ,rPos.x
- ,rPos.y
+ ,vPos.x
+ ,vPos.y
,WidthDefault(rSize.x)
,HeightDefault(rSize.y)
,NULLHANDLE
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,
//
if (lId == 65536) // I really don't like this...has to be a better indicator
{
- POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct;
- char zData[sizeof(wxMenuItem)];
-
- char zMsg[128];
-
- if (IsKindOf(CLASSINFO(wxFrame)))
+ if (IsKindOf(CLASSINFO(wxFrame))) // we'll assume if Frame then a menu
{
+ size_t nWidth;
+ size_t nHeight;
+ POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct;
wxFrame* pFrame = (wxFrame*)this;
wxMenuItem* pMenuItem = pFrame->GetMenuBar()->FindItem(pMeasureStruct->idItem, pMeasureStruct->hItem);
wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
- return(pMenuItem->OnMeasureItem(&pMeasureStruct->rclItem));
+ nWidth = 0L;
+ nHeight = 0L;
+ if (pMenuItem->OnMeasureItem( &nWidth
+ ,&nHeight
+ ))
+ {
+ pMeasureStruct->rclItem.xRight = nWidth;
+ pMeasureStruct->rclItem.xLeft = 0L;
+ pMeasureStruct->rclItem.yTop = nHeight;
+ pMeasureStruct->rclItem.yBottom = 0L;
+ return TRUE;
+ }
+ return FALSE;
}
}
- wxWindow* pItem = FindItem(id);
+ wxWindow* pItem = FindItem(lId);
if (pItem && pItem->IsKindOf(CLASSINFO(wxControl)))
{