)
{
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_DRAWITEM:
case WM_MEASUREITEM:
{
- int idCtrl = (UINT)wParam;
+ int nIdCtrl = (UINT)wParam;
+
if ( uMsg == WM_DRAWITEM )
{
- bProcessed = OS2OnDrawItem(idCtrl,
+ bProcessed = OS2OnDrawItem(nIdCtrl,
(WXDRAWITEMSTRUCT *)lParam);
}
else
{
- bProcessed = OS2OnMeasureItem(idCtrl,
+ bProcessed = OS2OnMeasureItem(nIdCtrl,
(WXMEASUREITEMSTRUCT *)lParam);
}
{
wxDC vDc;
+#if wxUSE_OWNER_DRAWN
//
// Is it a menu item?
//
if (vId == 0)
{
-
-#if wxUSE_OWNER_DRAWN
+ ERRORID vError;
+ wxString sError;
POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct;
- wxMenuItem vMenuItem;
+ 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);
-
//
- // 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)&vMenuItem
- );
+ 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);
+ }
+ //
+ // 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);
+ }
- wxRect vRect( pMeasureStruct->rclItem.xLeft
- ,pMeasureStruct->rclItem.yTop
- ,pMeasureStruct->rclItem.xRight
- ,pMeasureStruct->rclItem.yBottom
- );
+ wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
- wxOwnerDrawn::wxODAction eAction;
- //
- // Attribute applies to menuitems, fsState to listbox and other controls
- //
+ 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;
- else
- eAction = wxOwnerDrawn::wxODSelectChanged;
- return(vMenuItem.OnDrawItem( vDc
- ,vRect
- ,eAction
- ,(wxOwnerDrawn::wxODStatus)pMeasureStruct->fsAttribute
- ));
+ 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
+ {
+ 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
+ ,(wxOwnerDrawn::wxODAction)eAction
+ ,(wxOwnerDrawn::wxODStatus)eStatus
+ ));
//
// leave the fsAttribute and fsOldAttribute unchanged. If different,
// the system will do the highlight or fraeming or disabling for us,
//
// Is it a menu item?
//
- if (lId == 0)
+ if (lId == 65536) // I really don't like this...has to be a better indicator
{
- POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct;
- wxMenuItem vMenuItem;
-
- //
- // We stored the CMenuItem itself into the menuitem text field so now
- // we need to extract it.
- //
- ::WinSendMsg( pMeasureStruct->hItem
- ,MM_QUERYITEMTEXT
- ,MPFROM2SHORT( (USHORT)pMeasureStruct->idItem
- ,(SHORT)(sizeof(wxMenuItem))
- )
- ,(PSZ)&vMenuItem
- );
- wxCHECK(vMenuItem.IsKindOf(CLASSINFO(wxMenuItem)), FALSE);
-
- size_t lWidth = (size_t)(pMeasureStruct->rclItem.xRight - pMeasureStruct->rclItem.xLeft);
- size_t lHeight = (size_t)(pMeasureStruct->rclItem.yTop - pMeasureStruct->rclItem.yBottom);
-
- return(vMenuItem.OnMeasureItem( &lWidth
- ,&lHeight
- ));
+ 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 );
+ 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)))
{