• 締切済み

画像処理 ビットマップ ダブルバッファリング

「猫でもわかるWindowsプログラミング」を参考に、ビットマップを表示するプログラムを作っています。 下記ソース(WM_PAINT部分のみ抜粋)のような感じで、 読み込んだビットマップをダブルバッファリングを用いて表示させたいのですが、 何も表示させることができず、困っております。 LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ) {   HBITMAP hBmp;   BITMAP bmp_info;   HDC hDC, hDC_mem;   PAINTSTRUCT ps;   int w=0, h=0;   switch (msg) { case WM_PAINT:   hDC = BeginPaint(hwnd,&ps);   hDC_mem = CreateCompatibleDC(hDC);   hBmp=LoadBitmap(hInst, TEXT("MYBMP"));   hBmp = (HBITMAP)LoadImage(hInst, TEXT("MYBMP"), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); GetObject(hBmp, (int)sizeof(BITMAP), &bmp_info); w = bmp_info.bmWidth; h = bmp_info.bmHeight; SelectObject(hDC_mem, hBmp); BitBlt(hDC, 0, 0, w, h, hDC_mem, 0, 0, SRCCOPY); DeleteDC(hDC_mem); DeleteObject( hBmp ); EndPaint( hwnd, &ps ); break; } } リソースですが、下記のように bitmap1.bmpを指定しており、画像はもちろんフォルダ内に入れ、 読み込める状態にはしています。   //   // Bitmap   //   MYBMP BITMAP "bitmap1.bmp"   #endif // 日本語 resources しかし、hBmpの戻り値を調べると NULL の値が入っています。当然画像は表示されません。 当方、Microsoft visual studio 2005を使っておりますが、このプロジェクトは、 Win32コンソールアプリケーション⇒Windowsアプリケーション で作成はせず、 Win32コンソールアプリケーション⇒コンソールアプリケーション で作成していますので、 ここが問題になっているのでしょうか? できれば、コンソールアプリケーションで作成したいですが、LoadImage関数は使えないのでしょうか? それとも他に問題点があるのでしょうか? 以前は動画処理をしており、SetDIBitsToDevice関数を使って配列の中身を指定し、画像をウィンドウ上に表示していました。 しかし、画像のちらつきが気になったため、ダブルバッファリングに改良しようとし、 調べてみたところ、ビットマップを用いるやり方が一般的なようでした。 そこで、まずはビットマップの表示をさせるプログラムをつくってみようと思ったのですが、つまずいている状態です。 環境は、 Microsoft Windows XP Home Edition Version2002 Service Pack 3 Pentium(R) 4 CPU 2.80GHz 1.0GB RAM Microsoft visual studio 2005(有料) です。 何かアドバイスをよろしくお願いします。

みんなの回答

回答No.3

SelectObjectは、デバイスコンテキストにビットマップなどを選択すると同時に、元々選択されていたビットマップなどのハンドルを返します。メモリDCには、1×1ピクセル モノクロのビットマップが選択されているはずです。なので、このビットマップのハンドルを保存しておかないと、その後このビットマップの操作ができなくなる(リソースリーク)ということです。 デバイスコンテキストに選択されているリソースは、元に戻してからデバイスコンテキストをリリースするなり、削除するなりしないといけません。 HBITMAP hbmpOld; hbmpOld = (HBITMAP)SelectObject(hDC_mem, hBmp); BitBlt(hDC, 0, 0, w, h, hDC_mem, 0, 0, SRCCOPY); SelectObject(hDC_mem, hbmpOld); /* ここでSelectObjectが返すのはhBmpなので、保存する必要はない */ DeleteDC(hDC_mem); DeleteObject(hBmp); としましょう。

ryou_0202
質問者

補足

回答ありがとうございます。 単純に1つのビットマップを表示させるだけのプログラムは、 正常に動作するようになりました。 これを動画処理でも行えるようにしたいのですが、動画処理した結果をビットマップで連続で表示しようとするプログラムでは、BitBlltでウィンドウにうまく転送できていないようです。 (ウィンドウに変化なし+ウィンドウをクリックしてもアクティブにならない) 動画は25fpsで、1フレームごとに処理結果をビットマップ画像に書き込み、 LoadImage関数でそのビットマップ画像を読み込み、読み込んだ画像をBitBltで転送することの繰り返しを行っています。 試しに50フレーム間、画像処理結果をビットマップ画像に書き込んでみましたが、書き込み自体は正常に動作していると思います。 LoadImage関数も戻り値がNULLではないので問題ないはず。。 問題があるとすれば、ウィンドウやインスタンスのハンドル?と思ったので、 コンソールアプリケーションでつくっていたものを、 Windowsアプリケーションとしてつくりなおしてみましたが、問題はそこでなかったためか効果ありませんでした。 下記は、プログラムのソースになります。 ************************************************* // (1)ビットマップ(MYBMP)に画像処理結果書き込み  out_bmmap("MYBMP"); //自作のプログラム  hdc = BeginPaint(hWnd, &ps);  hdc_mem = CreateCompatibleDC(hdc); // (2)ビットマップ読み込み  hBmp = (HBITMAP)LoadImage(hInst,  TEXT("MYBMP"), IMAGE_BITMAP,  0, 0, LR_DEFAULTCOLOR);  GetObject(hBmp, (int)sizeof(BITMAP), &bmp_info);  w = bmp_info.bmWidth;  h = bmp_info.bmHeight;  hBmpOld = (HBITMAP)SelectObject(hdc_mem, hBmp);  // (3)ビットマップをウィンドウに転送  BitBlt(hdc, 0, 0, w, h, hdc_mem, 0, 0, SRCCOPY);  SelectObject(hdc_mem, hBmpOld);  DeleteDC(hdc_mem);  DeleteObject( hBmp );  EndPaint( hWnd, &ps ); ************************************************* (1)~(3)の処理を1フレームごとに行うために、 http://okwave.jp/qa/q6366968.html を参考にし、InvalidateRectとUpdateWindowを1フレームの処理ごとに使っています。 なかなかうまくいかないです;;

回答No.2

> wc.hInstance = (HINSTANCE)GetWindowLong( HWND_DESKTOP, GWL_HINSTANCE ); wcとは何? また、デスクトップはユーザーごとに1つなので、実行しているインスタンスのハンドルにはならないのでは? ビットマップが表示されないのとは関係ないかもしれませんが、 > hBmp=LoadBitmap(hInst, TEXT("MYBMP")); >  hBmp = (HBITMAP)LoadImage(hInst, TEXT("MYBMP"), IMAGE_BITMAP, > 0, 0, LR_DEFAULTCOLOR); どちらか一方にしたほうが良いのでは? > SelectObject(hDC_mem, hBmp); > > BitBlt(hDC, 0, 0, w, h, hDC_mem, 0, 0, SRCCOPY); > > DeleteDC(hDC_mem); > DeleteObject( hBmp ); hDC_memに最初に選択されていたビットマップのハンドルが保存されていません。 hBmpを選択後、選択を解除せずにhDC_memを削除しています。

ryou_0202
質問者

補足

ビットマップなんですが、表示できました! どうやらウィンドウハンドルを複数作成していたため、ごちゃごちゃになっていたのが原因みたいです。 表示はできたのですが、新たに教えていただきたいこともありますので、 以下、(1)~(3)に分けてコメントさせていただきます 。 (1)WNDCLASSEX wcは、ウィンドウのクラスです。  説明不足ですみません。 typedef WNDCLASSEXA WNDCLASSEX; typedef struct tagWNDCLASSEXA { UINT cbSize; /* Win 3.x */ UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; /* Win 4.0 */ HICON hIconSm; } (2)hBmpについては、試行錯誤していた際のソースを載せてしまいました;;  普段は、LoadImageのほうだけを書いていました。 (3)「hDC_memに最初に選択されていたビットマップのハンドルが保存されていません。hBmpを選択後、選択を解除せずにhDC_memを削除しています。」  とのことですが、私の理解力が足らずよく分かりませんでした。 申し訳ありませんが、もう少し詳しく教えていただいてもよろしいでしょうか? 私は、下記のような感じで、ダブルバッファリングをしているつもりだったのですが、まったく違うのでしょうか?  hDC = BeginPaint(hwnd,&ps);  hDC_mem = CreateCompatibleDC(hDC);  hBmp = (HBITMAP)LoadImage(hInst, TEXT("MYBMP"),   IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);  GetObject(hBmp, (int)sizeof(BITMAP), &bmp_info);  w = bmp_info.bmWidth;  h = bmp_info.bmHeight;  SelectObject(hDC_mem, hBmp);  // ここに hDC_memを対象とした描画処理を追加していく  //     [追加ソース]  BitBlt(hDC, 0, 0, w, h, hDC_mem, 0, 0, SRCCOPY);// 一度だけ転送  DeleteDC(hDC_mem);  DeleteObject( hBmp );

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

コンソールアプリで元を作ったのですか? WinMainからこないと色々と面倒なことを自前でやら無ければいけなくなりますが ・・・ リソースを読み込むにしても HINSTANCEが不正なら読み込めませんよ

ryou_0202
質問者

補足

コンソールがあったほうがデバッグしやすかったので。。 いろんな本を参考に自前で作成しました。 以前は、下記のようにSetDIBitsToDevice関数を使い、lpBmpDataの中身を 画面に表示していました。これについては、特に問題はなく表示できていたと思います。 //グラフィック用ウィンドウのデータをまとめた構造体 typedef struct {  HINSTANCE hi;  int x;// 表示開始位置  int y;  HWND hwnd;// 自分のウィンドウハンドル  BYTE *lpBmpData; // BMPのデータ部分  BITMAPINFOHEADER bih; } IMG0; // ウィンドウクラス登録時にインスタンスハンドルの取得 wc.hInstance = (HINSTANCE)GetWindowLong( HWND_DESKTOP, GWL_HINSTANCE ); //グローバル変数hInstに格納 hInst = wc.hInstance; IMG0 * pimg; hDC = BeginPaint(hwnd,&ps); SetDIBitsToDevice( hDC, 0, 0,// コピー先x,y座標    pimg -> bih.biWidth,// DIBの幅    pimg -> bih.biHeight,// DIBの高さ    0, 0,// DIBの座標    0,// 走査線    pimg -> bih.biHeight,// 走査線数    pimg -> lpBmpData,// 画像処理後のデータをここにいれています    (BITMAPINFO *)&( pimg -> bih),// BITMAPINFOにキャスト DIB_RGB_COLORS ); EndPaint( hwnd, &ps ); 私自身プログラミング初心者ですので、どこかのソース記述が間違っており、HINSTANCEが不正ということもあると思います。 上記ソースでは、hInst使ってないですし。。 一度Windowsアプリケーションで作成してみます!! アドバイスありがとうございました。

関連するQ&A

  • c++ ダブルバッファリング、以下のコードでできず

    こんばんわ。visual studio express 2013でC++を勉強している者です。 ダブルバッファリングをしたいのですが、チラつきが改善しません。 どう書けばダブルバッファリングを実現できるのか、ご教授ください。 以下は私が書いたコードの一部です。よろしくお願いします。 (要は、hdc_mem1のビットマップを、hdc_mem0(白紙のビットマップ)に読み込み、hdc_mem0のみを画面に表示しようとしています。 いずれは用意したすべての種類のビットマップをhdc_mem0に読み込み、hdc_mem0のみ画面に表示させることによってチラつきを抑えようと考えています) case WM_CREATE:  hdc = GetDC(hWnd);  hBmp0 = LoadBitmap(hInst, TEXT("MYBMP0"));  GetObject(hBmp0, (int)sizeof(BITMAP), &bmp_info0);  hdc_mem0 = CreateCompatibleDC(hdc);  SelectObject(hdc_mem0, hBmp0);  hBmp1 = LoadBitmap(hInst, TEXT("MYBMP1"));  GetObject(hBmp1, (int)sizeof(BITMAP), &bmp_info1);  hdc_mem1 = CreateCompatibleDC(hdc);  SelectObject(hdc_mem1, hBmp1);  DeleteObject(hBmp0);  DeleteObject(hBmp1);  ReleaseDC(hWnd, hdc);  break; case WM_PAINT:  hdc = BeginPaint(hWnd, &ps);  BitBlt(hdc_mem0, 0, 0, bmp_info1.bmWidth, bmp_info1.bmHeight, hdc_mem1, 0, 0, SRCCOPY);  BitBlt(hdc, 0, 0, bmp_info0.bmWidth, bmp_info0.bmHeight, hdc_mem0, 0, 0, SRCCOPY);  EndPaint(hWnd, &ps);  break; case WM_DESTROY:  DeleteDC(hdc_mem0);  DeleteDC(hdc_mem1);  PostQuitMessage(0);  break;

  • BCC5.5.1とBCCFormを使い、ビットマップを表示するプログラムを書いたが、ビットマップが表示されません。

    いつもお世話になっております。 小生、只今BCC5.5.1とBCCFormを使い、Win32APIを勉強しています。 今回、"猫でもわかるWindowsプログラミング第2版"の第9章を参考にビットマップを表示するプログラムを書き、 以下の手順で実行ファイルを作成、実行してみましたが、ビットマップが表示されません。 1.bcc32 -W source.cpp 2.brc32 Bitmap.rc source.exe 以下にソースを記述します。 source.cpp ※WndProc関数以外は猫でもわかると同じなので省略させていただきます。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc, hdc_mem; PAINTSTRUCT ps; HBITMAP hBmp; BITMAP bmp_info; int w, h; switch(msg){ case WM_PAINT: hdc = BeginPaint(hWnd, &ps); hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(MYBMP)); GetObject(hBmp, (int)sizeof(BITMAP), &bmp_info); w = bmp_info.bmWidth; h = bmp_info.bmHeight; hdc_mem = CreateCompatibleDC(hdc); SelectObject(hdc_mem, hBmp); BitBlt(hdc, 0, 0, w, h, hdc_mem, 0, 0, SRCCOPY); DeleteDC(hdc_mem); DeleteObject(hBmp); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } そしてリソーススクリプトです Bitmap.rc //----------------------------------------- // BCCForm Ver 2.41 // An Easy Resource Editor for BCC // Copyright (c) February 2002 by ysama //----------------------------------------- #include "ResBitmap.h" //-------------------------- // イメージ(MYBMP) //-------------------------- MYBMP BITMAP DISCARDABLE "C:\Documents and Settings\ShuNakagawa\My Documents\C\test.bmp" そしてリソースヘッダです(記述の無い箇所は省いています) ResBitmap.h //----------------------------------------- // BCCForm Ver 2.41 // Header File for Resource Script File // Copyright (c) February 2002 by ysama //----------------------------------------- //--------------------- // イメージリソース //--------------------- #define MYBMP 100

  • 画像表示について

    画像を表示させたいのですがうまくいきません。 途中まで打ってみたのでご意見お願いします。 (リソースから読み込んで表示させる方法) 環境:MicrosoftVisualC++ SDK ******省略********* case WM_PAINT:   hdc = BeginPaint(hWnd,&ps);   //ビットマップリソースハンドルの取得   hBmp = LoadBitmap( hInst, MAKEINTRESOURCE(IDB_BITMAP1));   if(hBmp == NULL){     MessageBox(hWnd,"ファイルの読み込みに失敗しました。","エラー",MB_ICONWARNING | MB_OK);     exit(1);   }   //ビットマップの大きさの情報取得   GetObject(hBmp,(int)sizeof(BITMAP),&bmp_info);   w = bmp_info.bmWidth;   h = bmp_info.bmHeight;   hdc_mem = CreateCompatibleDC(hdc);   SelectObject(hdc_mem,hBmp);   BitBlt(hdc,0,0,w,h,hdc_mem,0,0,SRCCOPY);   DeleteDC(hdc_mem);   DeleteObject(hBmp);   EndPaint(hWnd,&ps);   break; ******リソース(img.rc)****** // // Bitmap // IDB_BITMAP1 BITMAP DISCARDABLE "bitmap1.bmp" #ifdef APSTUDIO_INVOKED

  • ビットマップ画像表示

    いつもお世話になっております。 VS2005でC++を用いてWindowsアプリケーションの作成をしています。 子ウィンドウにビットマップ画像(ファイル名:HELP.bmp)を 表示させようとプログラムを組んだのですが、 子ウィンドウを出してもビットマップ画像が表示されません。 以下のようなプログラムを追加しました。 --------------------------------- ///リソーススクリプト/////////////////////////////////  IDB_BITMAP1  BITMAP DISCARDABLE  "HELP.bmp" ///ヘッダースクリプト/////////////////////////////////  #define IDB_BITMAP1   3000 ///ソーススクリプト/////////////////////////////////// void ShowMyBMP(HWND hWnd, HDC hdc){   HDC hmdc;   HBITMAP hBitmap;   BITMAP bmp;   HINSTANCE hInst;   int BMP_W, BMP_H;   hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);   hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));  //インスタンスハンドル取得   GetObject(hBitmap, sizeof(BITMAP), &bmp);  //ビットマップの情報を得る   BMP_W = (int)bmp.bmWidth;  //画像の幅   BMP_H = (int)bmp.bmHeight;  //画像の高さ   hmdc = CreateCompatibleDC(hdc);  //メモリデバイスコンテキストハンドルを取得   SelectObject(hmdc, hBitmap);   BitBlt(hdc, 0, 0, BMP_W, BMP_H, hmdc, 0, 0, SRCCOPY);   StretchBlt(hdc, 0, BMP_H, BMP_W / 2, BMP_H / 2, hmdc, 0, 0, BMP_W, BMP_H, SRCCOPY);   DeleteDC(hmdc); //デバイスコンテキストハンドルを開放   DeleteObject(hBitmap);   return; } --------------------------------- ShowMyBMP関数は子ウィンドウを表示するときに実行されます。 全て載せられないので追加した部分のみプログラムを載せましたが、 この部分だけでも、プログラムの間違い等はありませんでしょうか。 ご教授お願いいたします。

  • Win32APIとC言語を使ってビットマップを表示したいのですが、表示できません。

    小生、只今Win32APIとC言語を使い、WindowsXPSP3上でBCC5.5.1とBCCFormを使いビットマップを表示するプログラムを書いていますが、 "猫でもわかるWindows~"などに掲載されているサンプルを実行してみますが、ビットマップが表示されません。 ウィンドウクラスの登録、ウィンドウの生成などはほぼ、 http://gurigumi.s349.xrea.com/programming/visualcpp/intro4.html に掲載されている、サンプルプログラムと同じです。 違いと言うと、ResBitmap.hをインクルードしているくらいです。 問題はウィンドウプロシージャにあって、 下記にウィンドウプロシージャ、WndProc関数を記します。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc, hdc_mem; PAINTSTRUCT ps; HBITMAP hBmp; BITMAP bmp_info; static int w, h; switch(msg){ case WM_PAINT: hdc = BeginPaint(hWnd, &ps); hBmp = LoadBitmap(hInst, "MYBMP"); if(hBmp == NULL){ MessageBox(hWnd, "ビットマップ読み込み失敗", NULL, MB_OK); return 0; } GetObject(hBmp, (int)sizeof(BITMAP), &bmp_info); w = bmp_info.bmWidth; h = bmp_info.bmHeight; hdc_mem = CreateCompatibleDC(hdc); SelectObject(hdc_mem, hBmp); BitBlt(hdc, 0, 0, w, h, hdc_mem, 0, 0, SRCCOPY); DeleteDC(hdc_mem); DeleteObject(hBmp); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return 0; } return DefWindowProc(hWnd, msg, wp, lp); } この状態で実行ファイルを、 bcc32 -W source.cpp brc32 Bitmap.rc source.exe とし、出来上がったsource.exeを実行すると"ビットマップ読み込み失敗"のメッセージボックスが表示されてしまい、ウィンドウには何も表示されません。 ちなみに、Bitmap.rcは下記の様になってます。 MYBMP BITMAP DISCARDABLE "C:\Documents and Settings\ShuNakagawa\My Documents\C\test.bmp" ResBitmap.hは下記の様になってます。 #define MYBMP 100 以上です。 諸先輩方、アドバイス宜しくお願い致します。 もう悩んで2ヶ月程経ちます、どうか本当に助けてください。 ※LoadBitmapの第2引数をMAKEINTRESOURCE(MYBMP)とし、  実行ファイルを作成しましたが、結果は同じでした。。。

  • Bitmap表示について WIN32

    「猫でもわかるwindowsプログラミング 第4版」を参考にして、ビットマップを表示するプログラムを作っています。 開発環境はVisual Studio Express 2015(Visual C++)です。 読み込んだビットマップを表示させようと、下記のように(本の内容をそっくりそのまま)コードとリソースを書いてみたのですがデバッグすると何も表示されないウィンドウが出てしまいます。 メッセージボックスで確かめてみると、 ビットマップリソースを読み込んだ際、hBmpにNULLが返っていました。 コードもリソースも本の通りに書いたので間違いはないと思います。 となると、うまくいかない理由はリソースとビットマップをプロジェクトに追加させるまでの過程にあると考えます。 本で扱っている環境はVisual c++ 2010 だったのですが、リソースの追加に関してバージョンの差が関係しているのでしょうか? リソースの追加に関してはネットや本にたくさん説明がありますが、それらの通り書いてもうまくいきません。 どうか、リソースのプロジェクトへの追加方法を教えていただけないでしょうか。 また、ソースコード・リソースに関して間違いがあるのならばアドバイスもらえるとありがたいです。 // ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc, hdc_mem; PAINTSTRUCT ps; HBITMAP hBmp; BITMAP bmp_info; int w, h; switch (msg) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // ビットマップリソース「MYBMP」を読み込む hBmp = LoadBitmap(hInst, TEXT("MYBMP")); // ビットマップの情報を取得し、幅と高さを変数に保管 GetObject(hBmp, (int)sizeof(BITMAP), &bmp_info); w = bmp_info.bmWidth; h = bmp_info.bmHeight; // メモリデバイスコンテキストを作成 hdc_mem = CreateCompatibleDC(hdc); // メモリデバイスコンテキストにビットマップを選択 SelectObject(hdc_mem, hBmp); // ビットマップを転送 BitBlt(hdc, 0, 0, w, h, hdc_mem, 0, 0, SRCCOPY); StretchBlt(hdc, w, 0, w * 2, h * 2, hdc_mem, 0, 0, w, h, SRCCOPY); DeleteDC(hdc_mem); // メモリデバイスコンテキストを破棄 DeleteObject(hBmp); // ビットマップオブジェクトを破棄 EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } //リソース MYBMP BITMAP "bitmap1.bmp"

  • ビットマップの描画について(Windowプログラミング)

    おせわになります。 現在WIndows上で動作するソフトを作成しています。 ほとんど作成は終わっているのですが、作成したWindowsの上にビットマップを描画する部分で不安な点があります。 (これまであまり手をつけていなかったので) ネットなどを参考に作成したのですが、サンプルコードを見ていただいておかしいところを指摘していただければ幸いです。 以下のようなコードになります。 int ShowBMP(HWND hWnd, HDC hdc) { HDC hmdc; HBITMAP hBitmap; BITMAP bmp; HINSTANCE hInst; int BMP_W, BMP_H; hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); hBitmap = LoadBitmap(hInst, "TOPBMP"); GetObject(hBitmap, sizeof(BITMAP), &bmp); BMP_W = (int)bmp.bmWidth; BMP_H = (int)bmp.bmHeight; hmdc = CreateCompatibleDC(hdc); SelectObject(hmdc, hBitmap); BitBlt(hdc, 0, 0, BMP_W, BMP_H, hmdc, 0, 0, SRCCOPY); DeleteDC(hmdc); DeleteObject(hBitmap); return 1; }

  • WinAPI Directshow 動画

    WindowsプログラミングでDirectshowを使って動画処理をしています。 最終的には、動画処理した結果をウィンドウに順に表示させていくプログラムを作りたいです。 そのため、まずは、下の手順のようなプログラムを現在作っています。 (1) 動画を1フレームごとに取り込む (2) 情報をビットマップに書き出す (3) ビットマップを読み込む (4) ウィンドウに描画する (5) (1)~(4)を繰り返す プログラムはVisualStudio2005を使い、ウィンドウズアプリケーションで作成しています。 ウィンドウにビットマップが表示されてほしいのですが、何も表示されません。 2週間悩んでいますが、解決しません;; 以下にソースを貼らせていただきますので、アドバイスいただきたいです。 ※ソースの量が多いので、WM_TIMER, WM_PAINTの部分を中心に載せています。  (その他の部分は、最初から書かれているソースからほぼ変更していないです)  なお、WM_TIMER部分については、文字数の関係から別アカウントから回答1に書かせていただきます。 ----------------------- <追加グローバル宣言> int douga_flag=0; //メニューで動画処理を選ぶと1になります IGraphBuilder *pigb = NULL; /* フィルタグラフ用 */ IMediaControl *pimc = NULL; IMediaSeeking *pims = NULL; IBaseFilter *pibf = NULL; /* サンプルグラブ用 */ ISampleGrabber *pisg = NULL; IVideoWindow *pivw =NULL; AM_MEDIA_TYPE amt; HRESULT hr; OAFilterState fs; long n; LONGLONG nn1, flame_number; CImage1 gazou; /* ビットマップ画像のクラス */ // gazou.width(横サイズ), gazou.height(縦サイズ), gazou.bmmap_data(画像情報の入った配列) /* 動画→lpBmpDataに情報がはいる */ typedef struct { HINSTANCE hi; int x; // 表示開始位置 int y; HWND hwnd; // 自分のウィンドウハンドル BYTE *lpBmpData; // BMPのデータ部分 BITMAPINFOHEADER bih; } IMG0; IMG0 img00; ----------------------- <WndProc(主に WM_PAINT のソース)> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; int id, ww, hh; PAINTSTRUCT ps; HBITMAP hBmp, hBmpOld; BITMAP bmp_info; HDC hdc, hdc_mem; switch (message) {  ...省略... case WM_TIMER: //文字数の関係から別アカウントから回答1に書きます break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); hdc_mem = CreateCompatibleDC(hdc); hBmp = LoadBitmap(hInst, TEXT("bitmap.bmp")); GetObject(hBmp, (int)sizeof(BITMAP), &bmp_info); ww = bmp_info.bmWidth; hh = bmp_info.bmHeight; hBmpOld = (HBITMAP)SelectObject(hdc_mem, hBmp); BitBlt(hdc, 0, 0, ww, hh, hdc_mem, 0, 0, SRCCOPY); SelectObject(hdc_mem, hBmpOld); DeleteDC(hdc_mem); DeleteObject( hBmp ); // ロードしたビットマップを削除する EndPaint(hWnd, &ps); break; ...省略... }

  • ビットマップボタンを押したときの処理についてなんですが

    環境はVC++6.0 MFC ダイアログベースです。 MFC初心者なんですが、 HBITMAP hBitmap; hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), (LPCTSTR)csBMPFile,      IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); を使いビットマップハンドルをし取得しました。 ビットマップの貼り付けは出来たのですが、ボタンを押したときにビットマップの画像を変える処理の仕方がわかりません>< loadbitmapsなら容易に出来るのですが、どうしてもloadimageを使って表示したいのですが、どのようにすれば良いでしょうか? 御教授よろしくお願いします><

  • ビットマップ表示とSetTimer関数を同居させる方法

    ビットマップ表示とSetTimer関数を同居させる方法 現在、vc++2005を使用して、簡易的なGUIアプリケーションを作成しようとしているのですが、自分では解決ができない問題が発生してしまったので、質問させていただきます。 それはビットマップ表示とSetTimer関数を同居させる方法についてです。 ビットマップを読み込んで表示させる機能を追加してから、SetTimer関数が反応しなくなってしまい困っています。 ちなみにビットマップ表示の機能を追加する前まではSetTimer関数が正常に機能していました。 ウィンドウのハンドルhWndが何か関係しているのかと思ったのですが、解決方法がわからず・・・・・・ ご存知の方がいらっしゃましたら御教授いただけると幸いです。 ↓ ソースの一部です case WM_CREATE: //ビットマップファイル読み込み + 表示の準備 static HBITMAP hbitmap,prebitmap; static HDC hDC, hcomDC;      hbitmap = (HBITMAP)LoadImage(NULL,_T("kouen.bmp"),IMAGE_BITMAP,0,0, LR_LOADFROMFILE); if( hbitmap == NULL ) { MessageBox(hWnd, _T("ビットマップのロードに失敗しました"), _T("エラー"),MB_OK | MB_ICONWARNING); return 0; } hDC =GetDC(hWnd); hcomDC =CreateCompatibleDC(hDC); prebitmap= (HBITMAP)SelectObject(hcomDC,hbitmap);            (中略) break;                     case WM_LBUTTONDOWN: //2連続のシングルクリック防止 EnableWindow(hWnd,FALSE); SetTimer(hWnd, ID_TIMER1, 500, NULL); ← これが機能していない          (中略) break; case WM_PAINT: BitBlt( hDC, 0, 0, 1024, 690, hcomDC, 0, 0, SRCCOPY ); break; case WM_TIMER://機能しなくなってしまった部分 if(wParam==ID_TIMER1){ KillTimer(hWnd,ID_TIMER1); EnableWindow(hWnd,TRUE); }

専門家に質問してみよう