Viewのサイズ変更時のちらつきについて

[戻る]
あきら 2006/06/10(土) 08:15:06
おはようございます。

MFCで作成したデフォルトのMDIにテキストを表示させていますが、
このテキストがサイズ変更時に、かすかにちらつきます。
色々試したのですが、今1つです。
どなたか、ちらつかせない方法を教えて貰えませんか?

試した内容ですが、
OnSize内で、ValidateRectを使用して、画面を更新しない処理を追加。 →変わらず
OnPaintをオーバーライドして、CPaintDC dc(this)の更新領域を見たらクライアント領
域全体になってました。どうも、背景を全て消去してるので、更新領域がクライアント
領域全体になるようです。

で、OnEraseBkgndで背景消去しないようにし、OnDraw内で背景を書き込む。→変わらず
結局、更新領域はクライアント領域全体になっているままで、OnDraw内で背景描画とテ
キスト描画が繰り返されて、画面がちらつくようです。

次に、OnPaint内で、CDCのExcludeClipRectを使用して、更新領域を明示的に除外する事
で、やっと再描画されないようになりました。
が、OnSize内で無更新領域を計算していたので、ウィンドウの右or下へのサイズ変更が
検知できず、怪しい事に・・・

ウィンドウの上・左からサイズ変更された時に、画面の絶対座標から更新領域を計算し
てたのですが、根本的に対処方法がおかしいのかなと思い質問させて貰いました。

宜しくお願いします。

K 2006/06/10(土) 16:01:54
#ちらついた方が、サイズ変更されたことがわかりやすい気もするけど

CreateCompatibleBitmap()とか使って
バックグラウンド描画じゃダメ?

あきら 2006/06/10(土) 16:31:12
Kさん、レスありがとうございます。

一応、試してみたのですが、何故か何も表示されませんでした。
これって、bitmapしか使えないんですかね?

↓ソースの要約です。

void XXX::OnDraw(CDC* pDC)
{
    CDC mdc;
    mdc.CreateCompatibleDC(pDC);
mdc.PatBlt(0,0,500, 500, BLACKNESS );

    mdc.TextOut(10,10,"あいうえお かきくけこ");
    pDC->BitBlt(0,0,100,100,&m_mdc,0,0,SRCCOPY);
}

あきら 2006/06/10(土) 16:53:44
おわ、すみません。途中で送信しちゃいました。
ついでなんで、私の作った奴も書きますね。

メンバ変数
CRect m_rcWin;
CRect m_rcClient;
int m_siz_flg; 


void XXX::OnSize(UINT nType, int cx, int cy)
{
    CRect rcWin;
    GetWindowRect(rcWin);
    if( m_rcWin.top == rcWin.top  && m_rcWin.left == rcWin.left)
    {
        CRect rcClient;
        GetClientRect(rcClient);
        if( m_rcClient.right < rcClient.right )
        {
            m_rcNo.left  = 0;
            m_rcNo.right = m_rcClient.right;
        }
        else if( m_rcClient.right > rcClient.right )
        {
            m_rcNo.left  = 0;
            m_rcNo.right = rcClient.right;
        }
        if( m_rcClient.bottom < rcClient.bottom )
        {
            m_rcNo.top  = 0;
            m_rcNo.bottom = m_rcClient.bottom;
        }
        else if( m_rcClient.bottom > rcClient.bottom )
        {
            m_rcNo.top  = 0;
            m_rcNo.bottom = rcClient.bottom;
        }
        m_siz_flg = 1;
        m_rcClient = rcClient;
        ValidateRect(m_rcNo);
    }
    m_rcWin = rcWin;
    CView::OnSize(nType, cx, cy);
}
拡大・縮小時に、無効領域をメンバ変数に保持します。
ValidateRectはあんまり意味がありませんでした。

BOOL XXX::OnEraseBkgnd(CDC *pDC)
{
    return TRUE;
}
背景は代わりに、自分で描画する必要があります。

void XXX::OnPaint()
{
    CPaintDC dc(this); // device context for painting
    if( m_siz_flg == 1)
    {
        dc.ExcludeClipRect(this->m_rcNo);
        m_siz_flg = 0;
    }
    this->OnDraw(&dc);
}
ここで、サイズ変更時に描画が不要な領域を、更新領域から除外しています。

---
ウインドウの位置やサイズを、子ウィンドウ側で保持しないといけないのが、どうにも
腑に落ちません。
最後のOnDraw直呼びはご愛嬌という事で(^^;

PATIO 2006/06/12(月) 09:54:18
メモリDC上にビットマップを作成している部分が無いみたいですけれど、
ビットマップが無い状態ではBitBltは利くないと思います。
確認されて見てはどうでしょう。

PATIO 2006/06/12(月) 10:00:24
がーん。誤字

誤)
> ビットマップが無い状態ではBitBltは利くないと思います。

正)
ビットマップが無い状態ではBitBltは利かないと思います。

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