实现CDialog自绘的步骤:
1、就是按照下面的2个参数,将客户区分割为9宫格,然后对应的贴图,除了4个角落的图片,其他5张图片都是采用的拉伸方式贴图
RECT m_rcImageWindow; // 背景图片相对于源图片文件中裁剪下来的区域
RECT m_rcImageClient; // 9宫格中心客户区相对于源图片文件中的裁剪区域
2、有标题栏窗体绘制遇到问题:标题栏高度的自定义,需要处理消息WM_NCCALCSIZE:
void CSWDialog::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bHasTitleBar && bCalcValidRects && !::IsRectEmpty(&m_rcImageClient) && !::IsRectEmpty(&m_rcImageWindow))
{
int cx = ::GetSystemMetrics(SM_CXFRAME);
int cy = ::GetSystemMetrics(SM_CYFRAME);
lpncsp->rgrc[0].top += m_rcImageClient.top - m_rcImageWindow.top + cy;
}
else
{
CDialog::OnNcCalcSize(bCalcValidRects, lpncsp);
}
}
另外还有4个边框的绘制。
3、无标题栏窗体绘制遇到的问题:由于窗体本身没有标题栏,无法拖拽移动窗体,需要额外处理消息WM_NCHITTEST和WM_SETCURSOR;绘制一个假的标题栏,添加系统按钮(最小化、最大化/恢复、关闭)与响应消息。