- 締切済み
C言語 C++ においての画像参照が分からなくて困っています。
C言語やC++で画像を表示するプログラムを 検索エンジン等で調べているのですが、 コンパイルした後で、画像を差し替える事が出来るようにするには、 どうすればいいのか分かりません。 C言語大全500の極意という本は持っているので試しましたが、 ここに書かれてあるのは一度ヘッダーに取り込んでから表示するもので、後から差し替える事が出来ませんでした。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- machongola
- ベストアンサー率60% (434/720)
こんにちは。 ・C言語大全500の極意という本 立ち読みした位なのですが、確か画像処理にDIBSECTIONを使用していたような気がします。 と言う事で、多分win32だと思うのですが、アクションがある度にファイルから読み込んで表示たいのでしょうか。 以下はリターンキーを押す度に「ファイルを開く」ダイアログが開き、指定されたビットマップファイルをロードして表示します。 参考程度に。 #include<windows.h> #include<tchar.h> //「ファイルを開く」ダイアログを開く static BOOL OpenFileDlg(HWND hWndParent, LPTSTR tstrFileName, int strLen) { OPENFILENAME ofn= {sizeof(ofn)}; ofn.hwndOwner = hWndParent; ofn.hInstance = ::GetModuleHandle(NULL); ofn.lpstrFilter = _T("bitmapファイル(*.bmp)\0*.bmp\0"); ofn.lpstrFile = tstrFileName; ofn.nMaxFile = strLen - 1; ofn.Flags = OFN_FILEMUSTEXIST; return ::GetOpenFileName(&ofn); } //ウィンドウクラス登録 static ATOM Regist(LPCTSTR szClassName, WNDPROC wndProc) { WNDCLASSEX wndclass = {sizeof(wndclass)}; wndclass.hCursor = ::LoadCursor(NULL,IDC_ARROW); wndclass.hIcon = NULL; wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szClassName; wndclass.hbrBackground = (HBRUSH)::GetStockObject(BLACK_BRUSH); wndclass.hInstance = ::GetModuleHandle(NULL); wndclass.style = CS_BYTEALIGNCLIENT | CS_VREDRAW | CS_HREDRAW; wndclass.lpfnWndProc = wndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; return ::RegisterClassEx(&wndclass); } //ウィンドウを作成して開く static HWND OpenWindow(LPCTSTR szClassName, LPCTSTR szTitleName, INT w, INT h) { HINSTANCE hInst = ::GetModuleHandle(NULL); HWND hWnd = ::CreateWindowEx(0, szClassName, szTitleName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, w, h, NULL, (HMENU)NULL, hInst, NULL); return hWnd; } //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static HBITMAP hImage = NULL; switch(uMsg) { case WM_KEYDOWN: { //リターンキーが押されて離されたら if(wParam == VK_RETURN) { //選択されたファイル名を受け取るバッファ TCHAR tstrFileName[MAX_PATH + 1] = {_T('\0')}; //「ファイルを開く」ダイアログを開く if(::OpenFileDlg(hWnd, tstrFileName, sizeof(tstrFileName)) == TRUE) { //以前のイメージが残っていれば消す if(hImage) ::DeleteObject(hImage); //ビットマップをファイルから読み込む hImage = (HBITMAP)::LoadImage(NULL, tstrFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE); //ウィンドウの背景を消去 ::InvalidateRect(hWnd, NULL, TRUE); } } } break; case WM_PAINT: { //イメージがあったら if(hImage) { //再描画DCを開く PAINTSTRUCT ps; HDC hDCPaint = ::BeginPaint(hWnd, &ps); //ビットマップの詳細情報を取り出す BITMAP bitmap; ::GetObject(hImage, sizeof(bitmap), &bitmap); //メモリDCを作成 HDC hDCMem = ::CreateCompatibleDC(NULL); //ビットマップを選択 HGDIOBJ hGdiPrev = ::SelectObject(hDCMem, hImage); //ウィンドウに向かって描写 ::BitBlt(hDCPaint, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hDCMem, 0, 0, SRCCOPY); //リストア ::SelectObject(hDCMem, hGdiPrev); //メモリDCを消去 ::DeleteDC(hDCMem); //再描画DCを閉じる ::EndPaint(hWnd, &ps); } } break; case WM_CLOSE: //イメージが残っていたら消去する if(hImage) ::DeleteObject(hImage); ::DestroyWindow(hWnd); return 0; case WM_DESTROY: ::PostQuitMessage(0); return 0; } return ::DefWindowProc(hWnd, uMsg, wParam, lParam); } //メイン int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hInstancePrev, LPSTR lpCmdLine, int nShowCmd) { MSG msg; TCHAR tstrClassName[] = _T("bitmap viewer"); TCHAR tstrTitleName[] = _T("title"); //ウィンドウクラスの登録 ::Regist(tstrClassName, &::WndProc); //ウィンドウを作成して開く HWND hWnd = ::OpenWindow(tstrClassName, tstrTitleName, 800, 600); //ウィンドウの表示 ::ShowWindow(hWnd, SW_SHOW); //メッセージ回転 while(::GetMessage(&msg, hWnd, 0, 0) == TRUE) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } //終了 return msg.wParam; }
補足
有難うございます。 アクションは後で、つけるつもりで、特にwin32と決めていません。 教えていただいたプログラムは、VCでCPPに貼り付けてみましたが、 うまく動きませんでした。 もうちょっと、調べてみるとしますね。