如果我在OnPaint()函数中使用CClientDC会发生什么?

时间:2013-07-03 09:27:58

标签: visual-studio-2010 visual-c++ mfc

我是MFC和Windows编程的新手,这是我无法理解的事情 我一直在阅读的地方说不要在OnPaint中使用CClientDC而只使用CPaintDC
在我的代码中,我将矩形绘图函数附加到使用向导创建基于对话框的MFC应用程序时创建的默认OnPaint()处理程序

void Cgraph_on_dlgboxDlg::OnPaint()
{
    CPaintDC dc(this); // ----------------------------> LINE 1
    if (IsIconic())
    {
        // CPaintDC dc(this); // device context for painting // ----------------------------> LINE 2

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }

    COLORREF pencolour = RGB(0, 0, 0);
    COLORREF brushcolour = RGB(0, 0, 255);
    CPen pen(PS_SOLID, 5, pencolour);
    CBrush brush(HS_CROSS, brushcolour);
     // CPaintDC Dc(this);      // ----------------------------> LINE 3
     // CClientDC Dc(this);     // ----------------------------> LINE 4
    dc.SetBkMode(TRANSPARENT);
/****
get rectangle coordinates and properties
****/
    dc.Rectangle(CRect(point1, point2));
}

在此代码中,最初LINE 1不存在。在这种情况下,如果在CClientDC中声明了LINE 4,则程序会绘制一个矩形,但在CPaintDCLINE 3中的任何内容都不会被启用。如果LINE 2中的CPaintDC被移除到LINE 1并且第3行和第4行被注释掉了,那就可以了。为什么会这样?根据我的理解,CClientDC在这里根本不应该工作,或者我错过了什么? 同样,CPaintDC中的LINE 2不应该只在if块中包含它吗?为什么声明CPaintDC两次根本不创建输出?

1 个答案:

答案 0 :(得分:1)

CPaintDC构造函数调用BeginPaint来获取剪切到无效区域(需要绘制的区域)的DC。构造第二个CPaintDC会获得一个空的无效区域,因此它无法绘制任何内容。

默认代码仅在第2行构造CPaintDC,因为当对话框最小化时,它不会调用CDialogEx :: OnPaint。当对话框未最小化时,CDialogEx :: OnPaint将构建CPaintDC。只有一个CPaintDC可用于对OnPaint进行任何特定的调用。

只要您保留CPaintDC的原始处理方式,就可以使用CClientDC绘制矩形。