在 mfc 中绘制父对话框

Posted

技术标签:

【中文标题】在 mfc 中绘制父对话框【英文标题】:Draw on parent dialog in mfc 【发布时间】:2017-05-28 16:05:28 【问题描述】:

我有一个包含许多控件的对话框。例如:编辑控件。 现在我正在开发这些具有彩色边框的编辑控件。 但是每次用户在编辑控件中输入输入时,控件都会重绘自身,因此边框会闪烁。 现在我想在具有此控件的对话框上绘制边框。 mfc可以吗?

【问题讨论】:

如何为编辑控件绘制边框?我会通过处理WM_NCCALCSIZE 来定义边框大小和WM_NCPAINT 来实际绘制边框来做到这一点。如果操作正确,则不会出现闪烁。 “现在我正在开发这些编辑控件” - 这可能意味着任何事情。作为您问题的核心组成部分,它值得更多细节。 【参考方案1】:

您可以通过自定义控件类并在非客户区绘图来实现此目的。 我已经在我的项目中实现了这个,没有闪烁问题。

这个想法是这样的:

/////////////////////////////////////////////////////////////////////////////
///
/// /This method is overriden, to modify the style of editcrtl
///
/////////////////////////////////////////////////////////////////////////////
void CEdit1::PreSubclassWindow()

    ModifyStyleEx(0, WS_EX_STATICEDGE, 0); //to make sure your border is static edge

在非客户区你只画红色矩形:

/////////////////////////////////////////////////////////////////////////////
///
/// /This handler is used to paint the non- client area
///
/// /return none
///
/////////////////////////////////////////////////////////////////////////////
void CEdit1::OnNcPaint() 

    CDC* pDC = GetWindowDC();

    //work out the coordinates of the window rectangle,
    CRect rect;
    GetWindowRect( &rect);
    rect.OffsetRect( -rect.left, -rect.top);

    //Draw a single line around the outside
    CBrush brush(RGB(255,0,0));
    pDC->FrameRect(&rect, &brush);
    ReleaseDC( pDC);

【讨论】:

【参考方案2】:

我在 Onsize 中进行了更改,并将控件每边缩小了 1px,然后绘制了边框。 像这样的

rcRichEdit.left += 1;
        rcRichEdit.right -= 1;
        rcRichEdit.bottom -= 1;

【讨论】:

以上是关于在 mfc 中绘制父对话框的主要内容,如果未能解决你的问题,请参考以下文章

mfc中让编辑框透明为啥总显示黑色背景的编辑框啊?

为啥 CDC::LineTo() 不在 Visual C++ 2015 MFC 对话框中绘制?

在 MFC 中拖动子对话框时如何移动父对话框?

MFC 对话框中的父通知

如何根据父对话框中设置的变量在子 MFC 对话框中显示值?

MFC 对话框中的 QWinWidget 不重新绘制或响应 Tab/箭头键