我是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
,则程序会绘制一个矩形,但在CPaintDC
中LINE 3
中的任何内容都不会被启用。如果LINE 2
中的CPaintDC被移除到LINE 1
并且第3行和第4行被注释掉了,那就可以了。为什么会这样?根据我的理解,CClientDC在这里根本不应该工作,或者我错过了什么?
同样,CPaintDC
中的LINE 2
不应该只在if块中包含它吗?为什么声明CPaintDC两次根本不创建输出?
答案 0 :(得分:1)
CPaintDC构造函数调用BeginPaint来获取剪切到无效区域(需要绘制的区域)的DC。构造第二个CPaintDC会获得一个空的无效区域,因此它无法绘制任何内容。
默认代码仅在第2行构造CPaintDC,因为当对话框最小化时,它不会调用CDialogEx :: OnPaint。当对话框未最小化时,CDialogEx :: OnPaint将构建CPaintDC。只有一个CPaintDC可用于对OnPaint进行任何特定的调用。
只要您保留CPaintDC的原始处理方式,就可以使用CClientDC绘制矩形。