馬渕です。
Yasuhiro.Kambe wrote in [vcpp 00060601] Re: コントロールのサイズ変更での不具合:
>> ドラッグでウィンドウの描画を行わない設定(枠だけが移動する設定)
>とは?ウィンドウスタイルでしょうか?
XP でいうと、コントロールパネル・システム・詳細設定・
パフォーマンス設定・「ドラッグ中にウィンドウを描画する」
という設定のことです。
>現状はドラッグでウィンドウの再描画がされて無駄な再描画が働いているかも
>しれないということですよね.
>(実際そのような動作してます)
>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>↑これを回避するにはどのようにすればよろしいのでしょうか?
OnSize() での処理を最小限にすればいいのです。
次のようにすれば、ウィンドウリサイズ中も洪水のように
WM_SIZE が来ていることをデバッグウィンドウで確認できます。
もちろん、「ドラッグ中にウィンドウを描画する」のチェックを
はずしたとき、リサイズの枠描画中もWM_SIZEがジャンジャン
来ます。
void Cxxx::OnSize(UINT nType, int cx, int cy)
{
TRACE("x = %d y = %d \n",cx,cy)]
一例ですが、
class Cxxxx { // 追加するメンバ変数
CSize m_szLastDrawn; // コンストラクタで -1,-1 で初期化しておく
BOOL m_bResized;
void Cxxx::OnSize(UINT nType, int cx, int cy)
{
switch(nType) {
case SIZE_MINIMIZED:
case SIZE_MAXHIDE:
return;
}
if (szLastDrawn != CSize(cx,cy)) {
// 関連コントロールのサイズの再計算が必要なら
// ここで行う(マウス入力などに備え、計算だけです)
// 画面が更新されたかどうかは勝手に判断してはいけません
m_bResized = TRUE;
Invalidate(0);
}
}
void Cxxx::OnPaint(CDC* pDC)
{
if (m_bResized) {
CRect r;
m_bResized = FALSE;
GetClientRect(r);
szLastDrawn = CSize(r);
// サイズが変わったので、
// ここでリソースの再割り当て関数を呼び出すなど
xxxxReallocBitmap(pDC);
}
// ここで通常描画
}
ただし、これは CView でのコーディング例です。
コントロールの場合はためしていません。
WM_SIZE で前処理をしても、WM_PAINT を受け取らなければ、
いくら描画のための前準備をやっても、水の泡と化する可能性
は十分あるためです。
Invalidate() を呼んでも、実際に WM_PAINT が来るとは限りません。
(ウィンドウが隠れているかもしれないし、画面外かもしれないし)
馬渕 茂
KOAH INTERACTIVE