как напечатать картинку?
От: ksd Россия  
Дата: 15.02.17 14:29
Оценка:
как напечатать картинку с помощью WINAPI? имеется в виду что то нативное для винды. особенно надо JPEG (если требуется долгий рассказ, как ее загрузить и сконвертить в съедобный для WINAPI формат, то его приводить не надо).

вот так все понятно:

void PrintPic(LPCTSTR fileName)
{
    HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,fileName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE|LR_VGACOLOR);
    PRINTDLG prDlg;
    memset( &prDlg, 0, sizeof(  prDlg  ) );
    prDlg.lStructSize = sizeof(  prDlg  );
    prDlg.Flags = PD_RETURNDC;
    if( !PrintDlg( & prDlg  ) ) return;
    DOCINFO  document_Information;
    HDC hPrinter =  prDlg.hDC;
    memset( &document_Information , 0, sizeof( document_Information ) );
    document_Information.cbSize = sizeof(  document_Information  );
    StartDoc( hPrinter, &document_Information  );
    StartPage( hPrinter );
    HDC hdcMem = 0;
    HBITMAP hbmOld = 0;
    if (hBitmap)
    {
        int bxWidth, bxHeight;
        BITMAP bitmap;
        GetObject(hBitmap,sizeof(BITMAP),&bitmap);
        bxWidth = bitmap.bmWidth;
            bxHeight = bitmap.bmHeight;
        int cxpage = GetDeviceCaps (hPrinter, HORZRES);
        int cypage = GetDeviceCaps (hPrinter, VERTRES);
        hdcMem = CreateCompatibleDC(hPrinter);
        hbmOld = (HBITMAP)SelectObject(hdcMem, hBitmap);
        SetMapMode (hPrinter, MM_ISOTROPIC);
            SetWindowExtEx(hPrinter, cxpage,cypage, NULL);
            SetViewportExtEx(hPrinter, cxpage, cypage,NULL);
            SetViewportOrgEx(hPrinter, 0, 0, NULL);
            StretchBlt(hPrinter, 0, 0, cxpage, cypage, hdcMem, 0, 0,bxWidth,bxHeight, SRCCOPY);
    }
    EndPage( hPrinter );
    EndDoc( hPrinter );
    DeleteDC( hPrinter );
    SelectObject(hdcMem, hbmOld);
    DeleteDC(hdcMem);
}


возможно, есть другие пути?
#winapi #печать #cpp #c++
Re: переформулирую вопрос
От: ksd Россия  
Дата: 15.02.17 16:22
Оценка:
Мне надо напечатать текст поверх того, что уже отправлено на принтер, для чего у меня есть DC этого принтера, больше ничего нет, исходников той части, которая формирует изображение на печать тоже нет.
Делаю так:
cdc = CreateCompatibleDC(srcDc),
CreateCompatibleBitmap(srcDC),
FillRect(cdc),
DrawText(cdc),
BitBlt(cdc -> srcDC)
EndPage
EndDoc
когда печатается "до меня" текст, то все нормально, когда сложная графика -- мой текст не печатается. что не так может быть?
Re[2]: переформулирую вопрос
От: kov_serg Россия  
Дата: 15.02.17 20:04
Оценка: 12 (1)
Здравствуйте, ksd, Вы писали:

ksd>когда печатается "до меня" текст, то все нормально, когда сложная графика -- мой текст не печатается. что не так может быть?

У меня когда печатались большие картинки вообще писало out of memory на пустом листе.

Так попробуйте http://www.fengyuan.com/bin/printpic.zip
Feng YuanWindows Graphics Programming: Win32 GDI and DirectDraw глава 17
Re: как напечатать картинку?
От: CEMb  
Дата: 16.02.17 02:49
Оценка:
Здравствуйте, ksd, Вы писали:

ksd>как напечатать картинку с помощью WINAPI? имеется в виду что то нативное для винды. особенно надо JPEG


я JPEG импортирую через GDI+, если такой вариант устраивает, могу вечером код скинуть, строк десять-пятнадцать. Там, вроде бы, конвертация в Bitmap есть

есть исходники на jpeg.org для работы с jpeg, если надо совсем всё...
Re[3]: переформулирую вопрос
От: ksd Россия  
Дата: 16.02.17 12:26
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, ksd, Вы писали:


ksd>>когда печатается "до меня" текст, то все нормально, когда сложная графика -- мой текст не печатается. что не так может быть?

_>У меня когда печатались большие картинки вообще писало out of memory на пустом листе.

_>Так попробуйте http://www.fengyuan.com/bin/printpic.zip

Спасибо. Попробовал. Тут моим простым сермяжным методом все работает. Но все также не работает в основном приложении.


_>Feng YuanWindows Graphics Programming: Win32 GDI and DirectDraw глава 17
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.