Возник такой вопрос. Печатать печатаю. Но сегодня решил поменять качество печатания с обычного на быстрое черновое и у меня вся печать пошла крахом. Совершенно не те размеры и прочее. Вопрос вот в чём. Когда я печатаю, в чём же всё такие задаются координаты. Например invoke TextOut,100,100,OFFSET Test, SIZEOF Test 100,100 - что за точки?
это X и Y соответственно в у.е. При печати надо сверяться с размерами холста, для уточнения. и корректировки. при черновой печати драйвер может сжимать холст для уменьшения качества вывода. Так к примеру делает у меня Epson'овский драйвер. При этом холст сжимается в двое, а вывод происходит с добавлением пустых строк.
Если я правильно понял из справки то invoke SetMapMode, pd.hDC, MM_LOMETRIC должен установить каждое значение равным 0.1мм. Т.е. 200 у.е. превращаются в 2см. Почему то принтер вообще никак не реагирует на это. Вообще перестал печатать. Чистый лист выходит. Попробовал так же и это Код (Text): invoke SetMapMode, pd.hDC, MM_ISOTROPIC invoke SetWindowExtEx,pd.hDC,800,600,NULL invoke SetViewportExtEx,pd.hDC,800,600,NULL invoke SelectObject, pd.hDC, font1 invoke TextOut,pd.hDC,200,1000,OFFSET StringOut,SIZEOF StringOut-1 invoke TextOut,pd.hDC,200,800,OFFSET StringOut1,SIZEOF StringOut1-1 Всё равно меняет размер. Чем выше качество выставляю, тем меньше печать получается.
Rito MM_LOMETRIC должен установить каждое значение равным 0.1мм. + координата по Y, при движении сверху вниз, меняется от 0 до -height, обрати внимание на _минус_. Вообще перестал печатать. Чистый лист выходит. Координаты Y отрицательные?
А почему при MM_LOMETRIC всё таки не получается точно в мм. 200 у.е. превращаются не в 2см, а примерно в 2,5см?
да, кстати а ни кто не знает, как сделать чтобы принтер печатал не книжную а альбомную страницу? DM_PORTRAIT и DM_LANDSCAPE есть такие флаги, но как ими пользоваться?
а я вот так печатаю Код (Text): invoke StartDoc, hdcPrint, offset docinf invoke StartPage,hdcPrint invoke SaveDC,hdcPrint invoke SetMapMode, hdcPrint, MM_TEXT ;invoke SetWindowExtEx, hdcPrint, 1000, 1000, NULL ;invoke SetViewportExtEx, hdcPrint, 800, -600, NULL invoke SetViewportOrgEx, hdcPrint, 800 , 600, NULL ;invoke SetTextAlign, hdcPrint, NULL ;invoke TextOut, hdcPrint, 0, 0, offset HelloPrinter, 100 invoke GetDC, hWnd mov hdc, eax invoke CreateCompatibleDC, hdc ;invoke CreateCompatibleDC, hdcPrint mov hMemDC, eax invoke SelectObject, hMemDC, hBitmap invoke BitBlt, hdcPrint, 0, 0, 600, 600, hMemDC, 0, 0, SRCCOPY ;invoke Ellipse, hdcPrint, 0,0,200,200 ;invoke Rectangle, hdcPrint,0, 0, 100, 100 invoke SetPixel, hdcPrint, 100, 100, NULL invoke SetPixel, hdcPrint, 101, 100, NULL invoke SetPixel, hdcPrint, 102, 100, NULL invoke SetPixel, hdcPrint, 103, 100, NULL invoke SetPixel, hdcPrint, 104, 100, NULL invoke SetPixel, hdcPrint, 105, 100, NULL invoke SetPixel, hdcPrint, 106, 100, NULL invoke SetPixel, hdcPrint, 107, 100, NULL invoke SetPixel, hdcPrint, 108, 100, NULL invoke SetPixel, hdcPrint, 109, 100, NULL invoke SetPixel, hdcPrint, 110, 100, NULL invoke SetPixel, hdcPrint, 111, 100, NULL invoke SetPixel, hdcPrint, 112, 100, NULL invoke SetPixel, hdcPrint, 113, 100, NULL invoke SetPixel, hdcPrint, 114, 100, NULL invoke SetPixel, hdcPrint, 115, 100, NULL invoke SetPixel, hdcPrint, 116, 100, NULL invoke SetPixel, hdcPrint, 117, 100, NULL invoke SetPixel, hdcPrint, 118, 100, NULL invoke SetPixel, hdcPrint, 119, 100, NULL invoke DeleteDC, hMemDC invoke RestoreDC, hdcPrint, -1 invoke EndPage, hdcPrint invoke EndDoc, hdcPrint ;invoke DeleteDC, hdcPrint
Это можно задать явно, только используя CreateDC, установив в dmFields бит DM_ORIENTATION и проставив в мембере dmOrientation константу 00000010b (DM_LANDSCAPE, как видимо). Если же заполнять остальные поля влом, проще "развернуть" отрисованное вручную, на 90°.
hellobody Там и хранится контекст принтера. Получаю так Код (Text): pd PRINTDLG <?> ... invoke PrintDlg,OFFSET pd ... По другому у меня не получилось получить его контекст.
понятно, у тебя по человечески сделано... а я вот так получил контекст Код (Text): invoke CreateDC, NULL, OFFSET PrinterName, NULL, NULL mov hdcPrint, eax что то у меня со структурами не сложилось...
у меня есть исходничег Код (Text): LPDEVMODE GetLandscapeDevMode(HWND hWnd, char *pDevice) { HANDLE hPrinter; LPDEVMODE pDevMode; DWORD dwNeeded, dwRet; /* Start by opening the printer */ if (!OpenPrinter(pDevice, &hPrinter, NULL)) return NULL; /* * Step 1: * Allocate a buffer of the correct size. */ dwNeeded = DocumentProperties(hWnd, hPrinter, /* Handle to our printer. */ pDevice, /* Name of the printer. */ NULL, /* Asking for size, so */ NULL, /* these are not used. */ 0); /* Zero returns buffer size. */ pDevMode = (LPDEVMODE)malloc(dwNeeded); /* * Step 2: * Get the default DevMode for the printer and * modify it for your needs. */ dwRet = DocumentProperties(hWnd, hPrinter, pDevice, pDevMode, /* The address of the buffer to fill. */ NULL, /* Not using the input buffer. */ DM_OUT_BUFFER); /* Have the output buffer filled. */ if (dwRet != IDOK) { /* If failure, cleanup and return failure. */ free(pDevMode); ClosePrinter(hPrinter); return NULL; } /* * Make changes to the DevMode which are supported. */ if (pDevMode->dmFields & DM_ORIENTATION) { /* If the printer supports paper orientation, set it.*/ pDevMode->dmOrientation = DMORIENT_LANDSCAPE; } if (pDevMode->dmFields & DM_DUPLEX) { /* If it supports duplex printing, use it. */ pDevMode->dmDuplex = DMDUP_HORIZONTAL; } /* * Step 3: * Merge the new settings with the old. * This gives the driver an opportunity to update any private * portions of the DevMode structure. */ dwRet = DocumentProperties(hWnd, hPrinter, pDevice, pDevMode, /* Reuse our buffer for output. */ pDevMode, /* Pass the driver our changes. */ DM_IN_BUFFER | /* Commands to Merge our changes and */ DM_OUT_BUFFER); /* write the result. */ /* Finished with the printer */ ClosePrinter(hPrinter); if (dwRet != IDOK) { /* If failure, cleanup and return failure. */ free(pDevMode); return NULL; } /* Return the modified DevMode structure. */ return pDevMode; } но я споткнулся на строке Код (Text): if (pDevMode->dmFields & DM_DUPLEX) как это на ассемблер перевести... ?
Rito 200,200 - такие вот координаты. При них чистый лист Поставь _минус_ перед координатой y. 200 у.е. превращаются не в 2см, а примерно в 2,5см? "Врет" расстояние от края листа или между точками внутри листа? hellobody if (pDevMode->dmFields & DM_DUPLEX) как это на ассемблер перевести... ? В данном случае, можно воспользоваться инструкцией test, а, в общем, необходимо использовать пару and/cmp. Так же можно указать компилятору сгенерировать asm-код.
Rito Врёт от края листа. Может зависить от физики принтера, например, бумага подается "криво" или у принтера есть "мертвая зона" и т.п. Попробуй вывести на печать прямоугольник с границами холста DC принтера.