画面のちらつきを無くしたい

[戻る]
高橋 [E-Mail] 2003/11/14(金) 22:24:18
void CSecandView::OnDraw(CDC* pDC)
{
    CSecandDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    CDC dc;
    CDC* pDrawDC = pDC;
    CBitmap bitmap;
    CBitmap* pOldBitmap;

    CRect client;
    pDC->GetClipBox(client);
    CRect rect = client;
    DocToClient(rect);

    if (!pDC->IsPrinting())
    {
        if (dc.CreateCompatibleDC(pDC))
        {
            if (bitmap.CreateCompatibleBitmap(pDC, rect.Width
(), rect.Height()))
            {
                OnPrepareDC(&dc, NULL);
                pDrawDC = &dc;

                dc.OffsetViewportOrg(-rect.left, -
rect.top);
                pOldBitmap = dc.SelectObject(&bitmap);
                dc.SetBrushOrg(rect.left % 8, rect.top % 
8);

                dc.IntersectClipRect(client);
            }
        }
    }

    CBrush brush;
    if (!brush.CreateSolidBrush(RGB(100,120,120)))
        return;

    brush.UnrealizeObject();    
    pDrawDC->FillRect(client, &brush);
    pDrawDC->SetMapMode(MM_ISOTROPIC);

    if (pDrawDC != pDC)
    {
        pDC->SetViewportOrg(0, 0);
        pDC->SetWindowOrg(0,0);
        pDC->SetMapMode(MM_TEXT);
        dc.SetViewportOrg(0,0);
        dc.SetWindowOrg(0,0);
        dc.SetMapMode(MM_TEXT);

        pDC->BitBlt(-rect.left, -rect.top, rect.Width(), rect.Height
(),
            &dc, 0, 0, SRCCOPY);
        dc.SelectObject(pOldBitmap);
    }

}このように記述したのですが、ちらつきが、直りません宜しく御願いします。

武田 2003/11/15(土) 00:34:36
プログラミングの初心者です。たぶん高橋さんよりも技量が劣っていると思います。間違ってい
ると思ったら、読み飛ばしてください。

まず、CBitmap bitmap; をグローバル領域で、宣言してください。
そして、もう一つ宣言してください。(bitmapBGとか)
CBitmap* pOldBitmap; は、いりません。

コンストラクタに、
CClientDC dc(0);
bitmap.CreateCompatibleBitmap(&dc,/*描画する横幅(BG)*/,/*描画する縦幅(BG)*/);
と書いてください。

CDC dc; に、もう一つ宣言を追加してください。(dcBGとか)
dc.CreateCompatibleDC(pDC); の次に dcBG.CreateCompatibleDC(pDC);と書いてくださ
い。 

dc.SelectObject(&bitmap); の次に、
dcBG.SelectObject(&bitmapBG); と、書いてください。

そして、dcBG.BitBlt(/*描画する左端の座標(BG)*/,/*描画する上端の座標(BG)*/,/*描画す
る横幅(BG)*/,/*描画する縦幅(BG)*/,&dc,/*描画する物の横幅*/,/*描画する物の縦幅
*/,SRCCOPY)
と、書いてください。

その後、
pDC->BitBlt(/*描画する左端の座標*/,/*描画する上端の座標*/,/*描画する横幅*/,/*描画す
る縦幅*/,&dcBG,/*描画する物の横幅(BG)*/,/*描画する物の縦幅(BG)*/,SRCCOPY);

最後に、dc.DeleteDC(); dcBG.DeleteDCと、書いてください。

そうすれば、できるかもしれません。ちなみに、/*・・・*/と書かれているところは、CRectで
宣言したものを、書かないでください。
 

dairygoods 2003/11/15(土) 09:34:03
OnEraseBkgnd()で何もしないようにしていますか?

武田 2003/11/17(月) 00:52:33
dairygoodsさん、OnEraseBkgnd()は、このソースだと、どの部分に書けばよいことになるので
すか?

ハリィ 2003/11/17(月) 09:50:48
> OnEraseBkgnd()は、このソースだと、どの部分に書けばよいことになるのですか?
ClassWizard などで WM_ERASEBKGND のハンドラを作成するんじゃないかと。

高橋 [E-Mail] 2003/11/17(月) 17:33:35
[[解決]]
以下のホームページに詳細のコーディングが書いてありました。
情報を頂いた皆さん有り難うございました。
http://www.geocities.jp/chiakifujimon/makesoft2/proc3.html

古いスレッドには追加発言できません。