X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/07225d48b60f88c78dd643bc7c984c3930db3544..5b53617d42b277a87467a0e2721413073fae8641:/src/msw/dc.cpp?ds=inline diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index 105d5b75d3..ac9179a376 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -40,7 +40,7 @@ #include "wx/sysopt.h" #include "wx/dcprint.h" #include "wx/module.h" -#include "wx/dynload.h" +#include "wx/dynlib.h" #ifdef wxHAVE_RAW_BITMAP #include "wx/rawbmp.h" @@ -724,12 +724,13 @@ void wxDC::DoDrawArc(wxCoord x1, wxCoord y1, void wxDC::DoDrawCheckMark(wxCoord x1, wxCoord y1, wxCoord width, wxCoord height) { - WXMICROWIN_CHECK_HDC - + // cases when we don't have DrawFrameControl() +#if defined(__SYMANTEC__) || defined(__WXMICROWIN__) + return wxDCBase::DoDrawCheckMark(x1, y1, width, height); +#else // normal case wxCoord x2 = x1 + width, y2 = y1 + height; -#if defined(__WIN32__) && !defined(__SYMANTEC__) && !defined(__WXMICROWIN__) RECT rect; rect.left = x1; rect.top = y1; @@ -741,25 +742,10 @@ void wxDC::DoDrawCheckMark(wxCoord x1, wxCoord y1, #else DrawFrameControl(GetHdc(), &rect, DFC_MENU, DFCS_MENUCHECK); #endif -#else // Symantec-MicroWin - // draw a cross - HPEN blackPen = ::CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); - HPEN whiteBrush = (HPEN)::GetStockObject(WHITE_BRUSH); - HPEN hPenOld = (HPEN)::SelectObject(GetHdc(), blackPen); - HPEN hBrushOld = (HPEN)::SelectObject(GetHdc(), whiteBrush); - ::SetROP2(GetHdc(), R2_COPYPEN); - Rectangle(GetHdc(), x1, y1, x2, y2); - MoveToEx(GetHdc(), x1, y1, NULL); - LineTo(GetHdc(), x2, y2); - MoveToEx(GetHdc(), x2, y1, NULL); - LineTo(GetHdc(), x1, y2); - ::SelectObject(GetHdc(), hPenOld); - ::SelectObject(GetHdc(), hBrushOld); - ::DeleteObject(blackPen); -#endif // Win32/Symantec-MicroWin CalcBoundingBox(x1, y1); CalcBoundingBox(x2, y2); +#endif // Microwin/Normal } void wxDC::DoDrawPoint(wxCoord x, wxCoord y) @@ -1753,10 +1739,39 @@ void wxDC::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, } SIZE sizeRect; - TEXTMETRIC tm; + const size_t len = string.length(); + if ( !::GetTextExtentPoint32(GetHdc(), string, len, &sizeRect) ) + { + wxLogLastError(_T("GetTextExtentPoint32()")); + } + + // the result computed by GetTextExtentPoint32() may be too small as it + // accounts for under/overhang of the first/last character while we want + // just the bounding rect for this string so adjust the width as needed + if ( len > 0 ) + { + ABC width; + const wxChar chFirst = *string.begin(); + if ( ::GetCharABCWidths(GetHdc(), chFirst, chFirst, &width) ) + { + if ( width.abcA < 0 ) + sizeRect.cx -= width.abcA; - ::GetTextExtentPoint32(GetHdc(), string, string.length(), &sizeRect); - GetTextMetrics(GetHdc(), &tm); + if ( len > 1 ) + { + const wxChar chLast = *string.rbegin(); + ::GetCharABCWidths(GetHdc(), chLast, chLast, &width); + } + //else: we already have the width of the last character + + if ( width.abcC < 0 ) + sizeRect.cx -= width.abcC; + } + //else: GetCharABCWidths() failed, not a TrueType font? + } + + TEXTMETRIC tm; + ::GetTextMetrics(GetHdc(), &tm); if (x) *x = sizeRect.cx; @@ -2656,17 +2671,15 @@ void wxDC::DoGradientFillLinear (const wxRect& rect, vertices[1].x = rect.GetRight(); vertices[1].y = rect.GetBottom(); - vertices[firstVertex].Red = initialColour.Red() << 8; - vertices[firstVertex].Green = initialColour.Green() << 8; - vertices[firstVertex].Blue = initialColour.Blue() << 8; + vertices[firstVertex].Red = (COLOR16)(initialColour.Red() << 8); + vertices[firstVertex].Green = (COLOR16)(initialColour.Green() << 8); + vertices[firstVertex].Blue = (COLOR16)(initialColour.Blue() << 8); vertices[firstVertex].Alpha = 0; - vertices[1 - firstVertex].Red = destColour.Red() << 8; - vertices[1 - firstVertex].Green = destColour.Green() << 8; - vertices[1 - firstVertex].Blue = destColour.Blue() << 8; + vertices[1 - firstVertex].Red = (COLOR16)(destColour.Red() << 8); + vertices[1 - firstVertex].Green = (COLOR16)(destColour.Green() << 8); + vertices[1 - firstVertex].Blue = (COLOR16)(destColour.Blue() << 8); vertices[1 - firstVertex].Alpha = 0; - if (nDirection == wxWEST || - nDirection == wxEAST) if ( (*pfnGradientFill) ( GetHdc(),