2013-08-12 3 views
3

CFrameWnd의 OnPaint 메서드에 문제가 있고 어떤 일이 일어나고 있는지 파악할 수 없습니다. OnPaint는 약 10ms마다 약 호출되며 이로 인해 컴퓨터가 멈 춥니 다. CPU 사용량을 확인하고이 응용 프로그램이 50 %를 차지합니다!OnPaint가 너무 자주 업데이트됩니다.

응용 프로그램은 하나의 파일로 작성된 매우 간단한 MFC 응용 프로그램입니다.

// Includes are done here... 

class MFC_Tutorial_Window : public CFrameWnd 
{ 
std::string data; 

public: 
    MFC_Tutorial_Window() 
    { 
     this->data = ""; 
     Create(NULL, "Data Win"); // Create window 
    } 

    void OnPaint() 
    { 
     CDC* pDC = GetDC(); 

     CString s = CString(this->data.c_str()); 
     RECT rc; 

     HWND hwnd = this->m_hWnd; 
     if(hwnd != NULL) { 
      ::GetWindowRect(hwnd, &rc); 

      rc.top = rc.bottom/2; 

      if(pDC != NULL && pDC->m_hDC != NULL) { 
       pDC->DrawText(s, &rc, DT_CENTER); 
      } 
     } 
    } 

    void UpdateWithNewData(std::string up) { 
     this->data = up; 
     Invalidate(); 
    } 


    DECLARE_MESSAGE_MAP() 
}; 

BEGIN_MESSAGE_MAP(MFC_Tutorial_Window, CFrameWnd) 
    ON_WM_PAINT()  
END_MESSAGE_MAP() 

// App class 
class MyApp :public CWinApp 
{ 
    MFC_Tutorial_Window *wnd; 

    BOOL InitInstance() 
    { 
     wnd = new MFC_Tutorial_Window(); 
     m_pMainWnd = wnd; 
     m_pMainWnd->ShowWindow(3); 

         wnd->UpdateWithNewData("Hello world!");   
      return 1; 
    } 
}; 

왜 OnPaint가 시스템에서 스팸 된 이유를 알고 있습니까? 이 코드를봤을 때 나는 그것을 발견하지 못했습니다.

+0

* 항상 * View 클래스를 사용하고 싶다면 OnDraw에서 드로잉을하면 프레임 워크가 현재 문제를 일으키는 세부 사항을 처리합니다. –

답변

2

다시 칠하기 플래그를 다시 설정하려면 CPaintDC 소멸자를 호출해야합니다. CDC에서 beginPaint();endPaint();으로 전화해야하며 실제로는 CPaintDC으로 변경해야합니다. 더 중요한 것은 endPaint();을 호출하지 않으면 상황에 관계없이 문맥이 다시 칠해집니다.

+0

정말 고마워요! 지금은 매력처럼 작동합니다! : D – Pphoenix

+0

@Pphoenix Nice! 다행히 도울 수있다. :) –

+0

EndPaint가 그리려는 영역을 지우는 것 같습니다. 다음에 다시 그리기를 원할 때까지 그려지는 영역이 동일하게 유지되도록하고 EndPaint를 유지하는 방법이 있습니까? – Pphoenix

2

WM_PAINT 메시지 큐에 다른 메시지가없고 창 업데이트 영역 (InvalidateRect 참조)이 비어 있지 않으면 메시지가 생성됩니다. WM_PAINT 메시지를 처리 ​​할 때 응용 프로그램은 EndPaint을 호출하여 업데이트 영역이 다시 그려 졌음을 알립니다. EndPaint을 호출하지 못하면 업데이트 영역을 처리 된 것으로 표시하지 않으므로 다음에 응용 프로그램이 메시지를 묻는 경우 WM_PAINT이 유효한 후보가됩니다.

MFC에서 BeginPaintEndPaint을 호출하는 기능은 CPaintDC Class에 캡슐화됩니다. WM_PAINT에 대한 표준 MFC 메시지 처리기는 다음과 같습니다 : 디바이스 컨텍스트를 사용하는 방법에 대한

void OnPaint() 
{ 
    CPaintDC dc(this); // calls BeginPaint() 
    // Perform rendering operations on dc 
    // ... 
} // CPaintDC::~CPaintDC() calls EndPaint() 

더 자세한 정보는 Device Contexts에서 찾을 수 있습니다.