// ■画像をファイルから選ぶ // (注)デバッグモードで終了時(PostQuitMessage発行後) // 「0xC0000008: An invalid handle was specified」という // エラーが発生することがありますが、 // 「デバッグなしで開始」を選ぶか、 // メッセージが出たら「無視(I)」を選択して下さい #include "myWin.h" #include #define APP_NAME TEXT("Jpeg Test") static HBITMAP hBitmap=NULL;static HDC hMain=NULL, hdc; static BITMAP bitmap; static TCHAR str[255];static HANDLE hF; static OPENFILENAME CC;static BYTE dtBuff[16]; static TCHAR strFile[1024],strFileTitle[128];//TCHAR msg[4200]; static TCHAR sFilter[]=TEXT("Jpeg Files\0*.jpg\0GIF Files\0*.gif\0") TEXT("BMP Files\0*.bmp\0All Files\0*.*\0"); static HGLOBAL hMem; static DWORD nFileSize; static IStream *iStream=NULL; void getHandle(HWND hw){ DWORD nReadByte; short type; OLE_HANDLE hOle; IPicture *iPicture; nFileSize=GetFileSize(hF,NULL); hMem=GlobalAlloc(GMEM_MOVEABLE,nFileSize);//移動可能グローバル領域 LPVOID pvData=GlobalLock(hMem); ReadFile(hF,pvData, nFileSize, &nReadByte, NULL); GlobalUnlock(hMem); CloseHandle(hF); CreateStreamOnHGlobal(hMem,TRUE,&iStream);//ストリーム生成と変換 OleLoadPicture(iStream,nFileSize,FALSE,IID_IPicture,(LPVOID*)&iPicture); iStream->Release(); iPicture->get_Type(&type); if(type==PICTYPE_BITMAP)iPicture->get_Handle(&hOle); hBitmap=(HBITMAP)hOle; SelectObject(hMain,hBitmap);//ビットマット取得 GetObject(hBitmap,sizeof(BITMAP),&bitmap); GlobalFree(hMem); } void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ if(GetOpenFileName(&CC)){ hF=CreateFile(CC.lpstrFile,GENERIC_READ, 0,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); if(hF==INVALID_HANDLE_VALUE) MessageBox(hw,TEXT("オープンエラー"),TEXT("エラー"),MB_OK); else{ hdc=GetDC(hw); hMain=CreateCompatibleDC(NULL); getHandle(hw); CloseHandle(hF); } } InvalidateRect(hw,NULL,FALSE); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ CC.lStructSize =sizeof(OPENFILENAME); CC.hwndOwner =hw ; CC.hInstance =hInstance; CC.lpstrFilter =sFilter ; CC.nFilterIndex =1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile =strFile ; CC.nMaxFile =1024; CC.lpstrFileTitle =strFileTitle; CC.nMaxFileTitle =128; CC.lpstrInitialDir =TEXT("D:\\"); CC.lpstrTitle =TEXT("Jpeg,GIF入力"); CC.lpstrDefExt =TEXT("jpg") ; CC.FlagsEx =0; CC.Flags =OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_DONTADDTORECENT |OFN_NOTESTFILECREATE; procLButtonUp(hw, wp, lp); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; hdc=BeginPaint(hw,&ps); BitBlt(hdc,0,0,bitmap.bmWidth,bitmap.bmHeight,hMain,0,0,SRCCOPY); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : DeleteDC(hMain);DeleteObject(hBitmap); PostQuitMessage(0) ;return 0; case WM_CREATE : procCreate(hw,wp,lp) ;return 0; case WM_LBUTTONUP: procLButtonUp(hw,wp,lp);return 0; case WM_PAINT : procPaint (hw,wp,lp) ;return 0; } return DefWindowProc(hw,msg,wp,lp); }