ウィンドウサイズ変更時の描画

// ウィンドウサイズ変更時のイベントメッセージ
//
// 操作 - ウィンドウ変更なし
// OnEnterSizeMove
// OnSizing
//
// OnSizing
// OnExitSizeMove
//
//
//
// 操作 - ウィンドウ変更あり
// OnEnterSizeMove
// OnSizing
//
// OnSizing
// OnSize
//
// OnSizing
// OnExitSizeMove


bool g_enter_size_move = false;
bool g_sizing = false;
bool g_size = false;

// 更新
void CWnd_Invalidate( HWND m_hWnd, BOOL bErase = TRUE )
{
::InvalidateRect( m_hWnd, NULL, bErase );
}

//WM_ENTERSIZEMOVE
// ・ウィンドウサイズ変更前
// ・ウィンドウ移動前
void OnEnterSizeMove( HWND hwnd )
{
g_enter_size_move = true;
g_sizing = false;
g_size = false;
}

// WM_SIZING
// サイズ変更前
void OnSizing( HWND hwnd )
{
g_sizing = true;
}

// WM_SIZE
// サイズ変更後
void Cls_OnSize( HWND hwnd, UINT state, int cx, int cy )
{
g_size = true;

if( g_enter_size_move && g_sizing )
{
::OutputDebugStringW( L"高速描画\n" );
// 高速描画ON
g_draw_type = 1;

// 描画する
CWnd_Invalidate( hwnd, FALSE );
}
else
{
g_size = false;

// 通常描画ON
g_draw_type = 0;

// 描画する
CWnd_Invalidate( hwnd, FALSE );
}

// デフォルト処理
return FORWARD_WM_SIZE( hwnd, state, cx, cy, ::DefWindowProc );
}

//WM_EXITSIZEMOVE
// ・ウィンドウサイズ変更後
// ・ウィンドウ移動後
void OnExitSizeMove( HWND hwnd )
{
if( g_enter_size_move && g_sizing && g_size )
{
g_size = false;
g_sizing = false;
g_enter_size_move = false;

// 通常描画ON
g_draw_type = 0;

// 描画する
CWnd_Invalidate( hwnd, FALSE );
}
}


// WM_PAINT
void Cls_OnPaint( HWND hwnd )
{
PAINTSTRUCT ps;
HDC hdc = ::BeginPaint( hwnd, &ps );

CDC_FillSolidRect( hdc, &ps.rcPaint, RGB(128,128,128) );

switch( g_draw_type )
{
case 0:// 遅い
::TextOutW( hdc, 10, 10, L"遅い", 2 );
break;
case 1:// 速い (簡易描画)
::TextOutW( hdc, 10, 10, L"速い", 2 );
break;
}

::EndPaint( hwnd, &ps );
}
最終更新:2012年04月25日 10:33
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。