想做个换肤窗口
尝试写一个自绘窗体,在vckbase上找到一个范例, 其中绘制标题栏的代码大概如下:
Code
CWindowDC dc( pWindow );
CBrush br( RGB( 255, 0, 128 ) );
CBrush *pOld = dc.SelectObject( &br );
CRect rcWnd;
pWindow->GetWindowRect( &rcWnd );
CPoint pt;
pt.x = rcWnd.Width();
pt.y = GetSystemMetrics( SM_CYSIZE ) + GetSystemMetrics( SM_CYFRAME ) + 1;
dc.PatBlt( 0, 0, pt.x, pt.y, PATCOPY );
CWindowDC dc( pWindow );
CBrush br( RGB( 255, 0, 128 ) );
CBrush *pOld = dc.SelectObject( &br );
CRect rcWnd;
pWindow->GetWindowRect( &rcWnd );
CPoint pt;
pt.x = rcWnd.Width();
pt.y = GetSystemMetrics( SM_CYSIZE ) + GetSystemMetrics( SM_CYFRAME ) + 1;
dc.PatBlt( 0, 0, pt.x, pt.y, PATCOPY );
在整个程序中都以是类似的方式在一个函数中绘制完成,而我在看别人写的界面时,却发觉是通过创建区域、合并区域最终完成换肤,
整个流程显得“轻巧与优雅”。
上面的程序绘制出来的样子大概如下图,怪异的红色的标题栏是自己绘的,其余部分没有绘制。
然后我拖着资源管理器窗口左右移动以覆盖了它。
这时可以看到SDI程序主框架下的非客户区,上面的红色标题栏以及其它所有蓝色区域(菜单栏、窗口左边框、右边框、下边框,
这些区域是用资源管理器覆盖它后产生的)。
还有就是这种绘制方法下,不能屏蔽Windows自身绘制的最小化、最大化、关闭按钮。