在 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()的巨大区别

C++ MFC:将位图绘制到 CFrame 中

MFC 对话框在耗时的 OnPaint() 后消失

MFC OnPaint被不断调用的问题

MFC中的Invalidate、OnDraw、OnPaint函数的作用、区别和联系?