2012年2月28日火曜日

MFCでDialogの透明化



ディスプレイサイズのダイアログを作成して、
その上をBMPが動くものを作っていたんだけど。

デバッグがやりにくかったので一時的にダイアログを
透明化したくてコードを追加しました・∀・



処理の流れ

  1. ダイアログに赤色が使われるところを透明にする設定をする。
  2. ダイアログを表示時に赤色で全部塗りつぶす。
  3. ダイアログを表示時、全面赤色に塗りつぶされたダイアログは透明になる。



xxxDialog.hの中で以下追加 
CBrush m_brDlg; ← ダイアログの背景色ブラシ


CxxxDialog::OnInitDialogの中で以下追加

// ウィンドウの拡張スタイルを変更
ModifyStyleEx(0, WS_EX_LAYERED); 

// レイヤードウィンドウの不透明度と透明のカラーキ
SetLayeredWindowAttributes(RGB(255 , 0 , 0), 0, LWA_COLORKEY);

// 赤色のブラシを作成する.
m_brDlg.CreateSolidBrush(RGB(255,0,0));


// WM_CTLCOLORのメッセージ関数をオーバーライド
HBRUSH  CxxxDialog ::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO:  ここで DC の属性を変更してください。
switch(nCtlColor){
case CTLCOLOR_DLG:        ←ダイアログの背景色
return (HBRUSH) m_brDlg;
default:
break;
}
// TODO:  既定値を使用したくない場合は別のブラシを返します。
return hbr;
}