JPEGファイルを印刷する


IPicture インターフェースを使用して OleLoadPicture 関数から JPEGファイルを読み込むことができます。


Sample code

以下のサンプルは画面の色をHigh Color以上に設定しておいてください。


#include <windows.h>
#include <tchar.h>
#include <olectl.h>

LPCTSTR lpszAppName = TEXT("MyApp");

int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    IPicture *pifPicture = NULL;
    
    LPCTSTR lpszFileName = TEXT("c:\\myjpeg.jpg");
    
    //JPEGファイルの読み込み
    HANDLE hFile = CreateFile(lpszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hFile != INVALID_HANDLE_VALUE) {
        DWORD fsize = GetFileSize(hFile, NULL);
        HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, fsize);
        if(hMem != NULL) {
            LPVOID lpMem = GlobalLock(hMem);
            DWORD dwRead;
            BOOL bRead = ReadFile(hFile, lpMem, fsize, &dwRead, NULL);
            GlobalUnlock(hMem);
            IStream  *pifStream;
            if(bRead && CreateStreamOnHGlobal(hMem, TRUE, &pifStream) == S_OK) {
                OleLoadPicture(pifStream, GlobalSize(hMem), FALSE, IID_IPicture, reinterpret_cast<LPVOID*>(&pifPicture));
                pifStream->Release();
            }
            else {
                GlobalFree(hMem);
            }
        }
        CloseHandle(hFile);
    }
    
    if(pifPicture != NULL) {
        OLE_HANDLE handle;
        BITMAP bm;
        pifPicture->get_Handle(&handle);
        if(GetObject(reinterpret_cast<HANDLE>(handle), sizeof(BITMAP), &bm) == sizeof(BITMAP)) {
            //デフォルトプリンタのデバイスコンテキストを作成
            PRINTDLG pd = {0};
            pd.lStructSize = sizeof(PRINTDLG);
            pd.Flags       = PD_RETURNDEFAULT;
            if(PrintDlg(&pd)) {
                LPDEVMODE lpDevMode = static_cast<LPDEVMODE>(GlobalLock(pd.hDevMode));
                LPDEVNAMES lpDevNames = static_cast<LPDEVNAMES>(GlobalLock(pd.hDevNames));
                HDC hDC = CreateDC(
                    reinterpret_cast<LPCTSTR>(lpDevNames) + lpDevNames->wDriverOffset,
                    reinterpret_cast<LPCTSTR>(lpDevNames) + lpDevNames->wDeviceOffset,
                    NULL, lpDevMode);
                GlobalUnlock(pd.hDevNames);
                GlobalUnlock(pd.hDevMode);
                
                if(hDC != NULL) {
                    //印刷
                    HDC hIC = CreateIC(TEXT("DISPLAY"), NULL, NULL, NULL);
                    double sx = static_cast<double>(GetDeviceCaps(hDC, LOGPIXELSX)) / GetDeviceCaps(hIC, LOGPIXELSX);
                    DeleteDC(hIC);
                    
                    DOCINFO di = {0};
                    di.cbSize = sizeof(DOCINFO);
                    di.lpszDocName = lpszAppName;
                    if(StartDoc(hDC, &di) > 0) {
                        StartPage(hDC);
                        OLE_XSIZE_HIMETRIC width;
                        OLE_YSIZE_HIMETRIC height;
                        pifPicture->get_Width(&width);
                        pifPicture->get_Height(&height);
                        pifPicture->Render(hDC, 0, 0, static_cast<LONG>(bm.bmWidth * sx), static_cast<LONG>(bm.bmHeight * sx), 0, height, width, -height, NULL);
                        EndPage(hDC);
                        EndDoc(hDC);
                    }
                    DeleteDC(hDC);
                }
                GlobalFree(pd.hDevMode);
                GlobalFree(pd.hDevNames);
            }
        }
        pifPicture->Release();
    }
    
    return 0;
}

一覧メニューへ