IPicture インターフェースを使用して OleLoadPicture 関数から JPEGファイルを読み込むことができます。
以下のサンプルは画面の色を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;
}