MFC:使用 GDI+ 绘制对话框边框

Posted

技术标签:

【中文标题】MFC:使用 GDI+ 绘制对话框边框【英文标题】:MFC: Draw dialog border using GDI+ 【发布时间】:2015-04-12 04:47:15 【问题描述】:

我将对话框修改为多边形区域对话框。然后我试图框架/绘制边框。使用设备上下文 CRgn::FrameRgn,我可以在对话框周围绘制边框。但我想使用 Gdi+ 来实现这一点。我做了如下,但边框只出现在对话框的左侧和顶部。 有人可以帮忙吗?

CPoint vertex[4];
BOOL CPolygonDlg::OnInitDialog()

    CDialogEx::OnInitDialog();

    ModifyStyle(WS_CAPTION,0);
    ModifyStyle(WS_BORDER,0);

     CRect rect(400,200,900,700);
     CRect wr = rect;
    AdjustWindowRect( wr, 0, FALSE );
    MoveWindow(wr); 

    GetClientRect( rect );
    CRect csr = rect;
    ClientToScreen( csr );



    vertex[0] = CPoint(rect.left,rect.top);
    vertex[1] = CPoint(rect.right,rect.top);
    vertex[2] = CPoint(rect.right,rect.bottom);
    vertex[3] = CPoint(rect.left,rect.bottom);


     m_rgnShape.CreatePolygonRgn( vertex, 4, ALTERNATE );
    m_rgnShape.OffsetRgn( CPoint( csr.TopLeft() - wr.TopLeft() ) );
    SetWindowRgn( (HRGN)m_rgnShape.Detach(), TRUE );
    m_rgnShape.CreatePolygonRgn( vertex, 4, ALTERNATE );




    return TRUE;  // return TRUE  unless you set the focus to a control


void CPolygonDlg::OnPaint()

Graphics graphics(dc.m_hDC);
    CRect rect;
    GetClientRect(rect);
GraphicsPath gp;
    Point point[4];
    point[0] = Point(rect.left,rect.top);
    point[1] = Point(rect.right,rect.top);
    point[2] = Point(rect.right,rect.bottom);
    point[3] = Point(rect.left,rect.bottom);
    gp.AddPolygon(point,4);
    Pen pen(Color(255, 255, 0, 0));
    graphics.DrawPath(&pen, &gp);

谢谢

【问题讨论】:

【参考方案1】:

当您调用GetClientRect() 时,它会返回窗口客户区的大小——您可以轻松绘制的部分,以及当您在@987654323 中执行CPaintDC dc(this); 时由设备上下文控制的部分@ 方法。

您面临的问题是您的对话框窗口有边框,您需要处理 WM_NCPAINT 才能在边框区域上绘图。

【讨论】:

以上是关于MFC:使用 GDI+ 绘制对话框边框的主要内容,如果未能解决你的问题,请参考以下文章

MFC 调整大小对话框和子窗口绘制问题

VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)

(转载)VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)

MFC中GDI之CRgn类

MFC设置对话框背景和边框颜色

VC MFC中如何制作无边框窗口