BitBlt関数を使用して画像を表示する方法

このQ&Aのポイント
  • BitBlt関数を使って画像を表示したいが正常に表示されない。解決方法を教えてください。
  • 画像表示のためにBitBlt関数を使用したが、画像が表示されない。解決策を教えてください。
  • BitBlt関数を使って画像を表示できません。どのようにすれば表示できるでしょうか?
回答を見る
  • ベストアンサー

BitBlt関数について

お世話になっております。   またまた質問ですが、   画像を表示したいので、BitBlt関数を使ってみたんですが、   エラーもなく、実行できました。   しかし、画像が表示されません。   サイトや本を何回も見て、間違いがないか見たんですけど、間違いがまったく見当たりません。   LRESULT CALLBACK VisualProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch(uMsg) { case WM_CREATE: memdc = CreateCompatibleDC( NULL ); hBitmap = ( HBITMAP )LoadImage( NULL , TEXT("player.bmp") , IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE | LR_CREATEDIBSECTION ); SelectObject(memdc, hBitmap); return 0; case WM_PAINT: hdc = BeginPaint(VisualWnd,&ps); BitBlt(hdc, 30,30, 34, 32, memdc, 0, 0, SRCCOPY); EndPaint(VisualWnd,&ps); return 0; .............................................................................. 画像は、リソースで追加→既存の項目→ピクチャ でやりました。 それで、ピクチャからプロジェクトのファイルに移動させました。   それでもできません。     一体どのようにやればいいのでしょうか。 わかりやすく教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#144013
noname#144013
回答No.4

#3です。 #3の補足について。 > 1.はい、staticです。 それで大丈夫のはずです。 > 2.リソースは削除してやってみました。できません。 では、表示させたいビットマップファイルは実行ファイル(*.exe)とは別に存在 する(ファイル名"player.bmp"のファイルとして存在している)と言うことですね? それならば"player.bmp"は、実行ファイル(*.exe)と同じフォルダ(ディレトリ) に置いて下さい。 もしも、Debug版とRelease版で別々のフォルダに実行ファイルを作成している 場合は、"player.bmp"も両方のフォルダにそれぞれコピーしておいて下さい。 注)開発ツールの画面上のプロジェクトツリー等のフォルダではなく、実際の   ディスク上のフォルダにビットマップファイルを置いて下さい。 なお、LoadImage関数の引数での"player.bmp"の記述をフルパス(ドライブ名 から始まるフルパス名)で指定した場合は、"player.bmp"を複数コピーする 必要はありません。 > 3.第一引数は、再描画するウィンドウのハンドルと本に書いてあったので、 > VisualWndにしました。 VisualWnd が示すウィンドウとは、アプリケーションのメインウィンドウ(クライ アント領域)とは違うものなのでしょうか? その本にどう書かれているか判りませんが、質問者さんが今回書かれた プログラム(ソースコード)の内容により、関数の引数などの記述もその状況に 合わせて変更しなくてはいけません。 ですので、ご自分で記述した変数などの意味、及び、使用している関数等の 使い方、記述方法などをヘルプ、書籍、WEB等で調査しその内容をよく理解 した上でコードを記述なさって下さい。 取りあえず今回について言えば、VisualWnd の記述を VisualProc関数の引数 の記述にあわせて hWnd に変更して検証してみては如何でしょうか? あと、デバッグ環境が使えるのならプログラムをステップ実行で実行しながら 各変数の値が正常か、及び、各関数の戻り値などが正常値で返されているか どうかを一つ一つ検証しながらプログラムを追ってみることをお勧め致します。 以上です。

crashbeen
質問者

お礼

すいません、本当は補足にしたかったんですが・・・   hBitmap = ( HBITMAP )LoadImage( NULL , TEXT("player.bmp") , IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE); if(hBitmap == NULL){ MessageBox(hWnd, TEXT("ビットマップ読み込み失敗"), NULL, MB_OK); return 0; }   というようにしたら、必ず失敗するので、原因はLoadImageにあるようなのですが・・・

crashbeen
質問者

補足

こんなに丁寧に何回も説明してもらってるのにできません。すいません。   player.bmpは実行ファイルと同じフォルダに入れました。 hWndに変更してもやってみましたが、変化なし、です。

その他の回答 (3)

noname#144013
noname#144013
回答No.3

こんにちは。 的外れな部分もあるかもしれませんが、下記の件についてもう一度確認されて みては如何でしょうか? 1)変数 memdc と hBitmapについて(#1さんの指摘事項) 変数 memdc と hBitmap については、コールバック関数(今回はVisualProc)の 先頭部分で、   static HDC memdc;   static HBITMAP hBitmap; のように記述されているということで宜しいでしょうか? だとすれば、これについては問題ないと思います。 memdc、hBitmap の両変数ともに、ウィンドウ終了時(WM_DESTROY)などに、 そのオブジェクトを破棄する必要がありますので、staticな変数にしておく必要 があると思います。 2)ビットマップの読込み方法について(#2さんの指摘事項) ビットマップ("player.bmp")を外部ファイルとして実行時に読込むのであれば、 ご提示の LoadImage関数の記述で良いと思いますが、 そうではなくて、リソーススクリプト(*.rc)の指定により、実行ファイル自体に ビットマップを取込んで使用する場合は、LoadImage関数の引数の記述の変更、 または、LoadBitmap関数の利用になると思います。 a)LoadImage関数でリソースのビットマップを読込む記述例   hBmp = (HBITMAP)LoadImage( hInst,     MAKEINTRESOURCE(IDB_BITMAP1),     IMAGE_BITMAP,     0, 0,     LR_CREATEDIBSECTION ); b)LoadBitmap関数でリソースのビットマップを読込む記述例   hBmp = LoadBitmap( hInst,     MAKEINTRESOURCE(IDB_BITMAP1) ); 上記の例で、   ・hInst はアプリケーションのインスタンスハンドル   ・IDB_BITMAP1 はビットマップのリソースID とします。 3)BeginPaint関数 と EndPaint関数 の記述について > case WM_PAINT: > hdc = BeginPaint(VisualWnd,&ps); > BitBlt(hdc, 30,30, 34, 32, memdc, 0, 0, SRCCOPY); > EndPaint(VisualWnd,&ps); この部分の BeginPaint と EndPaint の両関数の第1引数に指定している VisualWnd はウィンドウハンドルのはずですが、これは何処で、何の値を 設定しているのでしょうか? 通常なら、コールバック関数(VisualProc)の第1引数で渡される hWnd を 指定すると思うのですが、この点は大丈夫でしょうか? ■参考サイト(MSDN) LoadImage 関数 http://msdn.microsoft.com/ja-jp/library/cc364835.aspx LoadBitmap 関数 http://msdn.microsoft.com/ja-jp/library/cc410429.aspx BeginPaint 関数 http://msdn.microsoft.com/ja-jp/library/cc428337.aspx EndPaint 関数 http://msdn.microsoft.com/ja-jp/library/cc428553.aspx 以上です。

crashbeen
質問者

お礼

ありがとうございました。 どうやら、画像が原因だったようです。

crashbeen
質問者

補足

せっかく丁寧に説明してもらったのですが、まったくできません。 1.はい、staticです。 2.リソースは削除してやってみました。できません。 3.第一引数は、再描画するウィンドウのハンドルと本に書いてあったので、VisualWndにしました。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>static HDC memdc; >としましたが、それではだめなのでしょうか? 寿命としては大丈夫…かと。 となると、次はLoadImage()がエラーになっていないか…でしょうか。 エラーの場合はGetLastError()でエラーコードの確認…でしょうな。 >画像は、リソースで追加→既存の項目→ピクチャ >でやりました。 ビットマップリソースとして取り込んだのであれば…引数が違うかと思われますが…… .rcにはどう書かれていますか?

crashbeen
質問者

お礼

ありがとうございました。 どうやら、画像が原因だったようです。

crashbeen
質問者

補足

画像を表示するには、リソースに追加する必要があると思ったので・・・ ↑のかたが、ファイルから読み込むならあってると思うとおっしゃってたので、リソースの方は消しました。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>memdc = CreateCompatibleDC( NULL ); >hBitmap = ( HBITMAP )LoadImage( NULL , TEXT("player.bmp") , IMAGE_BITMAP , >0 , 0 , LR_LOADFROMFILE | LR_CREATEDIBSECTION ); とりあえず、memdcとhBitmapはの寿命は大丈夫ですか? hBitmapはすぐ使用しているので「エラーがなければ」問題ないとして、 memdcがローカル変数だったりすると 「WM_CREATEの時のmemdc」と「WM_PAINTの時のmemdc」は別のモノだったりしますが…。

crashbeen
質問者

補足

回答ありがとうございます。  static HDC memdc; としましたが、それではだめなのでしょうか?

関連するQ&A

  • BitBlt関数について教えてください

    よろしくお願いします。 画像を読み込むための、BitBlt関数について、色々調べてみたのですが、どうしても分からない記述が2つあります。ご指導、アドバイスをお願いします。 1、サンプルのソースを参考にしているのですが、BitBlt関数の第2、第3の記述の意味として、 『PAINTSTRUCT構造体のポインタpsが、左隅上、を参照している』と解釈したのですが、第4、第5引数の、-(引く)の意味が理解できません。 2、画像を2種類表示するためメニューに、『オプション1とオプション2』を作り、オプション1はコピー元と同じ画像を表示、 オプション2は、ラスタオペレーションを選択可能にして、選択した画像を表示すると言うものですが、DWORD dwRop; を宣言し『第9引数をNOTSRCCOPY』として、二つ目の画像を表示する case文に dwRop = NOTSRCCOPY; を追加したのですがうまく行きません。多分 『dwRop』の使い方に問題があるのかと思うのですが、うまく表示されません。 因みに、 BitBlt関数の第9引数が『SRCCOPY』の時は、正常に2種類の画像が表示されます。 /*ウィンドウプロシージャ*/  LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)  { HDC hdc;  DWORD dwRop; //追加した  PAINTSTRUCT ps;  HBITMAP hBmp;  HDC hdc_memx;  switch(msg){  case WM_CREATE:  hdc = GetDC(hWnd);  hBmp = LoadBitmap(hInst, "MYBMP1");  if(hBmp == NULL){  MessageBox(hWnd, "画像1のロードに失敗しました", "エラー",  MB_OK | MB_ICONWARNING);  return 0;  }  hdc_mem1 = CreateCompatibleDC(hdc);  SelectObject(hdc_mem1, hBmp);  DeleteObject(hBmp);  hBmp = LoadBitmap(hInst, "MYBMP2");  if(hBmp == NULL){   MessageBox(hWnd, "画像2のロードに失敗しました", "エラー",   MB_OK | MB_ICONWARNING);  return 0;  } hdc_mem2 = CreateCompatibleDC(hdc);  SelectObject(hdc_mem2, hBmp);  DeleteObject(hBmp);  ReleaseDC(hWnd, hdc);  break;  case WM_PAINT:  BeginPaint(hWnd, &ps);  if(show_no == 1) hdc_memx = hdc_mem1;  if(show_no == 2) hdc_memx = hdc_mem2;  BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top, hdc_memx, ps.rcPaint.left, ps.rcPaint.top, SRCCOPY);  // PATCOPYにして,IDM_ANIME2に、dwRop=NOTSRCCOPY //を追加しても変更されないし、画像の表示が出来ない EndPaint(hWnd, &ps);  break; case WM_COMMAND: switch (LOWORD(wp)){ case IDM_ANIME1: show_no = 1;      //dwRop = SRCCOPY //追加したが変化なし InvalidateRect(hWnd, NULL, TRUE); break;  case IDM_ANIME2: show_no = 2; //dwRop = NOTSRCCOPY; //追加したが変化なし InvalidateRect(hWnd, NULL, TRUE); break;  case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0); break; } break;  case WM_DESTROY: DeleteDC(hdc_mem1); DeleteDC(hdc_mem2); PostQuitMessage(0); break;  default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }

  • 別関数に渡す変数のポインタが難しい

    構造体初心者で、ポインタもよく分かっていません。 12, 8 と表示するつもりのソースだけど、実行結果は違っていました。 直してください。 ソースは長いけど、スケルトンに構造体とTextOutを付けたぐらいのものです。 #include <windows.h> struct MYOBJ { int a; int b; }; LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) { MSG msg; WNDCLASS wc; 投稿できなかったからここを消しました。 wc.lpszClassName = "x"; if(RegisterClass(&wc) == 0)return 0; HWND hWnd = CreateWindow("x","",WS_OVERLAPPEDWINDOW|WS_VISIBLE,0,0,320,240,NULL,NULL,hInst,NULL); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } void myfunc(struct MYOBJ *obj)//ここが違うかもしれません。 { obj->a += 2; obj->b -= 2; } LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HDC hDC; PAINTSTRUCT ps; char buf[30]; switch(uMsg) { case WM_CREATE: struct MYOBJ myobj; myobj.a = 10; myobj.b = 10; myfunc(&myobj);//ここが違うかもしれません。 return 0; case WM_PAINT: hDC = BeginPaint(hWnd, &ps); wsprintf(buf, "%d, %d", myobj.a, myobj.b); TextOut(hDC, 0, 0, buf, strlen(buf)); EndPaint(hWnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; }

  • なぜhButton1ボタンからのWM_COMMANDはフックできてクライアントエリアのWM_RBUTTONDOWNはフックできないのでしょうか?

    #define STRLBUTTON TEXT("マウス左ボタンが押されました from mainProc") #define STRRBUTTON TEXT("マウス右ボタンが押されました from my_HookProc") #define STRCOMMAND TEXT("ボタンが押されました") HWND hButton1; LRESULT CALLBACK my_HookProc(int nCode, WPARAM wParam, LPARAM lParam) { CWPRETSTRUCT *pcwpRetStruct = (CWPRETSTRUCT *)lParam; HDC hDC; if(nCode==HC_ACTION) { hDC = GetDC(pcwpRetStruct->hwnd); switch(pcwpRetStruct->message) { case WM_COMMAND: TextOut(hDC, 10, 10, STRCOMMAND, strlen(STRCOMMAND)); break; case WM_RBUTTONDOWN: TextOut(hDC, 10, 10, STRRBUTTON, strlen(STRRBUTTON)); break; } ReleaseDC(pcwpRetStruct->hwnd, hDC); } return CallNextHookEx(NULL, nCode, wParam, lParam); } LRESULT CALLBACK mainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static HHOOK hHook; HDC hDC; switch(uMsg) { case WM_DESTROY: UnhookWindowsHookEx(hHook); PostQuitMessage(0); return 0; case WM_CREATE: hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, my_HookProc, NULL, GetCurrentThreadId() ); if(!hHook) MessageBox(NULL, "hooking failed", NULL, MB_OK); hButton1 = CreateWindow( "BUTTON", "hButton1", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 40, 100, 20, hWnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL ); return 0; case WM_LBUTTONDOWN: hDC = GetDC(hWnd); TextOut(hDC, 10, 10, STRLBUTTON, strlen(STRLBUTTON)); ReleaseDC(hWnd, hDC); return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); }

  • WinAPIでの画像高速切り替え表示プログラム1

    WinAPIを使用して、ビットマップ画像を8枚読み込み、それを連続高速表示するプログラムを作成しています。 今はSetTimerを使ってWM_TIMERを受け取ったときに画像をInvalidateRect(再描画)しています。 以下のソースで動作はするのですが、WM_TIMERは整数ミリ秒でしか設定できず、精度も悪く優先順位も遅いようなので他の方法を考えています。 画像8枚を6.25msecで切り替えて表示するというのをESCAPEするまで繰り返したいのですが...。 リフレッシュレートは160Hzにあげています。 QueryPerformanceFrequencyというものを使えばいいのかなと思っていますが、どこでどう使えばいいのか、それをどう受け取って再描画すればいいのかわかりません。 どなたかご教授お願いします。ソースファイルを書いていただけたら嬉しいです。 #include<windows.h> #define BMP_SUM8//画像の総数 #define TIMER_ID (100) // 作成するタイマの識別ID #define TIMER_ELAPSE (6) // WM_TIMERの発生間隔 LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){ HDC hdc; PAINTSTRUCT ps; HBITMAP hBitmap; int i; const char *filename[BMP_SUM]={"gazou0.bmp", "gazou1.bmp", "gazou2.bmp", "gazou3.bmp", "gazou4.bmp", "gazou5.bmp", "gazou6.bmp", "gazou7.bmp"}; static HDC hMemDC[BMP_SUM]; static BITMAP bmp; static int bmp_index;//現在の画像番号 LONG lResult; switch(uMsg) { case WM_CREATE: hdc=GetDC(hWnd); for(i=0;i<BMP_SUM;i++){ hBitmap=(HBITMAP)LoadImage(0,filename[i],IMAGE_BITMAP,0,0,LR_LOADFROMFILE); hMemDC[i]=CreateCompatibleDC(hdc); SelectObject(hMemDC[i],hBitmap); } GetObject(hBitmap,sizeof(BITMAP),&bmp); DeleteObject(hBitmap); ReleaseDC(hWnd,hdc); return 0; case WM_TIMER: if( wParam != TIMER_ID ) { break; // 識別IDが一致しないタイマメッセージはDefWindowProc()に任せる } if(++bmp_index >= BMP_SUM) bmp_index=0; for(i = 0; i < BMP_SUM; i++){ InvalidateRect( hWnd, NULL, FALSE ); } return 0; case WM_DESTROY: for(i=0;i<BMP_SUM;i++) DeleteDC(hMemDC[i]); PostQuitMessage(0); return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,hMemDC[bmp_index],0,0,SRCCOPY); EndPaint(hWnd,&ps); return 0; case WM_KEYDOWN: switch((CHAR)wParam) { case VK_ESCAPE: for(i=0;i<BMP_SUM;i++) DeleteDC(hMemDC[i]); PostQuitMessage(0); //WM_QUITメッセージを出す return 0; } } return DefWindowProc(hWnd,uMsg,wParam,lParam); } 入りきらないので2つに分けます。 続きは「WinAPIでの画像高速切り替え表示プログラム2」を見てください。

  • BMPの保存

    プリントスクリーンをして、それをBMP形式で保存しようとしているのですが、保存後のファイルを開いてウィンドウを動かすと、それにつれ逐次、画像が更新されていきます。 この問題の原因がわかる方、助言をお願いします。 プログラムはC++で作成しています。 下にソースを載せています。 宜しくお願いします。 #include<windows.h> LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static BITMAPINFO bmpInfo; static LPDWORD lpPixel; static HBITMAP hBitmap; static HDC hMemDC; HWND desktop; RECT rc; static int width,height; switch(uMsg) { case WM_CREATE: //スクリーンの情報を得る desktop=GetDesktopWindow(); GetWindowRect(desktop,&rc); width=rc.right; height=rc.bottom; //DIBの情報を設定する bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth=width; bmpInfo.bmiHeader.biHeight=height; bmpInfo.bmiHeader.biPlanes=1; bmpInfo.bmiHeader.biBitCount=32; bmpInfo.bmiHeader.biCompression=BI_RGB; //DIBSection作成 hdc=GetDC(hWnd); hBitmap=CreateDIBSection(hdc,&bmpInfo,DIB_RGB_COLORS,(void**)&lpPixel,NULL,0); hMemDC=CreateCompatibleDC(hdc); SelectObject(hMemDC,hBitmap); ReleaseDC(hWnd,hdc); //スクリーンをDIBSectionにコピー hdc=GetDC(desktop); BitBlt(hMemDC,0,0,width,height,hdc,0,0,SRCCOPY); ReleaseDC(desktop,hdc); return 0; case WM_DESTROY: //自らlpPixelを解放するべからず DeleteDC(hMemDC); DeleteObject(hBitmap); //BMPを削除した時、lpPixelも自動的に解放される PostQuitMessage(0); return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); //表画面へ転送 BitBlt(hdc,0,0,width,height,hMemDC,0,0,SRCCOPY); EndPaint(hWnd,&ps); return 0; } SaveBitmap((HWND)hWnd,"PrintScreen.BMP"); return DefWindowProc(hWnd,uMsg,wParam,lParam); } int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow) { WNDCLASS wc; MSG msg; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = __FILE__; if(!RegisterClass(&wc)) return 0; HWND hWnd=CreateWindow( __FILE__,"スクリーンキャプチャ", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL); if(hWnd==NULL) return 0; BOOL bRet; while((bRet=GetMessage(&msg,NULL,0,0))!=0){ if(bRet==-1) break; DispatchMessage(&msg); } return (int)msg.wParam; }

  • 自作関数の使い方

    ウインドウの左上に1を表示させたいのに デスクトップの左上に1が表示される。 ソースを直してください。 #include <windows.h> HWND hWnd; void f(); LRESULT CALLBACK WndProc(HWND ,UINT ,WPARAM ,LPARAM); int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE ,LPSTR , int){  HWND hWnd;  MSG msg;  WNDCLASS wc;  wc.style = CS_HREDRAW | CS_VREDRAW;  wc.lpfnWndProc = WndProc;  wc.cbClsExtra = wc.cbWndExtra = 0;  wc.hInstance = hInstance;  wc.lpszMenuName = NULL;  wc.lpszClassName = "CNAME";  wc.hIcon = LoadIcon(NULL , IDI_APPLICATION);  wc.hCursor = LoadCursor(NULL , IDC_ARROW);  wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);  if (!RegisterClass(&wc))return 0;  hWnd = CreateWindow(wc.lpszClassName , "EXE" ,   WS_OVERLAPPEDWINDOW | WS_VISIBLE ,   CW_USEDEFAULT , CW_USEDEFAULT , 200 , 150,   NULL , NULL , hInstance , NULL);  while(GetMessage(&msg , NULL , 0 , 0)){   TranslateMessage(&msg);   DispatchMessage(&msg);  }  return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd ,UINT msg ,WPARAM wParam ,LPARAM lParam){  HDC hDC;  switch (msg){  case WM_LBUTTONDOWN:   f();  break;  case WM_DESTROY:   PostQuitMessage(0);  break;  default:   return(DefWindowProc(hWnd , msg , wParam , lParam));  }  return (0L); } void f(){  HDC hDC;  hDC = GetDC(hWnd);  TextOut(hDC,0,0,"1",1);  ReleaseDC(hWnd, hDC); }

  • ちらつき防止と波形描写

    開発環境: OS : vista visual stdio c++ 2010 C言語でAPIを使っています。 録音と再生、波形表示のプログラムを作っています。 子ウィンドウを作成して、子ウィンドウにリアルタイムに波形表示を行おうと思っているのですが、上手くいきません。 画面がちらつき、再生も上手くいかなくなってしまいます。 別ウィンドウにリアルタイム波形描写する方法は、どのような方法があるのでしょうか。 現在は下記のような感じになっています。 自分が思いつく方法は、SendMessageを使うことくらいでした。 /////////////////// struct Draw  {      RECT m_recGraph , m_recGraphHalf, m_recGraph_FFT ;      HDC m_hPaint, m_hdcBMP[4];       HBITMAP m_hBMP[4] , m_hOld[4];      PAINTSTRUCT m_hPs;      HPEN m_hPenLine;   }; static LPBYTE SaveData; //録音された音データ //子ウィンドウ LRESULT CALLBACK ChildProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {   static Draw DrawS;     switch( uMsg )      {        case WM_CREATE:          描写領域のハンドルなどの収得          return 0;        case 12345: //番号は適当。とりあえずこれにする。          描写領域の裏描写          InvalidateRect( hwnd, NULL, FALSE );          return 0;        case WM_PAINT:           DrawS.m_hPaint = BeginPaint( proc.m_hWnd, &DrawS.m_hPs );           BitBlt( DrawS.m_hPaint, 150, 48, 600, 256, DrawS.m_hdcBMP[1], 0, 0, SRCCOPY);           BitBlt( DrawS.m_hPaint, 150, 350, 600, 300, DrawS.m_hdcBMP[2], 0, 0, SRCCOPY);           EndPaint(proc.m_hWnd, &DrawS.m_hPs);           return 0;       } return DefWindowProc(hwnd, uMsg, wParam, lParam); } //親ウィンドウ LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {     LPBYTE DrawData; //子ウィンドウに渡すため     switch( uMsg )      {              ・              ・              ・         録音や再生の処理              ・              ・              ・       case MM_WOM_OPEN:        再生のための処理         return 0;       case MM_WOM_DONE: //再生済みバッファがここにやってくる          再生済みバッファに次のデータを入れインキュー          インキューされたデータをDrawDataにもコピー          SendMessage( 子ウィンドウハンドル, 12345. NULL, (LPSTR)DrawData );             //ここで子ウィンドウに必要なデータを送り描写させています。強引にですが・・。          return 0;      } return DefWindowProc(hwnd, uMsg, wParam, lParam); }

  • ビットマップ表示と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); }

  • ソースを見てください。お願いします

    始めまして、Missing0001と申します。 ウィンドウズプログラムをしていて、 他のところは正常に動いているのにMoveWindow関数の場所だけ思うように動きません。 どなたかソースの間違っているところを指摘していただけないでしょうか? したいことはButtonのマウスでの移動です。 BtProc・・・サブクラス(Button)のプロシージャ DrawRect・・・Buttonのサイズの四角形を描いたり消したりするもの LRESULT CALLBACK BtProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { static BOOL Btn_Flag = false; static POINTS end,old_end; char Str[512]; switch(uMsg) { case WM_LBUTTONDOWN: Btn_Flag = true; old_end = MAKEPOINTS(lParam); DrawRect(hWnd,old_end); break; case WM_MOUSEMOVE: if(Btn_Flag) { end = MAKEPOINTS(lParam); DrawRect(hWnd,old_end); DrawRect(hWnd,end); old_end = end; } else { return CallWindowProc(fnBtProc,hWnd,uMsg,wParam,lParam); } break; case WM_LBUTTONUP: if(Btn_Flag) { DrawRect(hWnd,end); MoveWindow(hWnd,end.x,end.y,50,30,true); ←ここがうまくいかない Btn_Flag = false; } else { return CallWindowProc(fnBtProc,hWnd,uMsg,wParam,lParam); } } return CallWindowProc(fnBtProc,hWnd,uMsg,wParam,lParam); }

  • CALLBACK 内の DefWindowProc の場所

    こんにちは、最近 無料版Borland C++Compiler 5.5 を使って WIN32 API の勉強をしています 気にしなければ別に問題ないのですが、どうしても気になって気持ち悪いので、質問させて下さい 参考書や Web でコード例を見ていると、CALLBACK 内の DefWindowProc関数 を switch の default にする例 と switch の default を書かずに CALLBACK の return にする例があります 好みの問題なのでしょうか? switch は、 default を入れた方が正式と思いますが、default に DefWindowProc を記述すると コードが長くなるにつれ DefWindowProc が switch 内でちょこちょこ必要になってきます 私は、switch の default があった方が良いかなと思い DefWindowProc を default に記述していますが、コードが短くなるなら CALLBACK の return に DefWindowProc を記述しようと思っています どちらが良いのでしょうか? 暇な時でかまいませんので、ご教授下さい 宜しくお願い致します ※DefWindowProc の 記述場所を CALLBACK の return にする LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {   switch(uMsg){     case WM_DESTROY:     PostQuitMessage(0);     break;   }   /*基本的なメッセージの処理*/   return DefWindowProc(hWnd, uMsg, wParam, lParam); } ※DefWindowProc の 記述場所を switch の default にする LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {   switch(uMsg){     case WM_DESTROY:     PostQuitMessage(0);     break;   default:     /*基本的なメッセージの処理*/     return DefWindowProc(hWnd, uMsg, wParam, lParam);   }   return 0; }

専門家に質問してみよう