MFC画图求教

1
void CMyView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	i += 1;
	pointxy[i] = point;
	CView::OnLButtonDown(nFlags, point);
}

void CMyView::OnDrawN()
{
	// TODO: 在此添加命令处理程序代码
	CDC* pDC = GetDC();
	pDC->MoveTo(0, 0);
	for (int ii = 0; ii < i; ii++)
	{
		pDC->LineTo(pointxy[i].x, pointxy[i].y);
	}
	pDC->MoveTo(0, 0);
}

我的思路是用鼠标响应函数记录坐标点,然后在ondrawn函数里用moveto,lineto的方式把点连成线做成多边形。编译通过但是不能显示任何图形。请问如何改进这段代码。编译环境是vs2019.

ava
咕咕咕

2020-4-29

0

许久没有用 MFC 了,更没在 VS2019 里面用过 MFC,只能根据老版本的印象回答了。

首先说一个重要原理:OnDraw() 并不一定会执行绘制。
为了确保性能,“内容有效”的窗口区域,是不会执行绘制的。只有当窗口内容需要更新的时候,OnDraw() 里面的绘制代码才会显示。例如,窗口被遮挡后又显示,就会导致部分窗口区域无效,从而执行局部绘制。

所以你的问题是:鼠标点击了,坐标记录了,画线的代码也执行了,但是因为显示原理的问题,你的画线代码并没有显示出来。

解决办法:在 OnLButtonDraw() 函数的末尾,执行 Invalidate() 函数,明确表示窗口内容需要重绘。这样改 OnLButtonDown 函数:

void CMyView::OnLButtonDown(UINT nFlags, CPoint point)
{
	i += 1;
	pointxy[i] = point;
	CView::OnLButtonDown(nFlags, point);

	Invalidate();
}

至于 OnDraw() 函数里面的 Bug 我就不管了,太明显了,相信你在线条能画出来后看一眼就能搞定。

ava
慢羊羊

2020-4-30

村长好,我刚刚试了一下,仍然是画不出来。(至于我之前代码里的pDC,我编其他绘图函数的时候用的,是可以画出来的。)那关于这段代码,是否要考虑是别的什么的问题呢? -  咕咕咕  2020-4-30
@咕咕咕 我修改了答案,详细解释了问题。 -  慢羊羊  2020-4-30
技术讨论社区
相关提问