【问题标题】:How to draw border in a non rectangular window in MFC如何在 MFC 中的非矩形窗口中绘制边框
【发布时间】:2013-05-02 00:29:59
【问题描述】:

我有一个无模式对话框,我使用 SetWindowRgn() 将形状更改为圆形。我想使用 FrameRgn 在它周围绘制一个彩色边框。这是我正在使用的代码

BOOL CMyDlg::OnInitDialog() 
 {
 CDialog::OnInitDialog(); m_Brush.CreateSolidBrush(RGB(255,255,255));
 CRect rcDialog;
 GetClientRect(rcDialog);

 // This Creates area assigned to Dialog: This goes directly below the above in OnInitDialog
 m_rgnShape.CreateRoundRectRgn(rcDialog.TopLeft().x, rcDialog.TopLeft().y,rcDialog.BottomRight().x,rcDialog.BottomRight().y, rcDialog.Width()/8, rcDialog.Height()/8);
::SetWindowRgn(GetSafeHwnd(), (HRGN)m_rgnShape, TRUE);

return TRUE; // return TRUE unless you set the focus to a control
  // EXCEPTION: OCX Property Pages should return FALSE

}

void CMyDlg::OnPaint() 
{
 CPaintDC dc(this); // device context for painting

 CBrush brush;
 brush.CreateSolidBrush(RGB(255,0,0));

  dc.FrameRgn(&m_rgnShape, &brush, 2, 2);
}

谁能解释为什么 FrameRgn 不工作,也许在这里提供一些示例代码 这将使它工作。

【问题讨论】:

    标签: c++ mfc


    【解决方案1】:

    CWnd::SetWindowRgn文档所示:

    成功调用 SetWindowRgn 后,操作系统拥有 由区域句柄 hRgn 指定的区域。操作系统可以 不要复制区域,所以不要做任何进一步的功能 用这个区域句柄调用,不要关闭这个区域句柄。

    这基本上意味着您不能再去将该区域用于其他目的,并且您也不能“失去”该区域。由于它是一个成员变量,所以最后一个问题不是您需要担心的问题。但是关于“不使用它”部分,您会注意到FrameRgn(...) 调用很可能返回零,表示尝试绘制时失败。

    你可以做的是从CRgn对象中分离区域句柄并使用它来设置窗口区域,然后你可以像以前一样重新创建一个新的:

    m_rgnShape.CreateRoundRectRgn(...);
    HGDIOBJ hRgn = m_rgnShape.Detach();
    ::SetWindowRgn(GetSafeHwnd(), (HRGN)hRgn, TRUE);
    m_rgnShape.CreateRoundRectRgn(...);
    

    要获得更好的描述,请查看这篇涵盖 Setting a Window Region 的文章,让它看起来像一只猫。


    编辑:您的评论提到现在,框架区域被有效地偏移了一个数量。该数量可能是您的窗口边框的大小。

    当您调用 GetClientRect 时,它会返回窗口客户区的大小 - 您可以轻松绘制的部分,以及当您在OnPaint() 方法。

    偏移的原因是您的窗口有一个边框,您通常不会在该边框上绘制(有一些方法,但我们现在将忽略这些方法)。所以设备上下文描述了一个从你的窗口偏移的区域。

    在您的情况下,最简单的解决方案可能是修改对话框模板以指定无边框。这当然会限制调整窗口的大小,但由于您已经设置了一个区域,我假设调整大小也不是一个选项。

    【讨论】:

    • 嗨,我在绘制多边形时按照您的建议更改了代码。现在边框正在显示,但只显示多边​​形的两侧。你能告诉我如何控制它。现在,多边形的所有边都没有边框。
    • 这可能是因为您的对话框上有边框 - 我会在答案中添加一些内容来解释。
    猜你喜欢
    • 2010-11-02
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多