Viewのサイズ変更時のちらつきについて – プログラミング – Home

Viewのサイズ変更時のちらつきについ...
 
通知
すべてクリア

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


あきら
 あきら
(@あきら)
ゲスト
結合: 23年前
投稿: 49
Topic starter  

おはようございます。

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

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

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

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

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

宜しくお願いします。


引用解決済
トピックタグ
K
 K
(@K)
ゲスト
結合: 23年前
投稿: 98
 

#ちらついた方が、サイズ変更されたことがわかりやすい気もするけど

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


返信引用
あきら
 あきら
(@あきら)
ゲスト
結合: 23年前
投稿: 49
Topic starter  

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);
}


返信引用
あきら
 あきら
(@あきら)
ゲスト
結合: 23年前
投稿: 49
Topic starter  

おわ、すみません。途中で送信しちゃいました。
ついでなんで、私の作った奴も書きますね。

メンバ変数
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
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

メモリDC上にビットマップを作成している部分が無いみたいですけれど、
ビットマップが無い状態ではBitBltは利くないと思います。
確認されて見てはどうでしょう。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

がーん。誤字

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました