おはようございます。
MFCで作成したデフォルトのMDIにテキストを表示させていますが、
このテキストがサイズ変更時に、かすかにちらつきます。
色々試したのですが、今1つです。
どなたか、ちらつかせない方法を教えて貰えませんか?
試した内容ですが、
OnSize内で、ValidateRectを使用して、画面を更新しない処理を追加。 →変わらず
OnPaintをオーバーライドして、CPaintDC dc(this)の更新領域を見たらクライアント領
域全体になってました。どうも、背景を全て消去してるので、更新領域がクライアント
領域全体になるようです。
で、OnEraseBkgndで背景消去しないようにし、OnDraw内で背景を書き込む。→変わらず
結局、更新領域はクライアント領域全体になっているままで、OnDraw内で背景描画とテ
キスト描画が繰り返されて、画面がちらつくようです。
次に、OnPaint内で、CDCのExcludeClipRectを使用して、更新領域を明示的に除外する事
で、やっと再描画されないようになりました。
が、OnSize内で無更新領域を計算していたので、ウィンドウの右or下へのサイズ変更が
検知できず、怪しい事に・・・
ウィンドウの上・左からサイズ変更された時に、画面の絶対座標から更新領域を計算し
てたのですが、根本的に対処方法がおかしいのかなと思い質問させて貰いました。
宜しくお願いします。
#ちらついた方が、サイズ変更されたことがわかりやすい気もするけど
CreateCompatibleBitmap()とか使って
バックグラウンド描画じゃダメ?
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);
}
おわ、すみません。途中で送信しちゃいました。
ついでなんで、私の作った奴も書きますね。
メンバ変数
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直呼びはご愛嬌という事で(^^;
メモリDC上にビットマップを作成している部分が無いみたいですけれど、
ビットマップが無い状態ではBitBltは利くないと思います。
確認されて見てはどうでしょう。
がーん。誤字
誤)
> ビットマップが無い状態ではBitBltは利くないと思います。
正)
ビットマップが無い状態ではBitBltは利かないと思います。