Fix wxPrinterDC::DrawIcon() in wxMSW.

Make DrawIcon() work when printing: it previously didn't, as we used
::DrawIconEx() Windows function which wasn't supported when printing.
Work around this by using DrawBitmap() if necessary.

Closes #379.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@75736 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2014-01-29 22:25:45 +00:00
parent cc4658d1f4
commit 41569662e3

View File

@@ -1271,11 +1271,26 @@ void wxMSWDCImpl::DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y)
wxCHECK_RET( icon.IsOk(), wxT("invalid icon in DrawIcon") );
// Check if we are printing: notice that it's not enough to just check for
// DT_RASPRINTER as this is also the kind of print preview HDC, but its
// type is OBJ_ENHMETADC while the type of the "real" printer DC is OBJ_DC.
if ( ::GetDeviceCaps(GetHdc(), TECHNOLOGY) == DT_RASPRINTER &&
::GetObjectType(GetHdc()) == OBJ_DC )
{
// DrawIcon API doesn't work for printer DCs (printer DC is write-only
// and DrawIcon requires DC supporting SRCINVERT ROP).
// We need to convert icon to bitmap and use alternative API calls.
wxBitmap bmp(icon);
DoDrawBitmap(bmp, x, y, !bmp.HasAlpha() /* use mask */);
}
else
{
#ifdef __WIN32__
::DrawIconEx(GetHdc(), XLOG2DEV(x), YLOG2DEV(y), GetHiconOf(icon), icon.GetWidth(), icon.GetHeight(), 0, NULL, DI_NORMAL);
::DrawIconEx(GetHdc(), XLOG2DEV(x), YLOG2DEV(y), GetHiconOf(icon), icon.GetWidth(), icon.GetHeight(), 0, NULL, DI_NORMAL);
#else
::DrawIcon(GetHdc(), XLOG2DEV(x), YLOG2DEV(y), GetHiconOf(icon));
::DrawIcon(GetHdc(), XLOG2DEV(x), YLOG2DEV(y), GetHiconOf(icon));
#endif
}
CalcBoundingBox(x, y);
CalcBoundingBox(x + icon.GetWidth(), y + icon.GetHeight());