• 締切済み

C言語 C++ においての画像参照が分からなくて困っています。

C言語やC++で画像を表示するプログラムを 検索エンジン等で調べているのですが、 コンパイルした後で、画像を差し替える事が出来るようにするには、 どうすればいいのか分かりません。 C言語大全500の極意という本は持っているので試しましたが、 ここに書かれてあるのは一度ヘッダーに取り込んでから表示するもので、後から差し替える事が出来ませんでした。

  • proxi
  • お礼率27% (3/11)

みんなの回答

回答No.1

 こんにちは。 ・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; }

proxi
質問者

補足

有難うございます。 アクションは後で、つけるつもりで、特にwin32と決めていません。 教えていただいたプログラムは、VCでCPPに貼り付けてみましたが、 うまく動きませんでした。 もうちょっと、調べてみるとしますね。

関連するQ&A

  • 書籍「C言語逆引き大全 500の極意」のコンパイラ

    書籍「C言語逆引き大全 500の極意」で紹介されているコンパイラは何かご存知の方いらっしゃいませんか? サンプルプログラムを使用したいのですが、自分がいつも使用しているものではwindows関係のヘッダファイルが無くて使えないようです。

  • C言語とC++言語

    C言語でコンパイルできC++でコンパイルできないプログラムとその逆でC++でコンパイルできC言語でコンパイルできないプログラムを教えてください。よろしく

  • C言語について

    最近C言語でプログラミングを試みようとしてるのですが、コンパイルの時点でよく分かりません。 どのようなソフトでどのようにインストール・設定し、どのようにコンパイルするかなど、C言語でのプログラムのコンパイルから実行までを詳しく教えてください。

  • C言語です。

    C言語です。 2次元配列を用いて、2つの2行3列の行列 A=[ 1 2 3 4 5 6 ] B=[ 6 3 4 5 1 2 ] の和を表示するプログラムを教えてください。 コンパイル結果 7 5 7 9 6 8

  • C言語について

    パソコン系の就職に就きたく、C言語について勉強したいと思い、 本を買い勉強することにしました。 しかし、最初の初歩でつまずいてしまいました。 プログラムがコンパイル出来ないのです… ソースファイルを保存したディレクトリに移動してとかいてあるのですが何を移動するのでしょうか? コマンドプロントを使えません。 助けてください…

  • C言語で白黒の画像表現

    C言語による画像再構成の基礎 (画像再構成シリーズ) という本に基づいてC言語で画像再構成のプログラミングの勉強をしているのですが、この本の中で白い部分を100、黒い部分を0と画像を表現するプログラムを組んだあとそれを白と黒の画像にするソフトが明記されていませんでした。そのページが以下です。 http://autolandtom.web.fc2.com/text.html 赤下線部の「画像表示専用のソフト」を何かが存じの方がいらっしゃいましたら教えてくだいさい。 よろしくお願い致します。

  • C言語のプログラムが実行できません。

    C言語のプログラムが実行できません。 コンパイルは出来るんですが、実行すると、「Segmentation fault」と表示されてしまいます。 これは何のエラーなんでしょうか? 基本的な事かもしれませんが、分かる方宜しくお願い致します。

  • C言語をCPUに読み込ませるためには、 C言語か

    C言語をCPUに読み込ませるためには、 C言語からアセンブリ言語にコンパイルして、 アセンブリ言語からアセンブルして機械語2進数にしてCPUに読み込ませるという 2段階をしないといけないんですか? 下記の画像のように説明している動画がありました

  • C言語のコンパイラについて教えてください。

    C言語の勉強をしてるのですが、コンパイルすると普通にミスは認められず表示されたので、実行してみて入力とかしてみたら、途中で画面に「問題が発生しました。ご不憫をおかけします。この問題をマイクロソフト社に送信してください。ってでちゃって、組んだプログラムのテストみたいなのを出来ないことが多々あるのです。これはいったいどのような事がおこってるのでしょう?Bolrand社のC++って書いてあるコンパイラを使用してます。コンパイルされたからってミスはなかったなんてことはないということでしょうか?? お返事よろしくお願いいたします。

  • C言語でこんなことは可能ですか?

    現在あるプログラムを作りたいと思いC言語の勉強をしています。 それに伴い、下記のプログラムはC言語で作成可能でしょうか。 例) Aのフォルダ内にbというファイル(txt)があるとして、 bのファイル内の「ありがとう」という文字を検索し表示させるプログラム は作成可能でしょうか。表記としては --------------------------------- ファイル名 | 検索文字 ---------------------------------  A    | ありがとう  -------------------------------- としたいと思っているのですが・・・ よろしくお願いします。

専門家に質問してみよう