From e7dd6ecdd1a9c5dce5e088e90ff43ca50aac8389 Mon Sep 17 00:00:00 2001 From: George Tasker Date: Tue, 13 Feb 2001 11:35:45 +0000 Subject: [PATCH] Fixes display of bitmaps in owner drawn controls (like menus) so that they are not clipped or dropped completely. Menu items resize appropriately with this code submitted by Ray Gilbert. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9360 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/msw/ownerdrw.cpp | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/msw/ownerdrw.cpp b/src/msw/ownerdrw.cpp index b23fb671e2..dc65344eef 100644 --- a/src/msw/ownerdrw.cpp +++ b/src/msw/ownerdrw.cpp @@ -71,18 +71,44 @@ size_t wxOwnerDrawn::ms_nLastMarginWidth = ms_nDefaultMarginWidth; bool wxOwnerDrawn::OnMeasureItem(size_t *pwidth, size_t *pheight) { wxMemoryDC dc; - dc.SetFont(GetFont()); wxString str = wxStripMenuCodes(m_strName); // # without this menu items look too tightly packed (at least under Windows) str += wxT('W'); // 'W' is typically the widest letter + if (m_font.Ok()) + dc.SetFont(GetFont()); + dc.GetTextExtent(str, (long *)pwidth, (long *)pheight); // JACS: items still look too tightly packed, so adding 2 pixels. (*pheight) = (*pheight) + 2; + // Ray Gilbert's changes - Corrects the problem of a BMP + // being placed next to text in a menu item, and the BMP does + // not match the size expected by the system. This will + // resize the space so the BMP will fit. Without this, BMPs + // must be no larger or smaller than 16x16. + if (m_bmpChecked.Ok()) + { + // Is BMP height larger then text height? + size_t adjustedHeight = m_bmpChecked.GetHeight() + + wxSystemSettings::GetSystemMetric(wxSYS_EDGE_Y); + if (*pheight < adjustedHeight) + *pheight = adjustedHeight; + + // Does BMP encroach on default check menu position? + size_t adjustedWidth = m_bmpChecked.GetWidth() + + (wxSystemSettings::GetSystemMetric(wxSYS_EDGE_X) * 2); + if (ms_nDefaultMarginWidth < adjustedWidth) + *pwidth += adjustedWidth - ms_nDefaultMarginWidth; + + // Do we need to widen margin to fit BMP? + if ((size_t)GetMarginWidth() < adjustedWidth) + SetMarginWidth(adjustedWidth); + } + m_nHeight = *pheight; // remember height for use in OnDrawItem return TRUE; @@ -223,9 +249,13 @@ bool wxOwnerDrawn::OnDrawItem(wxDC& dc, const wxRect& rc, wxODAction act, wxODSt // there should be enough place! wxASSERT((nBmpWidth <= rc.GetWidth()) && (nBmpHeight <= rc.GetHeight())); + int heightDiff = (m_nHeight - nBmpHeight); +// if (heightDiff = -1) +// heightDiff = -2; + //MT: blit with mask enabled. dc.Blit(rc.x + (GetMarginWidth() - nBmpWidth) / 2, - rc.y + (m_nHeight - nBmpHeight) /2, + rc.y + heightDiff / 2, nBmpWidth, nBmpHeight, &dcMem, 0, 0, wxCOPY, TRUE); -- 2.49.0