OrangeMaker_logo
memo アイコン SDK-MFC 備忘録

Windows SDKやMFCに関するメモです。
(記載内容について正しいことを保証するものではありません。MSDN等で確認してください)

エアロなダイアログの作り方

2009/10/26 作成
2010/9/16 コード修正

エアロなダイアログの作り方を忘れないうちにメモしておきます。

基本的には、

MARGINS mgn = {-1,0,0,0};//let,right,top,bottom
HRESULT hr = DwmExtendFrameIntoClientArea(hWnd, &mgn);

とやれば、画面全体がエアログラスなウィンドウになります。

MARGINS構造体で辺からの距離をpx単位で指定します。-1を指定するとウィンドウ全体に効果が適用されます。リセットは全て0の指定でリセットされます。

typedef struct _MARGINS
{
    int cxLeftWidth;         // width of left border that retains its size
    int cxRightWidth;         // width of right border that retains its size
    int cyTopHeight;         // height of top border that retains its size
    int cyBottomHeight;     // height of bottom border that retains its size
} MARGINS, *PMARGINS;

あとは、ウィンドウのクライアント領域を黒で塗りつぶせばOKです。


と、ここまではMSDNやGoogle先生に聞くと例題付きで教えてくれます。

問題は、compositがOFFするとDWMは設定を忘れてしまう点です。なのでCompositの状態を監視して再設定する必要があります。

DWMからはCompositの状態が変化したときにWM_DWMCOMPOSITIONCHANGED 送られてくるのでCompositがEnableなら再設定が必要です。

mfcで作るダイアログ的に整理すると。

クラスの宣言部:
 private:
 BOOL m_bCompositEnable; //Aero合成有効無効
 MARGINS m_margins; 	//マージン
 VOID ChangeFrame(); //エアロフレームの設定&再設定

コンストラクタ:
 m_bCompositEnable = FALSE;
 memset(&m_margins,0, sizeof(m_margisn));

OnInitDialog()ハンドラ:	//Compositフラグ初期化
 DwmIsCompositionEnabled(&m_bCompositEnable);//マージン設定
m_margins.cxLeftWidth = 10;//左辺 m_margins.cxRightWidth = 10;右辺 m_margins.cyTopHeight = 10;//上辺 m_margins.cyBottomHeight =10;//下辺 ChangeFrame(); OnCompositionChanged()ハンドラ: DwmIsCompositionEnabled(&m_bCompositEnable); ChangeFrame(); OnCtlColor()ハンドラ: if(m_bCompositEnable){ pDC->SetBkMode(TRANSPARENT);//これは本当は不要 return static_cast<HBRUSH>(GetStockObject(BLACK_BRUSH)); } ChangeFrane関数: VOID MyDialog::ChangeFrame() { if(m_bCompositEnable){ HRESULT hr =DwmExtendFrameIntoClientArea(this->m_hWnd, &m_margins); if(SUCCEEDED(hr)){ } else{ //Error } } Invalidate(); }

クライアント背景の塗りつぶし方はOnEraseBkgrd()で塗りつぶすでもOKですし、ウィンドウの持っている背景塗りつぶし用ブラシを直接書き換えるSDK的な方法もあります。

このあたりは好みです。

また、マージン値が固定ならChangeFrame関数で毎回設定してもOKです。