在 MFC C++ 程序中同时出现 OnPaint() 和 MouseMove 事件
Posted
技术标签:
【中文标题】在 MFC C++ 程序中同时出现 OnPaint() 和 MouseMove 事件【英文标题】:OnPaint() and MouseMove event at same time in MFC C++ program 【发布时间】:2016-03-16 02:42:07 【问题描述】:我有两个函数 - draw1() 和 draw2() 将位图绘制到 DC。我需要一个接一个地给他们打电话。所以我这样做了,
void CDlg::OnPaint()
for(int i=0;i<10;i++)
draw1();
draw2();
我还想添加一个 clickmouse 事件,即当我单击鼠标左键时,光标应该消失。所以我这样做了,
void CDlg::OnLButtonUp(UINT nFlags, CPoint point)
ShowCursor(FALSE);
但不会发生单击鼠标事件,除非 OnPaint() 中的“for 循环”没有完成。
我希望 for 循环继续,同时点击鼠标应该不会中断 for 循环。
如何进行更改或添加以获得结果?
编辑:为什么是 for 循环? 在 draw1() 和 draw2() 中,我分别读取两个 YUV 文件的第一帧,转换为位图,然后将其绘制到 DC。 1 秒后我在 2 个位图之间切换。对于例如屏幕保护程序。因此是 for 循环。
【问题讨论】:
为什么会有for
循环?
你需要多任务处理
您需要将循环放入线程中。但我不确定你为什么要画不止一次。
绘画永远不应该花这么长时间,你为什么会有这样的循环?处理绘图并返回,鼠标事件将被处理。否则,您必须在另一个线程中提取“长时间的例行程序”。
详细说明您_实际_尝试实现的目标。
【参考方案1】:
您尚未初始化变量。
for(int i=;i<10;i++)
初始化变量
for(int i=0;i<10;i++)// initialize with any value
【讨论】:
【参考方案2】:多任务处理。
我在 onPaint() 中启动了一个线程 - AfxBeginThread(Process, this, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
在 Process()- 调用 for 循环函数。
它现在正在工作。
谢谢。
【讨论】:
多线程和 GUI 编程是正交的。虽然可以跨线程正确序列化渲染,但您什么也没做。这不是答案。 你甚至不知道这造成了多少浩劫。当事情开始以最不可调试的方式出现问题时,祝你好运。这不是您的问题的答案。另一方面,使用计时器的单线程应用程序是一种解决方案。它要求您了解 Windows 应用程序基于事件的性质。以上是关于在 MFC C++ 程序中同时出现 OnPaint() 和 MouseMove 事件的主要内容,如果未能解决你的问题,请参考以下文章
MFC中的一般经验之谈----OnInitialUpdate
MFC OnPaint()函数中最先调用CDialog::OnPaint()和最后调用CDialog::OnPaint()的巨大区别