Всем привет!
Не могли бы вы помочь со следующей проблемой :
при печати окна все линии и битмапы выводятся правильно - а вот текст печатается вверх ногами и со смещением по вертикали.
На другом принтере текст не выводиться вообще, если размер букв меньше 4.5 см
вот кусок тестовой программки, которая имитирует печать в проекте(те же условия) :
Код:
void CSimplePrintDlg::Print()
{
if (!m_printerHDC)
{
return;
}
XFORM xForm;
CPoint stringOrigin(0, 0);
CSize stringSize(0, 0);
CRect stringRect(0, 0, 0, 0);
CSize paperSize(0, 0);
char rawText[] = "%d:ABCDEFGH";
char docName[20];
char theText[30];
memset(docName, 0, sizeof(docName));
// m_num - document number
sprintf(docName, "SimplePrint#%d", m_num);
DOCINFO docInfo;
memset(&docInfo, 0, sizeof(docInfo));
docInfo.cbSize = sizeof(docInfo);
docInfo.lpszDocName = docName;
DRAWTEXTPARAMS params;
params.cbSize = sizeof(DRAWTEXTPARAMS);
params.iTabLength = 4;
params.iLeftMargin = 0;
params.iRightMargin = 0;
params.uiLengthDrawn = 0;
LOGFONT logFontPDF, logFontPrinter;
memset(&logFontPDF, 0, sizeof(LOGFONT));
memset(&logFontPrinter, 0, sizeof(LOGFONT));
strcpy(logFontPDF.lfFaceName, "");
strcpy(logFontPDF.lfFaceName, "");
logFontPDF.lfOutPrecision = logFontPrinter.lfOutPrecision = OUT_RASTER_PRECIS;
HFONT hFontPDF = NULL, hFontPrinter = NULL;
int ok = 0;
int i;
ok = StartDoc(m_printerHDC, &docInfo);
ASSERT(ok > 0);
ok = StartPage(m_printerHDC);
ASSERT(ok > 0);
ok = SetGraphicsMode(m_printerHDC, GM_ADVANCED);
ASSERT(ok != 0);
ok = SetMapMode(m_printerHDC, MM_LOMETRIC);
ASSERT(ok != 0);
paperSize.cx = GetDeviceCaps(m_printerHDC, HORZSIZE);
paperSize.cy = GetDeviceCaps(m_printerHDC, VERTSIZE);
//scaleTo Milimeters - in my prog logical unit is 1mm
//and in MM_LOMETIC mode - unit =0.1 mm
//so scaleToMilimeters = 10;
xForm.eM11 = (FLOAT) scaleToMilimeters;
xForm.eM12 = (FLOAT) 0.0;
xForm.eM21 = (FLOAT) 0.0;
xForm.eM22 = (FLOAT) scaleToMilimeters;
xForm.eDx = (FLOAT) 0.0;
xForm.eDy = (FLOAT) (-scaleToMilimeters * paperSize.cy);
ok = SetWorldTransform(m_printerHDC, &xForm);
ASSERT(ok != 0);
SetBkMode(m_printerHDC, TRANSPARENT);
SelectObject(m_printerHDC, GetStockObject(BLACK_PEN));
// SelectObject(m_printerHDC, GetStockObject(LTGRAY_BRUSH));
stringOrigin.x = 10;
stringOrigin.y = 0;
SelectObject(m_printerHDC, GetStockObject(DEFAULT_GUI_FONT));
TextOut(m_printerHDC, 100, 100, docName, strlen(docName));
if (m_swap)
TextOut(m_printerHDC, 80, 50, "swapped rect", strlen("swapped rect"));
while (stringOrigin.y < paperSize.cy)
{
sprintf(theText, rawText, m_fontSize);
memset(&logFontPDF, 0, sizeof(LOGFONT));memset(&logFontPrinter, 0, sizeof(LOGFONT));
hFontPDF = NULL; hFontPrinter = NULL;
logFontPDF.lfHeight = m_fontSize;
logFontPrinter.lfHeight = (float)logFontPDF.lfHeight * (m_printerFontScale / 10);
hFontPDF = CreateFontIndirect(&logFontPDF);
hFontPrinter = CreateFontIndirect(&logFontPrinter);
SelectObject(m_printerHDC, hFontPrinter);
GetTextExtentPoint32(m_printerHDC, theText, strlen(theText), &stringSize);
stringOrigin.y += stringSize.cy + 1;
stringRect = CRect(stringOrigin.x, stringOrigin.y, stringOrigin.x + stringSize.cx, stringOrigin.y - stringSize.cy);
if(!m_printToPDF)
{
SelectObject(m_printerHDC, hFontPrinter);
}
TEXTMETRIC textMetric; memset(&textMetric, 0, sizeof(TEXTMETRIC));
GetTextMetrics(m_printerHDC, &textMetric);
//ok = Rectangle(m_printerHDC, stringRect.left, stringRect.top, stringRect.right, stringRect.bottom);
DrawBox(m_printerHDC, stringRect);
//TextOut(m_printerHDC, stringOrigin.x, stringOrigin.y, theText, strlen(theText));
// stringRect.bottom += stringSize.cy + 10;
// stringRect.top += stringSize.cy + 10;
//
// ok = Rectangle(m_printerHDC, stringRect.left, stringRect.top, stringRect.right, stringRect.bottom);
if(m_swap)
std::swap(stringRect.top, stringRect.bottom);
ok = DrawTextEx(m_printerHDC,
theText, -1,
(LPRECT)&stringRect,
DT_LEFT | DT_NOCLIP,
¶ms);
m_fontSize += m_fontSizeStep;
}
EndPage(m_printerHDC);
EndDoc(m_printerHDC);
}
был бы очень признателен за помощь - уже 4 дня в этом копаюсь...