+ if ( IsSeparator() )
+ {
+ DrawEdge(hdc, &rcSeparator, EDGE_ETCHED, BF_TOP);
+ return true;
+ }
+
+ AutoHBRUSH hbr(colBack.GetPixel());
+ SelectInHDC selBrush(hdc, hbr);
+ ::FillRect(hdc, &rcSelection, hbr);
+ }
+
+
+ // draw text label
+ // using native API because it recognizes '&'
+
+ HDCTextColChanger changeTextCol(hdc, colText.GetPixel());
+ HDCBgColChanger changeBgCol(hdc, colBack.GetPixel());
+ HDCBgModeChanger changeBgMode(hdc, TRANSPARENT);
+
+ SelectInHDC selFont(hdc, GetHfontOf(font));
+
+
+ // item text name without mnemonic for calculating size
+ wxString text = GetName();
+
+ SIZE textSize;
+ ::GetTextExtentPoint32(hdc, text.c_str(), text.length(), &textSize);
+
+ // item text name with mnemonic
+ text = GetItemLabel().BeforeFirst('\t');
+
+ int flags = DST_PREFIXTEXT;
+ // themes menu is using specified color for disabled labels
+ if ( data->MenuLayout() == MenuDrawData::Classic &&
+ (stat & wxODDisabled) && !(stat & wxODSelected) )
+ flags |= DSS_DISABLED;
+
+ if ( (stat & wxODHidePrefix) && !data->AlwaysShowCues )
+ flags |= DSS_HIDEPREFIX;
+
+ int x = rcText.left;
+ int y = rcText.top + (rcText.bottom - rcText.top - textSize.cy) / 2;
+
+ ::DrawState(hdc, NULL, NULL, (LPARAM)text.wx_str(),
+ text.length(), x, y, 0, 0, flags);
+
+ // ::SetTextAlign(hdc, TA_RIGHT) doesn't work with DSS_DISABLED or DSS_MONO
+ // as the last parameter in DrawState() (at least with Windows98). So we have
+ // to take care of right alignment ourselves.
+ wxString accel = GetItemLabel().AfterFirst(wxT('\t'));
+ if ( !accel.empty() )
+ {
+ SIZE accelSize;
+ ::GetTextExtentPoint32(hdc, accel.c_str(), accel.length(), &accelSize);
+
+ int flags = DST_TEXT;
+ // themes menu is using specified color for disabled labels
+ if ( data->MenuLayout() == MenuDrawData::Classic &&
+ (stat & wxODDisabled) && !(stat & wxODSelected) )
+ flags |= DSS_DISABLED;
+
+ int x = rcText.right - data->ArrowMargin.GetTotalX()
+ - data->ArrowSize.cx
+ - data->ArrowBorder;
+
+ // right align accel on FullTheme menu, left otherwise
+ if ( data->MenuLayout() == MenuDrawData::FullTheme)
+ x -= accelSize.cx;
+ else
+ x -= m_parentMenu->GetMaxAccelWidth();
+
+ int y = rcText.top + (rcText.bottom - rcText.top - accelSize.cy) / 2;
+
+ ::DrawState(hdc, NULL, NULL, (LPARAM)accel.wx_str(),
+ accel.length(), x, y, 0, 0, flags);
+ }
+ }
+
+
+ // draw the bitmap
+
+ RECT rcImg;
+ SetRect(&rcImg,
+ rect.left + data->ItemMargin.cxLeftWidth
+ + data->CheckBgMargin.cxLeftWidth
+ + data->CheckMargin.cxLeftWidth,
+ rect.top + data->ItemMargin.cyTopHeight
+ + data->CheckBgMargin.cyTopHeight
+ + data->CheckMargin.cyTopHeight,
+ rect.left + data->ItemMargin.cxLeftWidth
+ + data->CheckBgMargin.cxLeftWidth
+ + data->CheckMargin.cxLeftWidth
+ + imgWidth,
+ rect.bottom - data->ItemMargin.cyBottomHeight
+ - data->CheckBgMargin.cyBottomHeight
+ - data->CheckMargin.cyBottomHeight);
+
+ if ( IsCheckable() && !m_bmpChecked.Ok() )
+ {
+ if ( stat & wxODChecked )
+ {
+ DrawStdCheckMark((WXHDC)hdc, &rcImg, stat);
+ }
+ }
+ else
+ {
+ wxBitmap bmp;
+
+ if ( stat & wxODDisabled )
+ {
+ bmp = GetDisabledBitmap();
+ }
+
+ if ( !bmp.Ok() )
+ {
+ // for not checkable bitmaps we should always use unchecked one
+ // because their checked bitmap is not set
+ bmp = GetBitmap(!IsCheckable() || (stat & wxODChecked));
+
+#if wxUSE_IMAGE
+ if ( bmp.Ok() && stat & wxODDisabled )
+ {
+ // we need to grey out the bitmap as we don't have any specific
+ // disabled bitmap
+ wxImage imgGrey = bmp.ConvertToImage().ConvertToGreyscale();
+ if ( imgGrey.Ok() )
+ bmp = wxBitmap(imgGrey);
+ }
+#endif // wxUSE_IMAGE
+ }
+
+ if ( bmp.Ok() )
+ {
+ wxMemoryDC dcMem(&dc);
+ dcMem.SelectObjectAsSource(bmp);
+
+ // center bitmap
+ int nBmpWidth = bmp.GetWidth(),
+ nBmpHeight = bmp.GetHeight();
+
+ // there should be enough space!
+ wxASSERT( nBmpWidth <= imgWidth && nBmpHeight <= (rcImg.bottom - rcImg.top) );
+
+ int x = rcImg.left + (imgWidth - nBmpWidth) / 2;
+ int y = rcImg.top + (rcImg.bottom - rcImg.top - nBmpHeight) / 2;
+ dc.Blit(x, y, nBmpWidth, nBmpHeight, &dcMem, 0, 0, wxCOPY, true);