Доброго времени суток!
Люди добрые, выручайте, проект горит!!!
В чем может быть дело? При печати из DirectX-приложения в режиме Fullscreen 256 цветов картинка не печатается (лист бумаги выезжает чистым), тогда как все то же, но в оконном режиме печатается "на ура"...? Вся логика работы и путь выполнения, а также значения (в т.ч. и возвращаемые функциями) одни и те же...
Код вызова следующий:
HANDLE hFile = CreateFile("C:\\Temp\\largekadr_pelikan.bmp", GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
NULL);
BYTE *pFile = new BYTE[GetFileSize(hFile, NULL)];
DWORD dwReaded = 0;
ReadFile(hFile, pFile, GetFileSize(hFile, NULL), &dwReaded, NULL);
CloseHandle(hFile);
Print(NULL/*hMainWnd*/, pFile), "Print Error");
delete [] pFile;
А используемые функции вот:
HDC GetPrinterDC(void)
{
DWORD dwNeeded = sizeof(PRINTER_INFO_5);
DWORD deReturned = 0;
ECheckBool(EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 5, NULL, 0, &dwNeeded,
&deReturned), "Enum printer for size error");
LPPRINTER_INFO_5 pinfo5Ex = (LPPRINTER_INFO_5)HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, dwNeeded);
ZeroMemory(pinfo5Ex, dwNeeded);
if (EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 5, (LPBYTE)pinfo5Ex, dwNeeded,
&dwNeeded, &deReturned))
{
HDC prnDC = CreateDC(NULL, pinfo5Ex->pPrinterName, NULL, NULL);
HeapFree(GetProcessHeap(), NULL, pinfo5Ex);
return prnDC;
}
else{
ECheckBool(false, "Enum printer info error");
}
if (pinfo5Ex != NULL) {
HeapFree(GetProcessHeap(), NULL, pinfo5Ex);
}
return NULL; //-- 1.11.2002: EnumPrinters failed
}
void PageGDICalls(HDC hdcPrn, int cxPage, int cyPage, BYTE* pBuffer) {
BITMAPFILEHEADER *pBitmapFileHeader;
BITMAPINFOHEADER *pBitmapInfoHeader;
LPVOID lpDIBBits;
BITMAPINFO *pBitmapInfo = NULL;
HBITMAP hBmp;
pBitmapFileHeader = (BITMAPFILEHEADER *)pBuffer;
pBitmapInfoHeader = (BITMAPINFOHEADER *)
(pBuffer + sizeof(BITMAPFILEHEADER));
if ( pBitmapFileHeader->bfType != 19778 ) //-- 10.30.2001: "BM"
ECheckBool(false, "Bitmap type error");
HDC dc = CreateDC("DISPLAY", NULL, NULL, NULL);
if (NULL == dc) {
ECheckBool(false, "Create dc \"DISPLAY\" error");
}
pBitmapInfo = (BITMAPINFO*)pBitmapInfoHeader;
lpDIBBits = (LPVOID) ( (LPDWORD)(pBitmapInfo->bmiColors
+ pBitmapInfo->bmiHeader.biClrUsed) +
((pBitmapInfo->bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0) );
hBmp = CreateDIBitmap(dc,pBitmapInfoHeader,CBM_INIT,
lpDIBBits,pBitmapInfo,DIB_RGB_COLORS);
if (NULL == hBmp) {
ECheckBool(false, "Create DIB bitmap error");
}
HDC _dc;
_dc = CreateCompatibleDC(hdcPrn);
if (NULL == _dc) {
ECheckBool(false, "CreateCompatibleDC error");
}
SelectObject(_dc, hBmp);
//cxPage -= 200;
//cyPage -= 200;
ECheckBool(BitBlt(hdcPrn, 0, 0, pBitmapInfoHeader->biWidth,
pBitmapInfoHeader->biHeight,
_dc, 0,0, SRCCOPY), "BitBlt error");
}
BOOL Print(HWND hwnd, BYTE *pBmpBuffer)
{
static DOCINFO di = {sizeof(DOCINFO), "Print1 : Printing", NULL};
BOOL bError = TRUE;
HDC hdcPrn = NULL;
int xPage = 0, yPage = 0;
if ((hdcPrn = GetPrinterDC()) == NULL){
ECheckBool(false, "GetPrinterDC return false");
return FALSE;
}
xPage = GetDeviceCaps(hdcPrn, HORZRES);
char buffer[100];
ZeroMemory(buffer,100);
itoa(xPage, buffer, 10);
ECheckBool(false, buffer);
yPage = GetDeviceCaps(hdcPrn, VERTRES);
ZeroMemory(buffer,100);
itoa(yPage, buffer, 10);
ECheckBool(false, buffer);
if (StartDoc(hdcPrn, &di) > 0) {
if (StartPage(hdcPrn) > 0) {
PageGDICalls(hdcPrn, xPage, yPage, pBmpBuffer);
if (EndPage(hdcPrn) > 0)
if (0 == EndDoc(hdcPrn)) {
ECheckBool(false, "EndDoc error");
bError = FALSE;
}
else{
ECheckBool(false, "EndPage error");
bError = FALSE;
}
}
else{
ECheckBool(false, "StartPage error");
bError = FALSE;
}
}else{
ECheckBool(false, "StartDoc error");
bError = FALSE;
}
if (0 == DeleteDC(hdcPrn)) {
ECheckBool(false, "DeleteDC error");
}
return bError;
}