C++ OnPaint更新太频繁

C++ OnPaint更新太频繁,c++,mfc,cpu,freeze,onpaint,C++,Mfc,Cpu,Freeze,Onpaint,我对CFrameWnd的OnPaint方法有一个问题,我似乎无法弄清楚发生了什么。OnPaint大约每10毫秒调用一次,这会导致计算机冻结。检查CPU使用情况,此应用程序占用50% 该应用程序是一个非常简单的MFC应用程序,它写在一个文件中 // Includes are done here... class MFC_Tutorial_Window : public CFrameWnd { std::string data; public: MFC_Tutorial_Window()

我对CFrameWnd的OnPaint方法有一个问题,我似乎无法弄清楚发生了什么。OnPaint大约每10毫秒调用一次,这会导致计算机冻结。检查CPU使用情况,此应用程序占用50%

该应用程序是一个非常简单的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会被系统滥发吗?我已经盯着这段代码看了很久,就是找不到它。

必须调用CPAITDC析构函数才能重置重绘标志。您需要调用
beginPaint()
endPaint()CDC
上的code>,实际上应该更改为
CPaintDC
。更重要的是,不要调用
endPaint()都将导致重新绘制上下文。

每当消息队列中没有其他消息且窗口的更新区域(请参阅)非空时,将生成一条
WM_PAINT
消息。处理
WM_PAINT
消息时,应用程序通过调用发出信号,表示更新区域已重新绘制。未能调用
EndPaint
不会将更新区域标记为已处理,因此下次应用程序请求消息时,
WM_PAINT
是有效的候选

在MFC中,调用
BeginPaint
EndPaint
的功能封装在中。
WM_PAINT
的标准MFC消息处理程序如下所示:

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

有关使用设备上下文的更多详细信息,请访问。

非常感谢!现在很有魅力D@Pphoenix美好的很高兴我能帮忙:)看来EndPaint清除了我想画的区域。有没有办法确保绘制的区域在下次我要重新绘制之前保持不变,并且仍然保留EndPaint?@Pphoenix有一个保存更新区域的
rcPaint
成员。您可以在调用
EndPaint
后调用。但这会让你回到原来问题的状态。你能更详细地解释一下你想要达到的目标吗?@Pphoenix我误解了你的问题,我猜你指的是内容,而不是地区。为了防止擦除背景,您可以覆盖并将实现留空。无论返回0还是非零值都没有区别。请注意,您几乎总是希望使用视图类,在这种情况下,您在OnDraw中绘制图形,框架会处理导致当前问题的细节。