当前位置: 首页 > 工具软件 > cdialog > 使用案例 >

VC++ CDialog自绘阶段性总结

童浩言
2023-12-01

实现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;绘制一个假的标题栏,添加系统按钮(最小化、最大化/恢复、关闭)与响应消息。

 类似资料: