0

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

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在这种情况下,如果在 in 中声明,程序将绘制一个矩形,但在in启用LINE 4时不绘制任何内容。如果删除了 CPaintDC并注释掉了第 3 行和第 4 行,则它可以工作。为什么会这样?据我了解, CClientDC 根本不应该在这里工作,还是我错过了什么? 同样, in 不应该只在 if 块内有它的范围吗?为什么声明 CPaintDC 两次根本没有输出?CPaintDCLINE 3LINE 2LINE 1
CPaintDCLINE 2

4

1 回答 1

1

CPaintDC 构造函数调用 BeginPaint 以获取裁剪到无效区域(需要绘制的区域)的 DC。构造第二个 CPaintDC 会得到一个空的无效区域,因此它不能绘制任何东西。

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

您可以使用 CClientDC 来绘制矩形,只要您保持原来的 CPaintDC 处理不变。

于 2013-07-03T15:19:13.273 回答