0

我是 MFC 的新手,正在制作一个简单的程序,它将不断更新两个编辑框。编辑框包含鼠标光标的 x 和 y 坐标。该程序仅在单击开始按钮时开始抓取光标坐标,并且应该在单击停止按钮时停止。但是,只要我单击开始按钮,整个窗口就会冻结。

这是我到目前为止所拥有的:

//Way up high in the code:
#include <windows.h>

//way down low in the code

void CmfcpixelDlg::OnBnClickedButtonStart()
{
POINT p;

CString x;
CString y;

int px;
int py;

while(stop == false){

    GetCursorPos(&p);

    px = p.x;
    //convert x coordinate to a CString
    x.Format(L"%d", px);
    //convert y coordinate to a CString
    py = p.y;
    y.Format(L"%d", py);
    m_x.SetWindowTextW(x.GetBuffer());
    m_y.SetWindowTextW(y.GetBuffer());


}
}
4

2 回答 2

4

您正在阻止事件循环。您不能执行需要用户干预才能在 GUI 线程中结束的循环 - 您需要在单独的线程中执行。

事实上,您不应该在主线程中执行任何冗长的操作。

基本上,运行循环的线程就是负责显示和更新 GUI 的线程。因为这个线程现在正在等待 GUI 更新退出循环,并且这个线程是应该更新 GUI 的同一个线程,所以你有一个 Catch-22,或者用程序员的话来说,一个死锁。

要解决此问题,您可以将代码拆分到一个新线程中,或者更好的是,将其设计为完全消除循环。您的代码相当简单,并且可以无循环地完成:

  • 单击开始时:设置标志。
  • 鼠标移动:如果设置了标志,则更新 x、y 坐标文本。没有循环!
  • 单击停止时:取消设置标志。
于 2013-01-16T15:51:30.447 回答
0

您应该使用该OnMouseMove事件,并且仅当用户单击开始时才更新编辑框。

于 2013-01-16T15:53:27.657 回答