X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ef94049fb77a02ce81c186ca33a3a6df757f3dfc..5778dedc92f6d31435aa1cda6846979a0e9ad35b:/src/msw/dc.cpp diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index f08a3b5984..675447fe3a 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -28,7 +28,6 @@ #include "wx/msw/wrapcdlg.h" #include "wx/image.h" #include "wx/window.h" - #include "wx/dc.h" #include "wx/utils.h" #include "wx/dialog.h" #include "wx/app.h" @@ -40,18 +39,19 @@ #include "wx/module.h" #endif +#include "wx/msw/dc.h" #include "wx/sysopt.h" #include "wx/dynlib.h" -#ifdef wxHAVE_RAW_BITMAP -#include "wx/rawbmp.h" +#ifdef wxHAS_RAW_BITMAP + #include "wx/rawbmp.h" #endif #include -#ifndef __WIN32__ - #include -#endif +#include "wx/msw/private/dc.h" + +using namespace wxMSWImpl; #ifndef AC_SRC_ALPHA #define AC_SRC_ALPHA 1 @@ -133,7 +133,7 @@ static bool AlphaBlt(HDC hdcDst, HDC hdcSrc, const wxBitmap& bmp); -#ifdef wxHAVE_RAW_BITMAP +#ifdef wxHAS_RAW_BITMAP // our (limited) AlphaBlend() replacement for Windows versions not providing it static void @@ -143,7 +143,7 @@ wxAlphaBlend(HDC hdcDst, int xDst, int yDst, int srcWidth, int srcHeight, const wxBitmap& bmpSrc); -#endif // wxHAVE_RAW_BITMAP +#endif // wxHAS_RAW_BITMAP // ---------------------------------------------------------------------------- // private classes @@ -153,45 +153,47 @@ wxAlphaBlend(HDC hdcDst, int xDst, int yDst, // colours in each wxDC method working with wxSTIPPLE_MASK_OPAQUE brushes, // encapsulate this in a small helper class -// wxColourChanger: changes the text colours in the ctor if required and +// wxBrushAttrsSetter: changes the text colours in the ctor if required and // restores them in the dtor -class wxColourChanger +class wxBrushAttrsSetter : private wxBkModeChanger, + private wxTextColoursChanger { public: - wxColourChanger(wxMSWDCImpl& dc); - ~wxColourChanger(); + wxBrushAttrsSetter(wxMSWDCImpl& dc); private: - wxMSWDCImpl& m_dc; + wxDECLARE_NO_COPY_CLASS(wxBrushAttrsSetter); +}; - COLORREF m_colFgOld, m_colBgOld; +#ifdef __WXWINCE__ - bool m_changed; +#define SET_STRETCH_BLT_MODE(hdc) - DECLARE_NO_COPY_CLASS(wxColourChanger) -}; +#else // !__WXWINCE__ -// this class saves the old stretch blit mode during its life time +// this class sets the stretch blit mode to COLORONCOLOR during its lifetime +// +// don't use it directly, use SET_STRETCH_BLT_MODE() macro instead as it +// expands to nothing under WinCE which doesn't have SetStretchBltMode() class StretchBltModeChanger { public: - StretchBltModeChanger(HDC hdc, - int WXUNUSED_IN_WINCE(mode)) + StretchBltModeChanger(HDC hdc) : m_hdc(hdc) { -#ifndef __WXWINCE__ - m_modeOld = ::SetStretchBltMode(m_hdc, mode); + m_modeOld = ::SetStretchBltMode(m_hdc, COLORONCOLOR); if ( !m_modeOld ) - wxLogLastError(_T("SetStretchBltMode")); -#endif + { + wxLogLastError(wxT("SetStretchBltMode")); + } } ~StretchBltModeChanger() { -#ifndef __WXWINCE__ if ( !::SetStretchBltMode(m_hdc, m_modeOld) ) - wxLogLastError(_T("SetStretchBltMode")); -#endif + { + wxLogLastError(wxT("SetStretchBltMode")); + } } private: @@ -199,9 +201,14 @@ private: int m_modeOld; - DECLARE_NO_COPY_CLASS(StretchBltModeChanger) + wxDECLARE_NO_COPY_CLASS(StretchBltModeChanger); }; +#define SET_STRETCH_BLT_MODE(hdc) \ + StretchBltModeChanger wxMAKE_UNIQUE_NAME(stretchModeChanger)(hdc) + +#endif // __WXWINCE__/!__WXWINCE__ + #if wxUSE_DYNLIB_CLASS // helper class to cache dynamically loaded libraries and not attempt reloading @@ -248,7 +255,7 @@ private: const wxChar *m_dllName; }; -static wxOnceOnlyDLLLoader wxMSIMG32DLL(_T("msimg32")); +static wxOnceOnlyDLLLoader wxMSIMG32DLL(wxT("msimg32")); // we must ensure that DLLs are unloaded before the static objects cleanup time // because we may hit the notorious DllMain() dead lock in this case if wx is @@ -273,57 +280,33 @@ IMPLEMENT_DYNAMIC_CLASS(wxGDIDLLsCleanupModule, wxModule) // =========================================================================== // ---------------------------------------------------------------------------- -// wxColourChanger +// wxBrushAttrsSetter // ---------------------------------------------------------------------------- -wxColourChanger::wxColourChanger(wxMSWDCImpl& dc) : m_dc(dc) +wxBrushAttrsSetter::wxBrushAttrsSetter(wxMSWDCImpl& dc) + : wxBkModeChanger(GetHdcOf(dc)), + wxTextColoursChanger(GetHdcOf(dc)) { const wxBrush& brush = dc.GetBrush(); - if ( brush.IsOk() && brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE ) + if ( brush.IsOk() && brush.GetStyle() == wxBRUSHSTYLE_STIPPLE_MASK_OPAQUE ) { - HDC hdc = GetHdcOf(dc); - m_colFgOld = ::GetTextColor(hdc); - m_colBgOld = ::GetBkColor(hdc); - // note that Windows convention is opposite to wxWidgets one, this is // why text colour becomes the background one and vice versa - const wxColour& colFg = dc.GetTextForeground(); - if ( colFg.IsOk() ) - { - ::SetBkColor(hdc, colFg.GetPixel()); - } - - const wxColour& colBg = dc.GetTextBackground(); - if ( colBg.IsOk() ) - { - ::SetTextColor(hdc, colBg.GetPixel()); - } + wxTextColoursChanger::Change(dc.GetTextBackground(), + dc.GetTextForeground()); - SetBkMode(hdc, - dc.GetBackgroundMode() == wxTRANSPARENT ? TRANSPARENT - : OPAQUE); - - // flag which telsl us to undo changes in the dtor - m_changed = true; - } - else - { - // nothing done, nothing to undo - m_changed = false; + wxBkModeChanger::Change(dc.GetBackgroundMode()); } } -wxColourChanger::~wxColourChanger() -{ - if ( m_changed ) - { - // restore the colours we changed - HDC hdc = GetHdcOf(m_dc); +// ---------------------------------------------------------------------------- +// wxDC MSW-specific methods +// ---------------------------------------------------------------------------- - ::SetBkMode(hdc, TRANSPARENT); - ::SetTextColor(hdc, m_colFgOld); - ::SetBkColor(hdc, m_colBgOld); - } +WXHDC wxDC::GetHDC() const +{ + wxMSWDCImpl * const impl = wxDynamicCast(GetImpl(), wxMSWDCImpl); + return impl ? impl->GetHDC() : 0; } // --------------------------------------------------------------------------- @@ -374,12 +357,10 @@ void wxMSWDCImpl::SelectOldObjects(WXHDC dc) if (m_oldBitmap) { ::SelectObject((HDC) dc, (HBITMAP) m_oldBitmap); -#ifdef __WXDEBUG__ if (m_selectedBitmap.IsOk()) { m_selectedBitmap.SetSelectedInto(NULL); } -#endif } m_oldBitmap = 0; if (m_oldPen) @@ -452,7 +433,7 @@ wxMSWDCImpl::DoGetClippingBox(wxCoord *x, wxCoord *y, wxCoord *w, wxCoord *h) co wxDCImpl::DoGetClippingBox(x, y, w, h); } -// common part of DoSetClippingRegion() and DoSetClippingRegionAsRegion() +// common part of DoSetClippingRegion() and DoSetDeviceClippingRegion() void wxMSWDCImpl::SetClippingHrgn(WXHRGN hrgn) { wxCHECK_RET( hrgn, wxT("invalid clipping region") ); @@ -487,7 +468,7 @@ void wxMSWDCImpl::SetClippingHrgn(WXHRGN hrgn) #else // !WinCE if ( ::ExtSelectClipRgn(GetHdc(), (HRGN)hrgn, RGN_AND) == ERROR ) { - wxLogLastError(_T("ExtSelectClipRgn")); + wxLogLastError(wxT("ExtSelectClipRgn")); return; } @@ -510,7 +491,7 @@ void wxMSWDCImpl::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord w, wxCoord h LogicalToDeviceY(y + h)); if ( !hrgn ) { - wxLogLastError(_T("CreateRectRgn")); + wxLogLastError(wxT("CreateRectRgn")); } else { @@ -520,7 +501,7 @@ void wxMSWDCImpl::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord w, wxCoord h } } -void wxMSWDCImpl::DoSetClippingRegionAsRegion(const wxRegion& region) +void wxMSWDCImpl::DoSetDeviceClippingRegion(const wxRegion& region) { SetClippingHrgn(region.GetHRGN()); } @@ -622,7 +603,7 @@ void wxMSWDCImpl::Clear() bool wxMSWDCImpl::DoFloodFill(wxCoord WXUNUSED_IN_WINCE(x), wxCoord WXUNUSED_IN_WINCE(y), const wxColour& WXUNUSED_IN_WINCE(col), - int WXUNUSED_IN_WINCE(style)) + wxFloodFillStyle WXUNUSED_IN_WINCE(style)) { #ifdef __WXWINCE__ return false; @@ -660,7 +641,7 @@ bool wxMSWDCImpl::DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const { WXMICROWIN_CHECK_HDC_RET(false) - wxCHECK_MSG( col, false, _T("NULL colour parameter in wxMSWDCImpl::GetPixel") ); + wxCHECK_MSG( col, false, wxT("NULL colour parameter in wxMSWDCImpl::GetPixel") ); // get the color of the pixel COLORREF pixelcolor = ::GetPixel(GetHdc(), XLOG2DEV(x), YLOG2DEV(y)); @@ -702,23 +683,23 @@ void wxMSWDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc) { + double dx = xc - x1; + double dy = yc - y1; + wxCoord r = (wxCoord)sqrt(dx*dx + dy*dy); + + #ifdef __WXWINCE__ // Slower emulation since WinCE doesn't support Pie and Arc - double r = sqrt( (x1-xc)*(x1-xc) + (y1-yc)*(y1-yc) ); double sa = acos((x1-xc)/r)/M_PI*180; // between 0 and 180 - if( y1>yc ) sa = -sa; // below center + if( y1>yc ) + sa = -sa; // below center double ea = atan2(yc-y2, x2-xc)/M_PI*180; DoDrawEllipticArcRot( xc-r, yc-r, 2*r, 2*r, sa, ea ); #else WXMICROWIN_CHECK_HDC - wxColourChanger cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling - - double dx = xc - x1; - double dy = yc - y1; - double radius = (double)sqrt(dx*dx+dy*dy); - wxCoord r = (wxCoord)radius; + wxBrushAttrsSetter cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling // treat the special case of full circle separately if ( x1 == x2 && y1 == y2 ) @@ -733,14 +714,16 @@ void wxMSWDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord yy2 = YLOG2DEV(y2); wxCoord xxc = XLOG2DEV(xc); wxCoord yyc = YLOG2DEV(yc); - wxCoord ray = (wxCoord) sqrt(double((xxc-xx1)*(xxc-xx1)+(yyc-yy1)*(yyc-yy1))); + dx = xxc - xx1; + dy = yyc - yy1; + wxCoord ray = (wxCoord)sqrt(dx*dx + dy*dy); wxCoord xxx1 = (wxCoord) (xxc-ray); wxCoord yyy1 = (wxCoord) (yyc-ray); wxCoord xxx2 = (wxCoord) (xxc+ray); wxCoord yyy2 = (wxCoord) (yyc+ray); - if ( m_brush.IsOk() && m_brush.GetStyle() != wxTRANSPARENT ) + if ( m_brush.IsOk() && m_brush.GetStyle() != wxBRUSHSTYLE_TRANSPARENT ) { // Have to add 1 to bottom-right corner of rectangle // to make semi-circles look right (crooked line otherwise). @@ -776,7 +759,7 @@ void wxMSWDCImpl::DoDrawCheckMark(wxCoord x1, wxCoord y1, rect.bottom = y2; #ifdef __WXWINCE__ - DrawFrameControl(GetHdc(), &rect, DFC_BUTTON, DFCS_BUTTONCHECK); + DrawFrameControl(GetHdc(), &rect, DFC_BUTTON, DFCS_BUTTONCHECK | DFCS_CHECKED); #else DrawFrameControl(GetHdc(), &rect, DFC_MENU, DFCS_MENUCHECK); #endif @@ -805,11 +788,11 @@ void wxMSWDCImpl::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, - int WXUNUSED_IN_WINCE(fillStyle)) + wxPolygonFillMode WXUNUSED_IN_WINCE(fillStyle)) { WXMICROWIN_CHECK_HDC - wxColourChanger cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling + wxBrushAttrsSetter cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling // Do things less efficiently if we have offsets if (xoffset != 0 || yoffset != 0) @@ -854,14 +837,14 @@ wxMSWDCImpl::DoDrawPolyPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, - int fillStyle) + wxPolygonFillMode fillStyle) { #ifdef __WXWINCE__ - wxDCBase::DoDrawPolyPolygon(n, count, points, xoffset, yoffset, fillStyle); + wxDCImpl::DoDrawPolyPolygon(n, count, points, xoffset, yoffset, fillStyle); #else WXMICROWIN_CHECK_HDC - wxColourChanger cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling + wxBrushAttrsSetter cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling int i, cnt; for (i = cnt = 0; i < n; i++) cnt += count[i]; @@ -936,7 +919,7 @@ void wxMSWDCImpl::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord h { WXMICROWIN_CHECK_HDC - wxColourChanger cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling + wxBrushAttrsSetter cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling wxCoord x2 = x + width; wxCoord y2 = y + height; @@ -948,7 +931,7 @@ void wxMSWDCImpl::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord h // (i.e. drawn with a transparent pen) one pixel smaller in both directions // and we want them to have the same size regardless of which pen is used #ifndef __WXWINCE__ - if ( m_pen.GetStyle() == wxTRANSPARENT ) + if ( m_pen.IsOk() && m_pen.GetStyle() == wxPENSTYLE_TRANSPARENT ) { x2dev++; y2dev++; @@ -965,7 +948,7 @@ void wxMSWDCImpl::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wx { WXMICROWIN_CHECK_HDC - wxColourChanger cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling + wxBrushAttrsSetter cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling // Now, a negative radius value is interpreted to mean // 'the proportion of the smallest X or Y dimension' @@ -982,7 +965,7 @@ void wxMSWDCImpl::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wx // Windows draws the filled rectangles without outline (i.e. drawn with a // transparent pen) one pixel smaller in both directions and we want them // to have the same size regardless of which pen is used - adjust - if ( m_pen.GetStyle() == wxTRANSPARENT ) + if ( m_pen.IsOk() && m_pen.GetStyle() == wxPENSTYLE_TRANSPARENT ) { x2++; y2++; @@ -999,24 +982,25 @@ void wxMSWDCImpl::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord hei { WXMICROWIN_CHECK_HDC - wxColourChanger cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling + wxBrushAttrsSetter cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling - wxCoord x2 = (x+width); - wxCoord y2 = (y+height); + // +1 below makes the ellipse more similar to other platforms. + // In particular, DoDrawEllipse(x,y,1,1) should draw one point. + wxCoord x2 = x + width + 1; + wxCoord y2 = y + height + 1; + + // Problem: Windows GDI Ellipse() with x2-x == y2-y == 3 and transparent + // pen doesn't draw anything. Should we provide a workaround? - (void)Ellipse(GetHdc(), XLOG2DEV(x), YLOG2DEV(y), XLOG2DEV(x2), YLOG2DEV(y2)); + ::Ellipse(GetHdc(), XLOG2DEV(x), YLOG2DEV(y), XLOG2DEV(x2), YLOG2DEV(y2)); CalcBoundingBox(x, y); CalcBoundingBox(x2, y2); } -#if wxUSE_SPLINES +#if wxUSE_SPLINES && !defined(__WXWINCE__) void wxMSWDCImpl::DoDrawSpline(const wxPointList *points) { -#ifdef __WXWINCE__ - // WinCE does not support ::PolyBezier so use generic version - wxDCBase::DoDrawSpline(points); -#else // quadratic b-spline to cubic bezier spline conversion // // quadratic spline with control points P0,P1,P2 @@ -1105,9 +1089,8 @@ void wxMSWDCImpl::DoDrawSpline(const wxPointList *points) ::PolyBezier( GetHdc(), lppt, bezier_pos ); free(lppt); -#endif } -#endif +#endif // wxUSE_SPLINES // Chris Breeze 20/5/98: first implementation of DrawEllipticArc on Windows void wxMSWDCImpl::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea) @@ -1118,7 +1101,7 @@ void wxMSWDCImpl::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,doub WXMICROWIN_CHECK_HDC - wxColourChanger cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling + wxBrushAttrsSetter cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling wxCoord x2 = x + w; wxCoord y2 = y + h; @@ -1191,7 +1174,7 @@ void wxMSWDCImpl::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool { WXMICROWIN_CHECK_HDC - wxCHECK_RET( bmp.IsOk(), _T("invalid bitmap in wxMSWDCImpl::DrawBitmap") ); + wxCHECK_RET( bmp.IsOk(), wxT("invalid bitmap in wxMSWDCImpl::DrawBitmap") ); int width = bmp.GetWidth(), height = bmp.GetHeight(); @@ -1211,6 +1194,8 @@ void wxMSWDCImpl::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool return; } + SET_STRETCH_BLT_MODE(GetHdc()); + if ( useMask ) { wxMask *mask = bmp.GetMask(); @@ -1229,13 +1214,20 @@ void wxMSWDCImpl::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool #ifdef __WIN32__ // use MaskBlt() with ROP which doesn't do anything to dst in the mask // points + bool ok = false; + +#if wxUSE_SYSTEM_OPTIONS // On some systems, MaskBlt succeeds yet is much much slower // than the wxWidgets fall-back implementation. So we need // to be able to switch this on and off at runtime. - bool ok = false; -#if wxUSE_SYSTEM_OPTIONS - if (wxSystemOptions::GetOptionInt(wxT("no-maskblt")) == 0) -#endif + // + // NB: don't query the value of the option every time but do it only + // once as otherwise it can have real (and bad) performance + // implications (see #11172) + static bool + s_maskBltAllowed = wxSystemOptions::GetOptionInt("no-maskblt") == 0; + if ( s_maskBltAllowed ) +#endif // wxUSE_SYSTEM_OPTIONS { HDC cdc = GetHdc(); HDC hdcMem = ::CreateCompatibleDC(GetHdc()); @@ -1285,16 +1277,7 @@ void wxMSWDCImpl::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool wxASSERT_MSG( hbitmap, wxT("bitmap is ok but HBITMAP is NULL?") ); - COLORREF old_textground = ::GetTextColor(GetHdc()); - COLORREF old_background = ::GetBkColor(GetHdc()); - if (m_textForegroundColour.IsOk()) - { - ::SetTextColor(GetHdc(), m_textForegroundColour.GetPixel() ); - } - if (m_textBackgroundColour.IsOk()) - { - ::SetBkColor(GetHdc(), m_textBackgroundColour.GetPixel() ); - } + wxTextColoursChanger textCol(GetHdc(), *this); #if wxUSE_PALETTE wxPalette *pal = bmp.GetPalette(); @@ -1315,9 +1298,6 @@ void wxMSWDCImpl::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool ::SelectObject( memdc, hOldBitmap ); ::DeleteDC( memdc ); - - ::SetTextColor(GetHdc(), old_textground); - ::SetBkColor(GetHdc(), old_background); } } @@ -1340,39 +1320,15 @@ void wxMSWDCImpl::DrawAnyText(const wxString& text, wxCoord x, wxCoord y) WXMICROWIN_CHECK_HDC // prepare for drawing the text - if ( m_textForegroundColour.IsOk() ) - SetTextColor(GetHdc(), m_textForegroundColour.GetPixel()); - - DWORD old_background = 0; - if ( m_textBackgroundColour.IsOk() ) - { - old_background = SetBkColor(GetHdc(), m_textBackgroundColour.GetPixel() ); - } + wxTextColoursChanger textCol(GetHdc(), *this); - SetBkMode(GetHdc(), m_backgroundMode == wxTRANSPARENT ? TRANSPARENT - : OPAQUE); + wxBkModeChanger bkMode(GetHdc(), m_backgroundMode); -#ifdef __WXWINCE__ if ( ::ExtTextOut(GetHdc(), XLOG2DEV(x), YLOG2DEV(y), 0, NULL, text.c_str(), text.length(), NULL) == 0 ) { wxLogLastError(wxT("TextOut")); } -#else - if ( ::TextOut(GetHdc(), XLOG2DEV(x), YLOG2DEV(y), - text.c_str(), text.length()) == 0 ) - { - wxLogLastError(wxT("TextOut")); - } -#endif - - // restore the old parameters (text foreground colour may be left because - // it never is set to anything else, but background should remain - // transparent even if we just drew an opaque string) - if ( m_textBackgroundColour.IsOk() ) - (void)SetBkColor(GetHdc(), old_background); - - SetBkMode(GetHdc(), TRANSPARENT); } void wxMSWDCImpl::DoDrawRotatedText(const wxString& text, @@ -1520,7 +1476,7 @@ void wxMSWDCImpl::SetFont(const wxFont& font) HGDIOBJ hfont = ::SelectObject(GetHdc(), GetHfontOf(font)); if ( hfont == HGDI_ERROR ) { - wxLogLastError(_T("SelectObject(font)")); + wxLogLastError(wxT("SelectObject(font)")); } else // selected ok { @@ -1536,7 +1492,7 @@ void wxMSWDCImpl::SetFont(const wxFont& font) { if ( ::SelectObject(GetHdc(), (HPEN) m_oldFont) == HGDI_ERROR ) { - wxLogLastError(_T("SelectObject(old font)")); + wxLogLastError(wxT("SelectObject(old font)")); } m_oldFont = 0; @@ -1558,7 +1514,7 @@ void wxMSWDCImpl::SetPen(const wxPen& pen) HGDIOBJ hpen = ::SelectObject(GetHdc(), GetHpenOf(pen)); if ( hpen == HGDI_ERROR ) { - wxLogLastError(_T("SelectObject(pen)")); + wxLogLastError(wxT("SelectObject(pen)")); } else // selected ok { @@ -1574,7 +1530,7 @@ void wxMSWDCImpl::SetPen(const wxPen& pen) { if ( ::SelectObject(GetHdc(), (HPEN) m_oldPen) == HGDI_ERROR ) { - wxLogLastError(_T("SelectObject(old pen)")); + wxLogLastError(wxT("SelectObject(old pen)")); } m_oldPen = 0; @@ -1594,26 +1550,33 @@ void wxMSWDCImpl::SetBrush(const wxBrush& brush) if ( brush.IsOk() ) { // we must make sure the brush is aligned with the logical coordinates - // before selecting it + // before selecting it or using the same brush for the background of + // different windows would result in discontinuities + wxSize sizeBrushBitmap = wxDefaultSize; wxBitmap *stipple = brush.GetStipple(); if ( stipple && stipple->IsOk() ) + sizeBrushBitmap = stipple->GetSize(); + else if ( brush.IsHatch() ) + sizeBrushBitmap = wxSize(8, 8); + + if ( sizeBrushBitmap.IsFullySpecified() ) { if ( !::SetBrushOrgEx ( GetHdc(), - m_deviceOriginX % stipple->GetWidth(), - m_deviceOriginY % stipple->GetHeight(), + m_deviceOriginX % sizeBrushBitmap.x, + m_deviceOriginY % sizeBrushBitmap.y, NULL // [out] previous brush origin ) ) { - wxLogLastError(_T("SetBrushOrgEx()")); + wxLogLastError(wxT("SetBrushOrgEx()")); } } HGDIOBJ hbrush = ::SelectObject(GetHdc(), GetHbrushOf(brush)); if ( hbrush == HGDI_ERROR ) { - wxLogLastError(_T("SelectObject(brush)")); + wxLogLastError(wxT("SelectObject(brush)")); } else // selected ok { @@ -1629,7 +1592,7 @@ void wxMSWDCImpl::SetBrush(const wxBrush& brush) { if ( ::SelectObject(GetHdc(), (HPEN) m_oldBrush) == HGDI_ERROR ) { - wxLogLastError(_T("SelectObject(old brush)")); + wxLogLastError(wxT("SelectObject(old brush)")); } m_oldBrush = 0; @@ -1661,7 +1624,7 @@ void wxMSWDCImpl::SetBackgroundMode(int mode) // and m_backgroundMode is used there } -void wxMSWDCImpl::SetLogicalFunction(int function) +void wxMSWDCImpl::SetLogicalFunction(wxRasterOperationMode function) { WXMICROWIN_CHECK_HDC @@ -1695,10 +1658,9 @@ void wxMSWDCImpl::SetRop(WXHDC dc) case wxNAND: rop = R2_NOTMASKPEN; break; case wxOR: rop = R2_MERGEPEN; break; case wxSET: rop = R2_WHITE; break; - default: - wxFAIL_MSG( wxT("unsupported logical function") ); - return; + wxFAIL_MSG( wxS("unknown logical function") ); + return; } SetROP2(GetHdc(), rop); @@ -1766,7 +1728,7 @@ void wxMSWDCImpl::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y HFONT hfontOld; if ( font ) { - wxASSERT_MSG( font->IsOk(), _T("invalid font in wxMSWDCImpl::GetTextExtent") ); + wxASSERT_MSG( font->IsOk(), wxT("invalid font in wxMSWDCImpl::GetTextExtent") ); hfontOld = (HFONT)::SelectObject(GetHdc(), GetHfontOf(*font)); } @@ -1779,7 +1741,7 @@ void wxMSWDCImpl::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y const size_t len = string.length(); if ( !::GetTextExtentPoint32(GetHdc(), string.wx_str(), len, &sizeRect) ) { - wxLogLastError(_T("GetTextExtentPoint32()")); + wxLogLastError(wxT("GetTextExtentPoint32()")); } #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) @@ -1810,17 +1772,21 @@ void wxMSWDCImpl::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y } #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) - TEXTMETRIC tm; - ::GetTextMetrics(GetHdc(), &tm); - if (x) *x = sizeRect.cx; if (y) *y = sizeRect.cy; - if (descent) - *descent = tm.tmDescent; - if (externalLeading) - *externalLeading = tm.tmExternalLeading; + + if ( descent || externalLeading ) + { + TEXTMETRIC tm; + ::GetTextMetrics(GetHdc(), &tm); + + if (descent) + *descent = tm.tmDescent; + if (externalLeading) + *externalLeading = tm.tmExternalLeading; + } if ( hfontOld ) { @@ -1872,9 +1838,9 @@ bool wxMSWDCImpl::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widt void wxMSWDCImpl::RealizeScaleAndOrigin() { - // VZ: it seems very wasteful to always use MM_ANISOTROPIC when in 99% of - // cases we could do with MM_TEXT and in the remaining 0.9% with - // MM_ISOTROPIC (TODO!) + // although it may seem wasteful to always use MM_ANISOTROPIC here instead + // of using MM_TEXT if there is no scaling, benchmarking doesn't detect any + // noticeable difference between these mapping modes #ifndef __WXWINCE__ ::SetMapMode(GetHdc(), MM_ANISOTROPIC); @@ -1889,7 +1855,7 @@ void wxMSWDCImpl::RealizeScaleAndOrigin() #endif } -void wxMSWDCImpl::SetMapMode(int mode) +void wxMSWDCImpl::SetMapMode(wxMappingMode mode) { WXMICROWIN_CHECK_HDC @@ -1939,7 +1905,7 @@ void wxMSWDCImpl::SetMapMode(int mode) break; default: - wxFAIL_MSG( _T("unknown mapping mode in SetMapMode") ); + wxFAIL_MSG( wxT("unknown mapping mode in SetMapMode") ); } } @@ -1985,9 +1951,15 @@ void wxMSWDCImpl::SetLogicalOrigin(wxCoord x, wxCoord y) wxDCImpl::SetLogicalOrigin( x, y ); -#ifndef __WXWINCE__ - ::SetWindowOrgEx(GetHdc(), (int)m_logicalOriginX, (int)m_logicalOriginY, NULL); -#endif + RealizeScaleAndOrigin(); +} + +// For use by wxWidgets only, unless custom units are required. +void wxMSWDCImpl::SetLogicalScale(double x, double y) +{ + WXMICROWIN_CHECK_HDC + + wxDCImpl::SetLogicalScale(x,y); } void wxMSWDCImpl::SetDeviceOrigin(wxCoord x, wxCoord y) @@ -2010,7 +1982,7 @@ bool wxMSWDCImpl::DoBlit(wxCoord dstX, wxCoord dstY, wxCoord dstWidth, wxCoord dstHeight, wxDC *source, wxCoord srcX, wxCoord srcY, - int rop, bool useMask, + wxRasterOperationMode rop, bool useMask, wxCoord srcMaskX, wxCoord srcMaskY) { return DoStretchBlit(dstX, dstY, dstWidth, dstHeight, source, srcX, srcY, dstWidth, dstHeight, rop, useMask, srcMaskX, srcMaskY); @@ -2021,30 +1993,30 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, wxDC *source, wxCoord xsrc, wxCoord ysrc, wxCoord srcWidth, wxCoord srcHeight, - int rop, bool useMask, + wxRasterOperationMode rop, bool useMask, wxCoord xsrcMask, wxCoord ysrcMask) { - wxCHECK_MSG( source, false, _T("wxMSWDCImpl::Blit(): NULL wxDC pointer") ); + wxCHECK_MSG( source, false, wxT("wxMSWDCImpl::Blit(): NULL wxDC pointer") ); WXMICROWIN_CHECK_HDC_RET(false) - wxDCImpl *impl = source->GetImpl(); - wxMSWDCImpl *msw_impl = wxDynamicCast( impl, wxMSWDCImpl ); - if (!msw_impl) + wxMSWDCImpl *implSrc = wxDynamicCast( source->GetImpl(), wxMSWDCImpl ); + if ( !implSrc ) { - // TODO: Do we want to be able to blit - // from other DCs too? + // TODO: Do we want to be able to blit from other DCs too? return false; } + const HDC hdcSrc = GetHdcOf(*implSrc); + // if either the source or destination has alpha channel, we must use // AlphaBlt() as other function don't handle it correctly - const wxBitmap& bmpSrc = msw_impl->GetSelectedBitmap(); + const wxBitmap& bmpSrc = implSrc->GetSelectedBitmap(); if ( bmpSrc.IsOk() && (bmpSrc.HasAlpha() || (m_selectedBitmap.IsOk() && m_selectedBitmap.HasAlpha())) ) { if ( AlphaBlt(GetHdc(), xdest, ydest, dstWidth, dstHeight, - xsrc, ysrc, srcWidth, srcHeight, GetHdcOf(*msw_impl), bmpSrc) ) + xsrc, ysrc, srcWidth, srcHeight, hdcSrc, bmpSrc) ) return true; } @@ -2066,16 +2038,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, xsrcMask = xsrc; ysrcMask = ysrc; } - COLORREF old_textground = ::GetTextColor(GetHdc()); - COLORREF old_background = ::GetBkColor(GetHdc()); - if (m_textForegroundColour.IsOk()) - { - ::SetTextColor(GetHdc(), m_textForegroundColour.GetPixel() ); - } - if (m_textBackgroundColour.IsOk()) - { - ::SetBkColor(GetHdc(), m_textBackgroundColour.GetPixel() ); - } + wxTextColoursChanger textCol(GetHdc(), *this); DWORD dwRop; switch (rop) @@ -2124,7 +2087,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, ( GetHdc(), xdest, ydest, dstWidth, dstHeight, - GetHdcOf(*msw_impl), + hdcSrc, xsrc, ysrc, (HBITMAP)mask->GetMaskBitmap(), xsrcMask, ysrcMask, @@ -2143,7 +2106,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, #if wxUSE_DC_CACHEING // create a temp buffer bitmap and DCs to access it and the mask - wxDCCacheEntry* dcCacheEntry1 = FindDCInCache(NULL, msw_impl->GetHDC()); + wxDCCacheEntry* dcCacheEntry1 = FindDCInCache(NULL, hdcSrc); dc_mask = (HDC) dcCacheEntry1->m_dc; wxDCCacheEntry* dcCacheEntry2 = FindDCInCache(dcCacheEntry1, GetHDC()); @@ -2155,7 +2118,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, buffer_bmap = (HBITMAP) bitmapCacheEntry->m_bitmap; #else // !wxUSE_DC_CACHEING // create a temp buffer bitmap and DCs to access it and the mask - dc_mask = ::CreateCompatibleDC(GetHdcOf(*source)); + dc_mask = ::CreateCompatibleDC(hdcSrc); dc_buffer = ::CreateCompatibleDC(GetHdc()); buffer_bmap = ::CreateCompatibleBitmap(GetHdc(), dstWidth, dstHeight); #endif // wxUSE_DC_CACHEING/!wxUSE_DC_CACHEING @@ -2163,46 +2126,44 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, HGDIOBJ hOldBufferBitmap = ::SelectObject(dc_buffer, buffer_bmap); // copy dest to buffer - if ( !::BitBlt(dc_buffer, 0, 0, (int)dstWidth, (int)dstHeight, + if ( !::BitBlt(dc_buffer, 0, 0, dstWidth, dstHeight, GetHdc(), xdest, ydest, SRCCOPY) ) { wxLogLastError(wxT("BitBlt")); } -#ifndef __WXWINCE__ - StretchBltModeChanger changeMode(dc_buffer, COLORONCOLOR); -#endif + SET_STRETCH_BLT_MODE(GetHdc()); // copy src to buffer using selected raster op - if ( !::StretchBlt(dc_buffer, 0, 0, (int)dstWidth, (int)dstHeight, - GetHdcOf(*msw_impl), xsrc, ysrc, srcWidth, srcHeight, dwRop) ) + if ( !::StretchBlt(dc_buffer, 0, 0, dstWidth, dstHeight, + hdcSrc, xsrc, ysrc, srcWidth, srcHeight, dwRop) ) { wxLogLastError(wxT("StretchBlt")); } - // set masked area in buffer to BLACK (pixel value 0) - COLORREF prevBkCol = ::SetBkColor(GetHdc(), RGB(255, 255, 255)); - COLORREF prevCol = ::SetTextColor(GetHdc(), RGB(0, 0, 0)); - if ( !::StretchBlt(dc_buffer, 0, 0, (int)dstWidth, (int)dstHeight, - dc_mask, xsrcMask, ysrcMask, srcWidth, srcHeight, SRCAND) ) + // set masked area in buffer to BLACK { - wxLogLastError(wxT("StretchBlt")); - } + wxTextColoursChanger textCol2(GetHdc(), *wxBLACK, *wxWHITE); + if ( !::StretchBlt(dc_buffer, 0, 0, dstWidth, dstHeight, + dc_mask, xsrcMask, ysrcMask, + srcWidth, srcHeight, SRCAND) ) + { + wxLogLastError(wxT("StretchBlt")); + } - // set unmasked area in dest to BLACK - ::SetBkColor(GetHdc(), RGB(0, 0, 0)); - ::SetTextColor(GetHdc(), RGB(255, 255, 255)); - if ( !::StretchBlt(GetHdc(), xdest, ydest, (int)dstWidth, (int)dstHeight, - dc_mask, xsrcMask, ysrcMask, srcWidth, srcHeight, SRCAND) ) - { - wxLogLastError(wxT("StretchBlt")); - } - ::SetBkColor(GetHdc(), prevBkCol); // restore colours to original values - ::SetTextColor(GetHdc(), prevCol); + // set unmasked area in dest to BLACK + ::SetBkColor(GetHdc(), RGB(0, 0, 0)); + ::SetTextColor(GetHdc(), RGB(255, 255, 255)); + if ( !::StretchBlt(GetHdc(), xdest, ydest, dstWidth, dstHeight, + dc_mask, xsrcMask, ysrcMask, + srcWidth, srcHeight, SRCAND) ) + { + wxLogLastError(wxT("StretchBlt")); + } + } // restore the original text and background colours // OR buffer to dest - success = ::BitBlt(GetHdc(), xdest, ydest, - (int)dstWidth, (int)dstHeight, + success = ::BitBlt(GetHdc(), xdest, ydest, dstWidth, dstHeight, dc_buffer, 0, 0, SRCPAINT) != 0; if ( !success ) { @@ -2239,7 +2200,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, sizeof(ds), &ds) == sizeof(ds) ) { - StretchBltModeChanger changeMode(GetHdc(), COLORONCOLOR); + SET_STRETCH_BLT_MODE(GetHdc()); // Figure out what co-ordinate system we're supposed to specify // ysrc in. @@ -2247,7 +2208,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, if ( hDIB > 0 ) { // reflect ysrc - ysrc = hDIB - (ysrc + dstHeight); + ysrc = hDIB - (ysrc + srcHeight); } if ( ::StretchDIBits(GetHdc(), @@ -2278,20 +2239,18 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, #endif // __WXWINCE__ { -#ifndef __WXWINCE__ - StretchBltModeChanger changeMode(GetHdc(), COLORONCOLOR); -#endif + SET_STRETCH_BLT_MODE(GetHdc()); if ( !::StretchBlt ( GetHdc(), xdest, ydest, dstWidth, dstHeight, - GetHdcOf(*msw_impl), + hdcSrc, xsrc, ysrc, srcWidth, srcHeight, dwRop ) ) { - wxLogLastError(_T("StretchBlt")); + wxLogLastError(wxT("StretchBlt")); } else { @@ -2301,17 +2260,10 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, if ( !success ) { - if ( !::BitBlt - ( - GetHdc(), - xdest, ydest, - (int)dstWidth, (int)dstHeight, - GetHdcOf(*msw_impl), - xsrc, ysrc, - dwRop - ) ) + if ( !::BitBlt(GetHdc(), xdest, ydest, dstWidth, dstHeight, + hdcSrc, xsrc, ysrc, dwRop) ) { - wxLogLastError(_T("BitBlt")); + wxLogLastError(wxT("BitBlt")); } else { @@ -2320,9 +2272,6 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, } } - ::SetTextColor(GetHdc(), old_textground); - ::SetBkColor(GetHdc(), old_background); - return success; } @@ -2351,7 +2300,7 @@ void wxMSWDCImpl::DoGetSizeMM(int *w, int *h) const { int wTotal = ::GetDeviceCaps(GetHdc(), HORZRES); - wxCHECK_RET( wTotal, _T("0 width device?") ); + wxCHECK_RET( wTotal, wxT("0 width device?") ); *w = (wPixels * ::GetDeviceCaps(GetHdc(), HORZSIZE)) / wTotal; } @@ -2360,7 +2309,7 @@ void wxMSWDCImpl::DoGetSizeMM(int *w, int *h) const { int hTotal = ::GetDeviceCaps(GetHdc(), VERTRES); - wxCHECK_RET( hTotal, _T("0 height device?") ); + wxCHECK_RET( hTotal, wxT("0 height device?") ); *h = (hPixels * ::GetDeviceCaps(GetHdc(), VERTSIZE)) / hTotal; } @@ -2376,14 +2325,6 @@ wxSize wxMSWDCImpl::GetPPI() const return wxSize(x, y); } -// For use by wxWidgets only, unless custom units are required. -void wxMSWDCImpl::SetLogicalScale(double x, double y) -{ - WXMICROWIN_CHECK_HDC - - wxDCImpl::SetLogicalScale(x,y); -} - // ---------------------------------------------------------------------------- // DC caching // ---------------------------------------------------------------------------- @@ -2532,8 +2473,8 @@ static bool AlphaBlt(HDC hdcDst, HDC hdcSrc, const wxBitmap& bmp) { - wxASSERT_MSG( bmp.IsOk() && bmp.HasAlpha(), _T("AlphaBlt(): invalid bitmap") ); - wxASSERT_MSG( hdcDst && hdcSrc, _T("AlphaBlt(): invalid HDC") ); + wxASSERT_MSG( bmp.IsOk() && bmp.HasAlpha(), wxT("AlphaBlt(): invalid bitmap") ); + wxASSERT_MSG( hdcDst && hdcSrc, wxT("AlphaBlt(): invalid HDC") ); // do we have AlphaBlend() and company in the headers? #if defined(AC_SRC_OVER) && wxUSE_DYNLIB_CLASS @@ -2543,7 +2484,7 @@ static bool AlphaBlt(HDC hdcDst, BLENDFUNCTION); static AlphaBlend_t - pfnAlphaBlend = (AlphaBlend_t)wxMSIMG32DLL.GetSymbol(_T("AlphaBlend")); + pfnAlphaBlend = (AlphaBlend_t)wxMSIMG32DLL.GetSymbol(wxT("AlphaBlend")); if ( pfnAlphaBlend ) { BLENDFUNCTION bf; @@ -2560,7 +2501,7 @@ static bool AlphaBlt(HDC hdcDst, return true; } - wxLogLastError(_T("AlphaBlend")); + wxLogLastError(wxT("AlphaBlend")); } #else wxUnusedVar(hdcSrc); @@ -2568,21 +2509,21 @@ static bool AlphaBlt(HDC hdcDst, // AlphaBlend() unavailable of failed: use our own (probably much slower) // implementation -#ifdef wxHAVE_RAW_BITMAP +#ifdef wxHAS_RAW_BITMAP wxAlphaBlend(hdcDst, x, y, dstWidth, dstHeight, srcX, srcY, srcWidth, srcHeight, bmp); return true; -#else // !wxHAVE_RAW_BITMAP +#else // !wxHAS_RAW_BITMAP // no wxAlphaBlend() neither, fall back to using simple BitBlt() (we lose // alpha but at least something will be shown like this) wxUnusedVar(bmp); return false; -#endif // wxHAVE_RAW_BITMAP +#endif // wxHAS_RAW_BITMAP/!wxHAS_RAW_BITMAP } // wxAlphaBlend: our fallback if ::AlphaBlend() is unavailable -#ifdef wxHAVE_RAW_BITMAP +#ifdef wxHAS_RAW_BITMAP static void wxAlphaBlend(HDC hdcDst, int xDst, int yDst, @@ -2598,7 +2539,7 @@ wxAlphaBlend(HDC hdcDst, int xDst, int yDst, if ( !::BitBlt(hdcMem, 0, 0, dstWidth, dstHeight, hdcDst, xDst, yDst, SRCCOPY) ) { - wxLogLastError(_T("BitBlt")); + wxLogLastError(wxT("BitBlt")); } // combine them with the source bitmap using alpha @@ -2606,7 +2547,7 @@ wxAlphaBlend(HDC hdcDst, int xDst, int yDst, dataSrc((wxBitmap &)bmpSrc); wxCHECK_RET( dataDst && dataSrc, - _T("failed to get raw data in wxAlphaBlend") ); + wxT("failed to get raw data in wxAlphaBlend") ); wxAlphaPixelData::Iterator pDst(dataDst), pSrc(dataSrc); @@ -2640,11 +2581,11 @@ wxAlphaBlend(HDC hdcDst, int xDst, int yDst, // and finally blit them back to the destination DC if ( !::BitBlt(hdcDst, xDst, yDst, dstWidth, dstHeight, hdcMem, 0, 0, SRCCOPY) ) { - wxLogLastError(_T("BitBlt")); + wxLogLastError(wxT("BitBlt")); } } -#endif // #ifdef wxHAVE_RAW_BITMAP +#endif // wxHAS_RAW_BITMAP void wxMSWDCImpl::DoGradientFillLinear (const wxRect& rect, const wxColour& initialColour, @@ -2658,7 +2599,7 @@ void wxMSWDCImpl::DoGradientFillLinear (const wxRect& rect, typedef BOOL (WINAPI *GradientFill_t)(HDC, PTRIVERTEX, ULONG, PVOID, ULONG, ULONG); static GradientFill_t pfnGradientFill = - (GradientFill_t)wxMSIMG32DLL.GetSymbol(_T("GradientFill")); + (GradientFill_t)wxMSIMG32DLL.GetSymbol(wxT("GradientFill")); if ( pfnGradientFill ) { @@ -2703,7 +2644,7 @@ void wxMSWDCImpl::DoGradientFillLinear (const wxRect& rect, return; } - wxLogLastError(_T("GradientFill")); + wxLogLastError(wxT("GradientFill")); } #endif // wxUSE_DYNLIB_CLASS @@ -2716,7 +2657,7 @@ static DWORD wxGetDCLayout(HDC hdc) { typedef DWORD (WINAPI *GetLayout_t)(HDC); static GetLayout_t - wxDL_INIT_FUNC(s_pfn, GetLayout, wxDynamicLibrary(_T("gdi32.dll"))); + wxDL_INIT_FUNC(s_pfn, GetLayout, wxDynamicLibrary(wxT("gdi32.dll"))); return s_pfnGetLayout ? s_pfnGetLayout(hdc) : (DWORD)-1; } @@ -2735,7 +2676,7 @@ void wxMSWDCImpl::SetLayoutDirection(wxLayoutDirection dir) { typedef DWORD (WINAPI *SetLayout_t)(HDC, DWORD); static SetLayout_t - wxDL_INIT_FUNC(s_pfn, SetLayout, wxDynamicLibrary(_T("gdi32.dll"))); + wxDL_INIT_FUNC(s_pfn, SetLayout, wxDynamicLibrary(wxT("gdi32.dll"))); if ( !s_pfnSetLayout ) return;