- 締切済み
C言語 C++ においての画像参照が分からなくて困っています。
- みんなの回答 (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; }
関連するQ&A
- 書籍「C言語逆引き大全 500の極意」のコンパイラ
書籍「C言語逆引き大全 500の極意」で紹介されているコンパイラは何かご存知の方いらっしゃいませんか? サンプルプログラムを使用したいのですが、自分がいつも使用しているものではwindows関係のヘッダファイルが無くて使えないようです。
- ベストアンサー
- C・C++・C#
- C言語について
最近C言語でプログラミングを試みようとしてるのですが、コンパイルの時点でよく分かりません。 どのようなソフトでどのようにインストール・設定し、どのようにコンパイルするかなど、C言語でのプログラムのコンパイルから実行までを詳しく教えてください。
- ベストアンサー
- その他(ソフトウェア)
- C言語で白黒の画像表現
C言語による画像再構成の基礎 (画像再構成シリーズ) という本に基づいてC言語で画像再構成のプログラミングの勉強をしているのですが、この本の中で白い部分を100、黒い部分を0と画像を表現するプログラムを組んだあとそれを白と黒の画像にするソフトが明記されていませんでした。そのページが以下です。 http://autolandtom.web.fc2.com/text.html 赤下線部の「画像表示専用のソフト」を何かが存じの方がいらっしゃいましたら教えてくだいさい。 よろしくお願い致します。
- 締切済み
- 画像・動画・音楽編集
- C言語のプログラムが実行できません。
C言語のプログラムが実行できません。 コンパイルは出来るんですが、実行すると、「Segmentation fault」と表示されてしまいます。 これは何のエラーなんでしょうか? 基本的な事かもしれませんが、分かる方宜しくお願い致します。
- ベストアンサー
- C・C++・C#
- C言語をCPUに読み込ませるためには、 C言語か
C言語をCPUに読み込ませるためには、 C言語からアセンブリ言語にコンパイルして、 アセンブリ言語からアセンブルして機械語2進数にしてCPUに読み込ませるという 2段階をしないといけないんですか? 下記の画像のように説明している動画がありました
- ベストアンサー
- その他(プログラミング・開発)
- C言語のコンパイラについて教えてください。
C言語の勉強をしてるのですが、コンパイルすると普通にミスは認められず表示されたので、実行してみて入力とかしてみたら、途中で画面に「問題が発生しました。ご不憫をおかけします。この問題をマイクロソフト社に送信してください。ってでちゃって、組んだプログラムのテストみたいなのを出来ないことが多々あるのです。これはいったいどのような事がおこってるのでしょう?Bolrand社のC++って書いてあるコンパイラを使用してます。コンパイルされたからってミスはなかったなんてことはないということでしょうか?? お返事よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- C言語でこんなことは可能ですか?
現在あるプログラムを作りたいと思いC言語の勉強をしています。 それに伴い、下記のプログラムはC言語で作成可能でしょうか。 例) Aのフォルダ内にbというファイル(txt)があるとして、 bのファイル内の「ありがとう」という文字を検索し表示させるプログラム は作成可能でしょうか。表記としては --------------------------------- ファイル名 | 検索文字 --------------------------------- A | ありがとう -------------------------------- としたいと思っているのですが・・・ よろしくお願いします。
- ベストアンサー
- C・C++・C#
補足
有難うございます。 アクションは後で、つけるつもりで、特にwin32と決めていません。 教えていただいたプログラムは、VCでCPPに貼り付けてみましたが、 うまく動きませんでした。 もうちょっと、調べてみるとしますね。