X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/213ad8e72cb6e838d15bf54145d661b081dca308..24e35cf87b9350d0d114fa8db0e2f5bef6410139:/src/msw/dc.cpp?ds=sidebyside diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index 62d88bf832..11570c8c40 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -35,12 +35,12 @@ #include "wx/dcmemory.h" #include "wx/log.h" #include "wx/icon.h" + #include "wx/dcprint.h" #endif #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" @@ -483,6 +483,14 @@ void wxDC::DestroyClippingRegion() if (m_clipping && m_hDC) { +#if 1 + // On a PocketPC device (not necessarily emulator), resetting + // the clip region as per the old method causes bad display + // problems. In fact setting a null region is probably OK + // on desktop WIN32 also, since the WIN32 docs imply that the user + // clipping region is independent from the paint clipping region. + ::SelectClipRgn(GetHdc(), 0); +#else // TODO: this should restore the previous clipping region, // so that OnPaint processing works correctly, and the update // clipping region doesn't get destroyed after the first @@ -490,6 +498,7 @@ void wxDC::DestroyClippingRegion() HRGN rgn = CreateRectRgn(0, 0, 32000, 32000); ::SelectClipRgn(GetHdc(), rgn); ::DeleteObject(rgn); +#endif } wxDCBase::DestroyClippingRegion(); @@ -715,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; @@ -732,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) @@ -1493,7 +1488,7 @@ void wxDC::SetFont(const wxFont& font) else // selected ok { if ( !m_oldFont ) - m_oldFont = (WXHPEN)hfont; + m_oldFont = (WXHFONT)hfont; m_font = font; } @@ -1586,7 +1581,7 @@ void wxDC::SetBrush(const wxBrush& brush) else // selected ok { if ( !m_oldBrush ) - m_oldBrush = (WXHPEN)hbrush; + m_oldBrush = (WXHBRUSH)hbrush; m_brush = brush; } @@ -1744,10 +1739,42 @@ 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()")); + } - ::GetTextExtentPoint32(GetHdc(), string, string.length(), &sizeRect); - GetTextMetrics(GetHdc(), &tm); +#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) + // 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 + // (using API not available in 2002 SDKs of WinCE) + if ( len > 0 ) + { + ABC width; + const wxChar chFirst = *string.begin(); + if ( ::GetCharABCWidths(GetHdc(), chFirst, chFirst, &width) ) + { + if ( width.abcA < 0 ) + sizeRect.cx -= width.abcA; + + 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? + } +#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) + + TEXTMETRIC tm; + ::GetTextMetrics(GetHdc(), &tm); if (x) *x = sizeRect.cx; @@ -2647,17 +2674,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(),