MFC重绘对话框的边框和绘制圆角

说明:以下方法也是在网上查的,自己已实现。

第一步:重载DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)

LRESULT CMyTestDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	// TODO: 在此添加专用代码和/或调用基类
	LRESULT lResult = CDialog::DefWindowProc(message, wParam, lParam);

	CWnd* pWnd=this->GetParent();
	m_hWnd = pWnd->m_hWnd;
	if (!::IsWindow(m_hWnd))
    {
        return lResult;
    }
		
	if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||message==WM_NCACTIVATE ||message == WM_NOTIFY)
	{
		CDC* pWinDC = GetWindowDC();
		if (pWinDC)
        {
            DrawBorder(pWinDC);
        }
        else
        {
            ReleaseDC(pWinDC);
        }
	}
	return lResult;
	//return CDialog::DefWindowProc(message, wParam, lParam);
}

第二步:处理画边函数

void CMyDlg::DrawBorder(CDC *pDC)
{
	if (m_hWnd )
	{
		CBrush Brush(RGB(185, 184, 182));
		CBrush* pOldBrush = pDC->SelectObject(&Brush);

		CRect rtWnd;
		GetWindowRect(&rtWnd);

		CPoint point;
		//填充顶部框架
		point.x = rtWnd.Width();
		point.y = GetSystemMetrics(SM_CYFRAME)+1;
		pDC->PatBlt(0, 0, point.x, point.y, PATCOPY);
		//填充左侧框架
		point.x = GetSystemMetrics(SM_CXFRAME);
		point.y = rtWnd.Height();
		pDC->PatBlt(0, 0, point.x, point.y, PATCOPY);
		//填充底部框架
		point.x = rtWnd.Width();
		point.y = GetSystemMetrics(SM_CYFRAME) + 1;
		pDC->PatBlt(0, rtWnd.Height()-point.y, point.x, point.y, PATCOPY);
		//填充右侧框架
		point.x = GetSystemMetrics(SM_CXFRAME);
		point.y = rtWnd.Height();
		pDC->PatBlt(rtWnd.Width()-point.x, 0, point.x, point.y, PATCOPY);
	}
}

绘制圆角:

void CMyDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialog::OnSize(nType, cx, cy);

	// TODO: 在此处添加消息处理程序代码
	CRgn rgn;
	CRect rc;
	GetWindowRect(&rc); //获得窗口矩形
	rc -= rc.TopLeft();
	rgn.CreateRoundRectRgn(rc.left, rc.top, rc.right, rc.bottom, 15, 15); //根据窗口矩形创建一个圆角矩形最后两个是形成圆角的大小
	SetWindowRgn(rgn, TRUE);
}

在这里补充一点,说明两个问题,一个是如果处理右上角放大/缩小/关闭系统 三个按钮,一个是如何实现界面拖动。

1、实现右上角的放大/缩小/关闭系统

该步骤,可以添加三个按钮,直接手动实现它们的功能,后续的步骤就很简单了,这里就不说明。

2、实现界面的拖动

直接说解决方案,在类的消息处理中选中WM_NCHITTEST,添加OnNcHitTest()函数,修改其中的处理。具体如下:

 

LRESULT CMyTestDlg::OnNcHitTest(CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	UINT nh = CDialog::OnNcHitTest(point);
	return ((nh==HTCLIENT) ? HTCAPTION : nh);

	//return CDialog::OnNcHitTest(point);
}

这样就可以了,具体的原理目前已经忘记了,大家可以自行上网查询。

你可能感兴趣的:(C++,MFC)