MFC创建圆角矩形边框

来源:互联网 发布:淘宝助理5一键下架宝贝 编辑:程序博客网 时间:2024/06/04 19:57

最近在写一个安装程序的界面。需要自绘对话框及一系列控件。


个人认为MFC自定义控件或对话框最基本的思想就是了解这些元素的创建过程,并适当的截取消息进行重写。


对话框分为客户区与非客户区。

获取客户区的设备上下文函数是:GetDC();

获取非客户区的设备上下文是:GetWindowDC();这个DC其实是整个窗口的DC。


我们要绘制一个圆角矩形的边框。

就是响应OnNcPaint这个消息。


void CTestChildDlgDlg::OnNcPaint()
{
// TODO: Add your message handler code here
// Do not call CDialog::OnNcPaint() for painting messages
CRect rect ,rect1;


GetClientRect(&rect);
GetWindowRect(&rect1);
ScreenToClient(&rect1);


CDC *pdc = GetWindowDC();



if (!m_rgn.m_hObject)
{
m_rgn.CreateRoundRectRgn((-rect1.left) -1 ,(-rect1.top)   ,rect.right - rect1.left + 2 ,rect.bottom - rect1.top + 2  ,10 ,10);

//可以跟踪下rect 跟 rect1的值。我们是在整个窗口区进行绘制,而ScreenToClient(&rect1)之后,rect1的坐标是相对于窗口客户区而言的。你可以观察到rect1有负的坐标值。而我们要在整个窗口区进行绘制,就需把这个相对于客户区的坐标转换为相对于整个窗口的坐标。

同时OnEraseBkgnd()里面应该return TRUE;默认会使用系统画刷不断刷新窗口,我们绘制出来的边框的圆角将显示不出来。

SetWindowRgn(m_rgn ,TRUE);
}
CBrush brush;
brush.CreateSolidBrush(RGB(255 ,0 ,0));
pdc->FrameRgn(&m_rgn ,&brush ,1 ,1);


}

坐标可以进行适当的调整。以达到自己想要的效果。

原创粉丝点击