用C++品尝Vista美味[5]
如果没有打开合成,我们用GDI函数绘制文本:
else
{
const UINT u format = DT _ single line | DT _ CENTER | DT _ VCENTER | DT _ no prefix;
//设置DC
华盛顿。SetTextColor ( RGB(255,255,255));
dc。select font(m _ font);
dc。SetBkMode(透明);
//绘制文本
华盛顿。DrawText ( szTime,-1,rcText,u format);
}
返回true//我们绘制了整个背景
}
为了演示发光效果,这里有一段同样背景的文字,但是没有发光效果:
处理与合成相关的通知。
当DWM的合成状态为on或off时,系统会向所有顶层窗口广播一条WM_DWMCOMPOSITIONCHANGED消息;如果打开了composition,我们需要再次调用DwmExtendFrameIntoClientArea()来通知DWM,我们窗口的哪个部分应该有磨砂玻璃效果:
LRESULT CMainFrame::onpositionchanged(...)
{
if(IsCompositionEnabled())
{
mar = { 0 };
mar . cybottomheight = 100;
DwmExtendFrameIntoClientArea(m _ hWnd,& mar);
}
返回0;
}
在对话框程序中应用毛玻璃效果
在对话框程序中添加毛玻璃效果的过程与上面框架窗口的例子非常相似,只是需要对代码做一些细微的改动。在示例对话框程序中,顶部窗口添加了磨砂玻璃效果。下面,相对于前一个示例修改或添加的代码将以粗体标记。
设置对话框
和前面一样,告诉CThemeImpl我们要使用哪个窗口类主题,调用DwmExtendFrameIntoClientArea()为窗口边框添加磨砂玻璃效果。
CMainDlg::CMainDlg()
{
SetThemeClassList(L " globals ");
}
booc main DLG::OnnitDialog(HWND HWND Focus,LPARAM LPARAM)
{
//删除了向导生成的部分初始化代码
//在顶层窗口添加毛玻璃效果。
if(IsCompositionEnabled())
{
MARGINS mar = { 0 };
mar . cytopheight = 150;
DwmExtendFrameIntoClientArea(m _ hWnd,& mar);
}
接下来,构建文本字体。注意,我们需要显式调用OpenThemeData(),但为什么不在前面的框架窗口示例中调用,因为CThemeImpl已经在其WM_CREATE处理程序中被调用。另一方面,对话框反而接收WM_INITDIALOG,而CThemeImpl不处理WM_INITDIALOG,所以我们需要自己调用OpenThemeData()。另外,代码中字体设置的比较大,只是为了演示更大字体的发光效果。
位律师回复
0条评论