2013-01-16 2 views
0

MFC를 처음 사용하고 두 개의 편집 상자를 지속적으로 업데이트하는 간단한 프로그램을 만들고 있습니다. 편집 상자에는 마우스 커서의 x 및 y 좌표가 포함됩니다. 프로그램은 시작 버튼을 클릭 할 때만 커서 좌표를 잡기 시작하며 중지 버튼을 클릭하면 중지됩니다. 그러나 시작 버튼을 클릭하자마자 전체 창이 멈 춥니 다.MFC에서 창을 고정시키지 않고 계속 실행되는 함수를 만드는 방법은 무엇입니까?

//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

당신은 이벤트 루프를 차단하고 있습니다 : 여기

는 내가 지금까지 가지고있는 것입니다. GUI 스레드에서 사용자 개입을 요구하는 루프를 수행 할 수 없습니다. 별도의 스레드에서 수행해야합니다.

실제로 긴 작업을 주 스레드에서 수행하면 안됩니다.

기본적으로 루프를 실행하는 동일한 스레드는 GUI를 표시하고 업데이트하는 스레드입니다. 이 스레드는 이제 GUI 갱신을 기다려 루프 을 종료하기 때문에이 스레드는 GUI를 업데이트하기로되어있는 스레드와 같습니다. Catch-22가 있거나 프로그래머가 말하는 교착 상태가 있습니다.

이 문제를 해결하려면 코드를 새 스레드로 분할하거나 더 나은 방법으로 루프를 완전히 제거하도록 디자인 할 수 있습니다. 코드는 매우 간단하며 루프를 사용하지 않아도됩니다.

  • 시작을 클릭하면 플래그를 설정합니다.
  • 마우스가 움직일 때 : , 플래그가 설정된 경우 x, y 좌표 텍스트를 업데이트하십시오. 루프가 없습니다!
  • 클릭시 : 깃발을 해제하십시오.
+0

감사합니다. 이것은 아주 잘 작동했습니다. 현재 유일한 문제는 커서가 다이얼 박스 안에있을 때만 커서 좌표가 표시된다는 것입니다. 커서가 화면의 어디에 있더라도 좌표를 가져올 수있는 방법이 있습니까? – xcdemon05

+1

@xcdemon 타이머 콜백 또는 두 번째 스레드를 사용해야합니다. –

0

OnMouseMove 이벤트를 사용해야하며 사용자가 시작을 클릭 한 경우에만 편집 상자를 업데이트해야합니다.

+0

OnMouseMove를 사용하면 moise 포인터가 CmfcpixelDlg 창 안에있는 동안에 만 움직임을 얻을 수 있습니다. –

+0

@MichaelWalz 예,하지만 OP 질문에 문제가되지 않았습니다. – Smash

관련 문제