#1
by keito » 6年前
こんにちは、またまたWin32APIに関する質問です。
ダブルバッファリングを実装しましたが他のサイトを参考にしても思うように描画が上手くいかなくなります。
今回のプログラムは練習としてマウスカーソルの位置に合わせて文字を表示・移動させるプログラムを作っていますが
実際にマウスを動かしたりウィンドウを最大化すると画像のように前に描画したものが残ってしまいます…
とりあえず今回やりたいことは以下の通りです
(1)前に描画したものがマウスの移動の後に残らないようにする
(2)ウィンドウサイズは変更可能にする。ドラッグや最大化してもダブルバッファリングの処理が上手くいくようにする
コード:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hBitmap; // ビットマップ
static HDC hMemDC; // オフスクリーン
static RECT cRect; //クライアント領域の四隅の座標
static HDC hDC;
static int xpos, ypos;
static LPCTSTR str = _T("あのイーハトーヴォのすきとおった風");
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_CREATE:
//DCコンパチブルの作成
hDC = GetDC(hWnd);
hMemDC = CreateCompatibleDC(hDC);
GetClientRect(hWnd, &cRect);
hBitmap = CreateCompatibleBitmap(hDC, cRect.right - cRect.left, cRect.bottom - cRect.top);
SelectObject(hMemDC, hBitmap);
ReleaseDC(hWnd, hDC);
break;
case WM_MDIMAXIMIZE:
hDC = GetDC(hWnd);
hMemDC = CreateCompatibleDC(hDC);
GetClientRect(hWnd, &cRect);
hBitmap = CreateCompatibleBitmap(hDC, cRect.right - cRect.left, cRect.bottom - cRect.top);
SelectObject(hMemDC, hBitmap);
ReleaseDC(hWnd, hDC);
break;
case WM_MOUSEMOVE:
xpos = LOWORD(lParam);
ypos = HIWORD(lParam);
InvalidateRect(hWnd, NULL, TRUE);
case WM_PAINT:
PAINTSTRUCT ps;
// DCコンパチブルの描画
hMemDC = BeginPaint(hWnd, &ps);
//何かしらの描画
TextOut(hMemDC, xpos, ypos, str, _tcslen(str));
BitBlt(hDC, 0, 0, cRect.right - cRect.left, cRect.bottom - cRect.top, hMemDC, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
break;
case WM_ERASEBKGND:
return TRUE;
case WM_CLOSE:
// DCコンパチブルの破棄
DeleteDC(hMemDC);
DeleteObject(hBitmap);
DestroyWindow(hWnd);
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
(もしよかったら「ここのコード要らないよ」とか「ここ〇〇に書き換えるといいよ」とかあったらそれも教えてもらえるとありがたいです)
どうかよろしくお願いします……!!
なお今の所の私の能力は
C/C++:入門書程度ならさっと理解できる
Win32API:今頑張ってるところ!
です(´・ω・`)
こんにちは、またまたWin32APIに関する質問です。
ダブルバッファリングを実装しましたが他のサイトを参考にしても思うように描画が上手くいかなくなります。
今回のプログラムは練習としてマウスカーソルの位置に合わせて文字を表示・移動させるプログラムを作っていますが
実際にマウスを動かしたりウィンドウを最大化すると画像のように前に描画したものが残ってしまいます…
[img]http://dixq.net/forum/gallery/image.php?album_id=151&image_id=1033&view=no_count[/img]
とりあえず今回やりたいことは以下の通りです
(1)前に描画したものがマウスの移動の後に残らないようにする
(2)ウィンドウサイズは変更可能にする。ドラッグや最大化してもダブルバッファリングの処理が上手くいくようにする
[code]LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hBitmap; // ビットマップ
static HDC hMemDC; // オフスクリーン
static RECT cRect; //クライアント領域の四隅の座標
static HDC hDC;
static int xpos, ypos;
static LPCTSTR str = _T("あのイーハトーヴォのすきとおった風");
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_CREATE:
//DCコンパチブルの作成
hDC = GetDC(hWnd);
hMemDC = CreateCompatibleDC(hDC);
GetClientRect(hWnd, &cRect);
hBitmap = CreateCompatibleBitmap(hDC, cRect.right - cRect.left, cRect.bottom - cRect.top);
SelectObject(hMemDC, hBitmap);
ReleaseDC(hWnd, hDC);
break;
case WM_MDIMAXIMIZE:
hDC = GetDC(hWnd);
hMemDC = CreateCompatibleDC(hDC);
GetClientRect(hWnd, &cRect);
hBitmap = CreateCompatibleBitmap(hDC, cRect.right - cRect.left, cRect.bottom - cRect.top);
SelectObject(hMemDC, hBitmap);
ReleaseDC(hWnd, hDC);
break;
case WM_MOUSEMOVE:
xpos = LOWORD(lParam);
ypos = HIWORD(lParam);
InvalidateRect(hWnd, NULL, TRUE);
case WM_PAINT:
PAINTSTRUCT ps;
// DCコンパチブルの描画
hMemDC = BeginPaint(hWnd, &ps);
//何かしらの描画
TextOut(hMemDC, xpos, ypos, str, _tcslen(str));
BitBlt(hDC, 0, 0, cRect.right - cRect.left, cRect.bottom - cRect.top, hMemDC, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
break;
case WM_ERASEBKGND:
return TRUE;
case WM_CLOSE:
// DCコンパチブルの破棄
DeleteDC(hMemDC);
DeleteObject(hBitmap);
DestroyWindow(hWnd);
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}[/code]
(もしよかったら「ここのコード要らないよ」とか「ここ〇〇に書き換えるといいよ」とかあったらそれも教えてもらえるとありがたいです)
どうかよろしくお願いします……!!
なお今の所の私の能力は
C/C++:入門書程度ならさっと理解できる
Win32API:今頑張ってるところ!
です(´・ω・`)