说明:以下方法也是在网上查的,自己已实现。
第一步:重载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);
}
这样就可以了,具体的原理目前已经忘记了,大家可以自行上网查询。