こんにちは、Sleipnir 3 for Windows 開発担当の上田です。
今回は、Aero Glass をダイアログに適用してみたいと思います。
1. Visual Studio 2010 で 「MFC アプリケーション」を「ダイアログ ベース」で
作成します。
※紹介するサンプルのプロジェクト名は、「AeroGlass」にしており
Windows 7 で動作確認を行っています。
自動生成されるダイアログクラス (CAeroGlassDlg) にコードを記述します。
2. ダイアログの初期化時に、Aero Class を領域設定する
API(DwmExtendFrameIntoClientArea) を実行します。
BOOL CAeroGlassDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // "バージョン情報..." メニューをシステム メニューに追加します。 // IDM_ABOUTBOX は、システム コマンドの範囲内になければなりません。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、 // Framework は、この設定を自動的に行います。 SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定 SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定 // TODO: 初期化をここに追加します。 HMODULE hDwmLib = ::LoadLibrary( _T( "dwmapi.dll" ) ); if ( hDwmLib ) { typedef HRESULT (__stdcall *FnDwmExtendFrameIntoClientArea )(HWND hWnd, const MARGINS* pMargins); FnDwmExtendFrameIntoClientArea pfnDwmExtendFrameIntoClientArea = (FnDwmExtendFrameIntoClientArea)::GetProcAddress( hDwmLib, "DwmExtendFrameIntoClientArea" ); if ( pfnDwmExtendFrameIntoClientArea ) { MARGINS margins = { -1, -1, -1, -1 }; pfnDwmExtendFrameIntoClientArea( m_hWnd, &margins ); ::FreeLibrary( hDwmLib ); } } return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 }
※ハイライトしている部分が、追加したコードになります。
3. WM_CTLCOLOR のメッセージで、テキストの色、背景モードを設定し、
黒ブラシを返します。
ダイアログの背景が黒で塗りつぶされ、その部分が透けます。
HBRUSH CAeroGlassDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { pDC->SetTextColor( RGB( 255, 0, 0 ) ); pDC->SetBkMode( TRANSPARENT ); return (HBRUSH)::GetStockObject( BLACK_BRUSH ); }
これで、ダイアログ全体に Aero Glass が適用されます。
現時点ではボタンの文字も透けてしまいます。
これを回避するためには、ボタンをカスタマイズして
独自で描画する必要があり大変なため、今回は省きます。
4. 今回のサンプルを Windows XP で実行すると黒背景のダイアログになります。
OnCtlColor で、Aero 環境であるか調べて処理を分ける必要があります。
今回は Aero Glass を全体的に適用しただけなため少しのコードで済んでいます。
ボタン、エディットなど色々なコントロールに綺麗に適用させようとすると
とても大変になってきますが、興味が沸いた方はぜひ試してみてください。