Help! Printer and DirectX
От: Ved Украина  
Дата: 10.04.02 09:14
Оценка:
Доброго времени суток!
Люди добрые, выручайте, проект горит!!!

В чем может быть дело? При печати из 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.