Active Basicで画像描写を連続して行う方法についての質問

このQ&Aのポイント
  • Active Basicでゲームを作っています。最終目標は『東方』のような弾幕避けシューティングです。画像を描写する際にちらつき現象が発生し、解決方法を模索しています。
  • InvalidateRect(hMainWnd, ByVal 0, TRUE)を使って画像描写を連続して行っているが、『プレイヤー』『弾』『敵』を連続して再描写するため、ちらつきが発生している。
  • 『プレイヤー』『弾』『敵』を別々に描写する方法を探しているが、InvalidateRect(hMainWnd, ByVal 0, TRUE)を使うとPaintイベントが呼び出されて一度にまとめて描写されるため、どのように対処すれば良いかわからない。
回答を見る
  • ベストアンサー

Active Basic Paintイベントを通らずに再描写

Active Basicでゲームを作っています。 最終目標は『東方』のような弾幕避けシューティングです。 スレッドを何とか勉強して、ちらつきも抑えようと頑張っています。 このとき、画像を描写する場合には、 InvalidateRect(hMainWnd, ByVal 0, TRUE) を使って最描写を連続して繰り返してきました。 しかし、これを繰り返すと、『プレイヤー』『弾』『敵』を何度も連続して再描写するため、どうしてもちらついてしまいます。 この、『プレイヤー』『弾』『敵』を別々に描写するとちらつき現象はなくなると思うのですが、どうしてもやり方がわかりません。 InvalidateRect(hMainWnd, ByVal 0, TRUE)を使うと、結局Paintイベントが呼び出されるため、Sub MainWnd_Paint(hDC As HDC)の中に『プレイヤー』『弾』『敵』の描写処理を書いて、 プレイヤー描写、弾(約50個)のループ描写、敵のループ描写が一度にまとめて描写されてしまいます。 これらを別々に表示させるにはどうすればいいのでしょうか? すみませんが、出来るだけやさしくご教授ください。 お願いします。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

多分 InvalidateRect だと PAINT メッセージを post するからではないでしょうか. パラメータをどのように設定すればよいのかわかりませんが, 同じ PAINT メッセージを SendMessage で送りつけるとかすればいいような気がします.

関連するQ&A

  • ActiveBasic 再描写処理が読み出されても、描写していた物を削除しない方法

    ActiveBasic4.23.00を使ってプログラムを書いています。 例えば、次のようなコードがあったとします。 'グローバル Dim DragFlag As Long Dim hDC As HDC '此処まで Sub MainWnd_Destroy() ReleaseDC(hMainWnd,hDC) test_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) hDC = GetDC(hMainWnd) End Sub Sub MainWnd_LButtonDown(flags As Long, x As Integer, y As Integer) DragFlag = 1 MoveToEx(hDC,x,y,ByVal NULL) End Sub Sub MainWnd_MouseMove(flags As Long, x As Integer, y As Integer) If DragFlag = 0 Then Exit Sub LineTo(hDC,x,y) End Sub Sub MainWnd_LButtonUp(flags As Long, x As Integer, y As Integer) DragFlag = 0 End Sub (ABWiki様を参考にさせていただきました。) これで、簡単なお絵かきが出来ますが、再描写(例えば、ウインドウの大きさを変えるなど)をするとすべて消えてしまいます。 これを、描いた線を消さずに再描写することは出来ないのでしょうか。 すみませんがご教授ください。

  • Active Basic 再描写処理

    最近デバイスコンテキストを何とか理解してきたので、実験的に『上から物体が振ってくるのを避ける』というゲームを作ってみようと思い作り始めました。 『←』が押されれば、棒人間を左に、『→』が押されれば、棒人間を右に移動させる処理と、ランダムで●が上から落ちてくるという処理をタイマーを使ってやってみました。(スレッドとかはまだ勉強していないので) 一応完成はしたのですが、棒人間を動かすと、どうしても●がちらつきます。 この場合は、どういう風に処理をすればいいのでしょうか? プログラムはこう書きました。 グローバル変数 Dim hBmp01 As HWND Dim hBmp02 As HWND Dim hBmp03 As HWND Dim hBmp04 As HWND Dim hMemDC As HDC Dim BmpInfo As Long Dim hBomDC As HWND Dim Bomxy As RECT Dim x As Long Dim y As Long Dim bx As Long Dim by As Long Dim n As Long '---------------------------------------------------- 省略 '----------------------------------------------------- Sub MainWnd_Destroy() DeleteObject(hBmp01) DeleteObject(hBmp02) DeleteObject(hBmp03) DeleteObject(hBmp04) YokeGame_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) SetWindowText(hMainWnd,"画像描写テスト ~爆弾的なものを避けるゲーム~") hBmp01 = LoadImage(0,".\画像\人\普通.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp02 = LoadImage(0,".\画像\人\右.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp03 = LoadImage(0,".\画像\人\左.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp04 = LoadImage(0,".\画像\爆弾\ボム.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) GetWindowRect(hBmp04,Bomxy) If hBmp01=0 or hBmp02=0 or hBmp03=0 or hBmp04=0 Then MessageBox(hMainWnd,Ex"画像の読み込みに失敗しました\r\n強制終了します。","Error",MB_OK or MB_ICONHAND) DeleteObject(hBmp01) DeleteObject(hBmp02) DeleteObject(hBmp03) DeleteObject(hBmp04) SendMessage(hMainWnd,WM_CLOSE,0,0) End If x=290 y=275 BmpInfo=1 bx = 320 by = 0 SetTimer(hMainWnd,0,300,0) End Sub Sub Kettei() Dim ok As Long by=0 Do Randomize bx = Fix(Rnd()*100) If bx>0 and 630>bx Then ok=TRUE End If Loop Until ok=TRUE End Sub Sub MainWnd_Paint(hDC As HDC) hMemDC = CreateCompatibleDC(hDC) hBomDC = CreateCompatibleDC(hDC) If BmpInfo = 1 Then SelectObject(hMemDC,hBmp01) Else If BmpInfo = 2 Then SelectObject(hMemDC,hBmp02) Else If BmpInfo = 3 Then SelectObject(hMemDC,hBmp03) End If BitBlt(hDC,x,y,40,50,hMemDC,0,0,SRCCOPY) Sleep(30) SelectObject(hMemDC,hBmp01) BitBlt(hDC,x,y,40,50,hMemDC,0,0,SRCCOPY) Sleep(30) SelectObject(hBomDC,hBmp04) BitBlt(hDC,bx,by,9,9,hBomDC,0,0,SRCCOPY) DeleteDC(hMemDC) DeleteDC(hBomDC) BmpInfo = 1 End Sub Sub MainWnd_KeyDown(KeyCode As Long, flags As Long) If KeyCode = 37 Then If x<=0 Then x=0 Exit Sub End If x = x - 10 BmpInfo=3 End If If KeyCode = 39 Then If x>=600 Then x = 600 Exit Sub End If x = x + 10 BmpInfo=2 End If InvalidateRect(hMainWnd,ByVal 0,TRUE) End Sub Sub MainWnd_Timer(TimerID As DWord) If TimerID = 0 Then by = by + 10 InvalidateRect(hMainWnd,Byval 0,TRUE) If by >=360 Then Kettei() End If End If End Sub っと、このようになりました。(一応動きます) strictには、チェックを入れていません。 バージョンは、4.23.00を使っています。 それと、InvalidateRect関数なのですが、 InvalidateRect(hMainWnd,Byval 0,TRUE) の、二つ目のパラメータ(?)部分に、全体を再描写させるときに何故『Byval 0』と表記するのでしょうか? ヘルプには、NULL を指定すると、クライアント領域全体が更新領域に設定されますと書かれていますが、NULLを指定すると無効な識別となります。 すみませんが、分かる方がいらっしゃいましたら、ご教授をお願いします。

  • [Active Basic]BitBltで画像を表示

    ActiveBasicでプログラムを書いています。 少しずつデバイスコンテキストが使えるようになってきて、簡単なブロック崩しを作ってみようと思い、作り始めました。 以前、デバイスコンテキストを使えるようになろうと、上から物体が降ってきて、それを避けるというゲームを書いてみたのですが、画像(ビットマップ)の表示方法が分からず、すべて MainWnd_Paint(hDC As HDC) に中に書きました。 すると、処理ごとにいらないものまで描写されるので画面がかなりちらついてしまいました。 ActiveBasicのヘルプ(http://www.activebasic.com/help_center/articles/win32/step16/index.html)を参考にして、プログラムを書いてみたのですが、背景が描写されません。 コードを下に書きますので、すみませんが添削の方をお願いします。 まだ、プログラムを始めたばかりのほやほやですので、なるべくやさしくお願いします。 '------------グローバル------------ Dim ImgBack As HBITMAP '背景画像 Dim hBackDC As HDC '背景画像用デバイスコンテキスト Dim hMemDC As HDC 'BitBlt用のデバイスコンテキスト '------------グローバル------------ Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) Dim hDC As HDC 'イメージを読み込んでいく ImgBack = LoadImage(0,".\pic\back.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) 'デバイスコンテキストをそれぞれ作成 hDC = GetDC(hMainWnd) hBackDC = CreateCompatibleDC(hDC)'背景用DC hMemDC = CreateCompatibleDC(hDC)'BitBlt用DC '背景を描写 SelectObject(hBackDC,ImgBack) BitBlt(hMemDC,0,0,640,480,hBackDC,0,0,SRCCOPY) '最後にhDCだけ開放 ReleaseDC(hMainWnd,hDC) End Sub Sub MainWnd_Paint(hDC As HDC) End Sub 後、BitBltを MainWnd_Paint(hDC As HDC) の中に表記すると、画像が表示されます。 何故か、いまいち分かっていません・・・ すみませんが、ご教授ください。

  • Active Basic 画像表示 添削願い

    AB4.23.00を使っています。 複数画像を表示しようと頑張っているのですが、どうやっても出来ません。 すみませんが、コードの添削の方をお願いします。 '----------------------------------------------------------------------------- ' イベント プロシージャ '----------------------------------------------------------------------------- ' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。 ' ウィンドウ ハンドル: hMainWnd ' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。 /*全体*/ Dim hMemDC As HDC /*背景*/ Dim hBackDC As HDC Dim hBackBmp As HBITMAP /*自機*/ Dim hMyDC As HDC Dim hMyBmp As HBITMAP /*プログラムの設定など*/ Dim Dir As String '----------------------------------------------------------------------------- ' ウィンドウメッセージを処理するためのコールバック関数 Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord ' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。 ' イベントプロシージャの呼び出しを行います。 MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam) End Function '----------------------------------------------------------------------------- ' ここから下は、イベントプロシージャを記述するための領域になります。 Sub MainWnd_Destroy() stg_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) Dim hDC As HDC Dim OldBmp As HBITMAP SetWindowText(hMainWnd,"しゅーてぃんぐ") 'ディレクトリ取得 Dim path[MAX_PATH+1] As Byte GetCurrentDirectory(MAX_PATH,path) Dir=path 'MainWndのDC取得 hDC=GetDC(hMainWnd) '全体DCメモリ作成 hMemDC=CreateCompatibleDC(hDC) '背景 hBackBmp=LoadImage(0,back.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE) hBackDC=CreateCompatibleDC(hDC) 'キャラクター hMyBmp=LoadImage(0,A.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE) hMyDC=CreateCompatibleDC(hBackDC) '描写 SelectObject(hMemDC,hBackBmp) BitBlt(hMemDC,0,0,640,480,hBackDC,0,0,SRCCOPY) SelectObject(hMemDC,hMyBmp) BitBlt(hMemDC,0,0,40,50,hMyDC,0,0,SRCCOPY) ReleaseDC(hMainWnd,hDC) End Sub Sub MainWnd_Paint(hDC As HDC) BitBlt(hDC,0,0,640,480,hMemDC,0,0,SRCCOPY) End Sub back.bmpの上にA.bmpを描写したいです。 透過処理などはいらないので、どうすれば表示することが出来るかを教えてください。 今は、どちらか片一方しか表示されません。 また、 http://www.geocities.jp/debu0510/basic/main17.html を参考にさせていただいたのですが、CreateCompatibleBitmap関数の使い方が分かりません。 これは、どのようにして使用するのでしょうか。 こちらもご教授お願いします。

  • Active Basic 画像の透過処理

    AB4.23.00を使っています。 簡単なゲームを作ろうと思って作成を進めているのですが、 画像を透過する処理でつまずいてしまいました。 Sub ShowPictures() /*ピクチャを描写する*/ Dim n As Long Dim hDC As HDC Dim hMyMaskDC As HDC '自機マスク用 Dim hMyMaskBmp As HBITMAP '自機マスク用 Dim hMyTempDC As DWord Dim hMyTempBmp As DWord hDC=GetDC(hMainWnd) '背景 BitBlt(hMemDC,0,0,640,480,hBackDC,0,0,SRCCOPY) '敵画像 For n=0 to 100 Step 1 BitBlt(hMemDC,ex[n],ey[n],30,30,hEneDC[n],0,0,SRCCOPY) Next '自機描写 hMyMaskDC=CreateCompatibleDC(hDC) hMyMaskBmp=CreateBitmap(40,50,1,1,0) SelectObject(hMyMaskDC,hMyMaskBmp) BitBlt(hMyMaskDC,0,0,x,y,hMyDC,0,0,SRCCOPY) hMyTempDC=CreateCompatibleDC(hDC) hMyTempBmp=CreateCompatibleBitmap(hDC,40,50) SelectObject(hMyTempDC,hMyTempBmp) BitBlt(hMyTempDC,0,0,x,y,hMyMaskDC,0,0,NOTSRCCOPY) 'BitBlt(hMyTempDC,0,0,x,y,hMyDC,x,y,SRCAND) 'キャラクタ画像をOR転送 BitBlt(hMemDC,0,0,x,y,hMyTempDC,0,0,SRCPAINT) 'マスク画像をAND転送 BitBlt(hMemDC,0,0,x,y,hMyMaskDC,0,0,SRCAND) 'マスク用画像をメモリから解放 DeleteDC(hMyMaskDC) DeleteObject(hMyMaskBmp) 'キャラクタの一時画像をメモリから解放 DeleteDC(hMyTempDC) DeleteObject(hMyTempBmp) InvalidateRect(hMainWnd,ByVal 0,FALSE) DeleteObject(hMyMaskBmp) DeleteDC(hMyMaskDC) End Sub 描写処理のルーチンです。 これを実行すると、黒い塊になってしまいます。 どのように書けば、ちゃんと表示できるようになるのでしょうか。 すみませんが、ご教授をお願いします。

  • ActiveBasic 複数の画像表示をしたい

    ActiveBasic4.23.00を使っています。 簡単なゲームを作りたいのですが、なかなか画像の描写が出来ません。 すみませんが、以下のコードの添削をしていただけないでしょうか。 出来れば、詳しいやり方がほしいです。 (まだ、途中なので、DCの開放などはかいていない部分があります) 'デバイスコンテキスト Dim hMemDC As HDC Dim hBackDC As HDC Dim hMyDC As HDC 'ビットマップ Dim hBackBmp As HANDLE Dim hMyBmp As HANDLE Dim hMemBmp As HANDLE 'ハンドル Dim hBackHand As HANDLE Dim hMyHand As HANDLE 'プログラムの変数 Dim WhereDir As String '----------------------------------------------------------------------------- ' ウィンドウメッセージを処理するためのコールバック関数 Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord ' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。 ' イベントプロシージャの呼び出しを行います。 MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam) End Function '----------------------------------------------------------------------------- ' ここから下は、イベントプロシージャを記述するための領域になります。 Sub MainWnd_Destroy() DeleteDC(hMemDC) DeleteDC(hMyDC) Game_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) /* 作成時 */ '自分自身のファイルパスを取得 Dim dir[MAX_PATH+1] As Byte GetCurrentDirectory(MAX_PATH,dir) WhereDir=dir 'メモリデバイスコンテキストを準備 Dim img As HDC img=GetDC(hMainWnd) hMemDC=CreateCompatibleDC(img) hBackDC=CreateCompatibleDC(img) hMyDC=CreateCompatibleDC(img) '画像をよみこむ hBackBmp=LoadImage(0,WhereDir+"\背景.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE) hMyBmp=LoadImage(0,WhereDir+"\人.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE) '画像処理 hMemBmp=CreateCompatibleBitmap(img,640,480) hBackHand=CreateCompatibleBitmap(img,640,480) hMyHand=CreateCompatibleBitmap(img,40,50) SelectObject(hBackDC,hBackBmp) BitBlt(hMemDC,0,0,40,50,hBackDC,0,0,SRCCOPY) SelectObject(hMyDC,hMyBmp) BitBlt(hMemDC,0,0,40,50,hMyDC,0,0,SRCCOPY) SelectObject(hMemDC,hMemBmp) ReleaseDC(hMainWnd,img) End Sub Sub MainWnd_Paint(hDC As HDC) BitBlt(hDC,0,0,640,480,hMemDC,0,0,SRCCOPY) End Sub わかりにくいとは思いますが、お願いします。

  • 画像を切り替えるプログラムで悩んでいます。

    C言語で、ビットマップを『2枚』表示した後、メニューの選択により、どちらかの画像だけを表示したいのです、色々試して見たのですが、うまく行きません。ヒント、アドバイスをお願いします。 本当は『2枚』だけでなく、スキャンして、保存した画像を全て表示したいのですが、まだその方法が出来ません。 1、グローバルな変数として、   HDC hdc_mem1, hdc_mem2;//2種類のメモリデバイスコンテキストハ  ンドルを格納  int show_no = 1;//画像選択のための変数1で初期化 2、/*ウィンドウプロシージャ*/ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc; static DWORD dwRop;   PAINTSTRUCT ps; HBITMAP hBmp; HDC hdc_memx; switch(msg){ case WM_CREATE: hdc = GetDC(hWnd); hdc_mem1, hdc_mem2; dwRop = SRCCOPY; hBmp = LoadBitmap(hInst, "MYBMP1"); if(hBmp == NULL){ MessageBox(hWnd, "画像1のロードに失敗しました", "エラー", MB_OK | MB_ICONWARNING); return 0; } hdc_mem1 = CreateCompatibleDC(hdc); SelectObject(hdc_mem1, 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); ReleaseDC(hWnd, hdc); break; case WM_PAINT: BeginPaint(hWnd, &ps); hdc_memx = hdc_mem1, hdc_mem2; if(show_no == 1) hdc_memx = hdc_mem1; //変化なし hdc_memx != hdc_mem2;//変化なし if(show_no == 2) hdc_memx = hdc_mem2; /変化なし  hdc_memx != hdc_mem1;/変化なし BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top, hdc_mem1, ps.rcPaint.left, ps.rcPaint.top, dwRop); BitBlt(ps.hdc, 400,200, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top, hdc_mem2, ps.rcPaint.left, ps.rcPaint.top, dwRop); EndPaint(hWnd, &ps); break; case WM_COMMAND: switch (LOWORD(wp)){ case IDM_PICT1: show_no = 1; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_PICT2: show_no = 2; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_SRCCOPY: dwRop = SRCCOPY; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_NOTSRCCOPY: dwRop = NOTSRCCOPY; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_SRCAND: dwRop = SRCAND; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_SRCPAINT: dwRop = SRCPAINT; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0); break; } break; case WM_DESTROY: DeleteObject(hBmp); DeleteObject(hBmp); DeleteDC(hdc_mem1); DeleteDC(hdc_mem2); PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } 3、if文のところを色々と変えたのですが、うまく切り替わってくれません。   if(show_no == 1) hdc_memx = hdc_mem1; hdc_memx != hdc_mem2; if(show_no == 2) hdc_memx = hdc_mem2;  hdc_memx != hdc_mem1;

  • ボタンが押されたときの反応 Basic

    Active Basicでゲームプログラムを書いています。 ボタンを押したときの反応で、上下左右に画像を動かしたいのですが、 ボタンを押すと、いったん静止してから、連打処理(?)のように動きます。 やりたいことは、ボタンを押すとすぐに上下左右に一定間隔で画像を動かすことです。 Sub MainWnd_KeyDown(KeyCode As Long, flags As Long) If KeyCode=37 Then If x<=3 Then Exit Sub End If MyBmpInfo=2 x=x-5 Else If KeyCode=38 Then If y<=0 Then Exit Sub End If MyBmpInfo=1 y=y-5 Else If KeyCode=39 Then If x>=600 Then Exit Sub End If MyBmpInfo=3 x=x+5 Else If KeyCode=40 Then If y>=400 Then Exit Sub End If y=y+5 End If InvalidateRect(hMainWnd,ByVal 0,TRUE) End Sub と書きました。 すみませんが、どなたかご存知の方がいらっしゃいましたら、ご教授ください。 お願いします。

  • 東方紅魔郷 背景しか出てこない

    今、「東方紅魔郷」をインストールできて(?)、ファイルが開けたのですが、スタート画面で、「スタート」や「オプション」などの文字が出てきません。 背景の画像は出てきます。 「z」キーを押すと音が出たり、BGMが変わったりするのでゲームはスタートできるようです。 こちらもスコアや、プレイヤーや、敵や、弾が出てきません。表示されるのは背景だけです。 どうすればプレイできるでしょうか? 何か対策があったら教えてください。

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

    開発環境: 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); }

専門家に質問してみよう