DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Win32でダブルバッファリング

環境/言語:[C++]
分類:[.NET]

環境:VS2005 XP-HOME

Win32でダブルバッファリングをしようと思っているのですが、うまくいきません。

switch(msg)
{
    case WM_CREATE:
        // 準備
        hdc = BeginPaint(_hWnd, &ps);

        // バッファの用意
        hMemDC  = CreateCompatibleDC(hdc);
        hBitmap = CreateCompatibleBitmap(hdc, 640, 480);
        SelectObject(hMemDC, hBitmap);

        // 終了
        EndPaint(_hWnd, &ps);
        break;
    case WM_PAINT:  hdc = BeginPaint(_hWnd, &ps);

        // 準備
        hdc = BeginPaint(_hWnd, &ps);
        
        // 描画
        TextOut(hMemDC, 0, 0, "あ, lstrlen("あ"));
        BitBlt(hdc, 0, 0, 640, 480, hMemDC, 0, 0, SRCCOPY);

        // 終了
        EndPaint(_hWnd, &ps);
        break;
}

現在このようなソースになっているのですが、何か間違っているのでしょうか?
ご教授よろしくお願いします。

※描画関係の部分だけのせました
軽く見た段階でいくつか間違い、またはそれらしきものがあります。

・BeginPaint/EndPaintはWM_PAINTの応答に対してのみ利用できます。WM_CREATEのタイミングでは使用できません。
・WM_PAINTの時はBeginPaintを2回していませんか?
・このコードはコンパイル通らないのではないですか?

ところで、なぜダブルバッファリングをお考えなのですか?
何かちらついて見えたりするということですか?
レスありがとうございます。

ダブルバッファリングをする理由は、勉強のためです。
あと、コンパイルは通ります。

switch(msg)
{
case WM_CREATE:
// 準備

// バッファの用意
hMemDC = CreateCompatibleDC(hdc);
hBitmap = CreateCompatibleBitmap(hdc, 640, 480);
SelectObject(hMemDC, hBitmap);

break;
case WM_PAINT: hdc = BeginPaint(_hWnd, &ps);

// 準備
hdc = BeginPaint(_hWnd, &ps);

// 描画
TextOut(hMemDC, 0, 0, "あ, lstrlen("あ"));
BitBlt(hdc, 0, 0, 640, 480, hMemDC, 0, 0, SRCCOPY);

// 終了
EndPaint(_hWnd, &ps);
break;
}

WM_CREATEの中のBeginとEndを取り除いたのですが、これでもまだ動きませんでした。
> ダブルバッファリングをする理由は、勉強のためです。
こんにちは
VC++6のソースを.net2003C++ に変換して動いているSoftがありますので
もしか?と思いまして

CDC MemDC;
CDC* pMemDC;
CBitmap MemBitmap;
CxxxCamView* pView;
bool pViewflg;

if(LoopTh_ON==FALSE){ //初期で1回実行
// pView pointer を確定する。
pView=(this);
// for BitBlt smooze repaint.
CClientDC dc(this);
MemDC.CreateCompatibleDC(&dc);
pMemDC= &MemDC;
MemBitmap.CreateCompatibleBitmap(&dc,1280,1024);
MemDC.SelectObject(&MemBitmap);
......

void redisp()
{
ELM *ep;
/* vi_1-vi2の範囲 +4 のみを消去 */
CDC* pDC=pMemDC;
CBrush myBrush;
CBrush* pOldBrush;
myBrush.CreateSolidBrush(s_color[0]);
pOldBrush=pDC->SelectObject(&myBrush);
//area Clear
pDC->PatBlt(vi_x1-4,vi_y1-4,vi_x2-vi_x1+9,vi_y2-vi_y1+9,PATCOPY);
pDC->SelectObject(pOldBrush);
myBrush.DeleteObject();
pViewflg=FALSE;
..
pDC->SetTextColor(s_color[7]);
pDC->SetBkColor(s_color[bc]);

pDC->TextOut(x,y,ps,len); // lineなども描画して//
..
CDC* pVDC=pView->GetDC();
pVDC->BitBlt(vi_x1-4,vi_y1-4,vi_x2-vi_x1+9,vi_y2-vi_y1+9
,pMemDC,vi_x1-4,vi_y1-4,SRCCOPY);

pView->ReleaseDC(pVDC); // Releaseしないと、SYSTEM MEMORYが増える。
pViewflg=TRUE;

使い方とかが、もしかして参考になればいいですが・・・古過ぎてダメ?ですか・・
>あと、コンパイルは通ります。
> TextOut(hMemDC, 0, 0, "あ, lstrlen("あ"));
ここは明らかにコンパイルエラーになります。
(文字列リテラルが閉じていない)

> // バッファの用意
> hMemDC = CreateCompatibleDC(hdc);
この時点のhdcって何ですか?
NULLならデスクトップのHDCと同等です。

> case WM_PAINT: hdc = BeginPaint(_hWnd, &ps);
> // 準備
> hdc = BeginPaint(_hWnd, &ps);
ここはBeginPaintが重複してます。
それとも単純にここに転記したものが間違っているだけでしょうか?

DOBON.NET | プログラミング道 | プログラミング掲示板