今天还是继续昨天的事情:自己堆砌MFC。我在WM_PAINT的消息响应函数OnPaint()里面调用DC去drawtext,可是发现他老是重绘。于是找原因,原来是这样的:我用的是:
CRect rect;
GetClientRect(&rect);
CPaintDC myDC(this);// 这里不能用CClientDC,只有CPaintDC才能把WM_PAINT消息从消息联里面删除,否则用CClientDC会不断重绘
myDC.DrawText(_T("nice to meet you"),&rect,DT_SINGLELINE| DT_CENTER|DT_VCENTER);
//MessageBoxW(_T("hao la"),_T("my lover"),MB_OK|MB_YESNOCANCEL|MB_DEFBUTTON3);// MB_DEFBUTTON3用来指定第几个按钮为默认按钮
GetClientRect(&rect);
CPaintDC myDC(this);// 这里不能用CClientDC,只有CPaintDC才能把WM_PAINT消息从消息联里面删除,否则用CClientDC会不断重绘
myDC.DrawText(_T("nice to meet you"),&rect,DT_SINGLELINE| DT_CENTER|DT_VCENTER);
//MessageBoxW(_T("hao la"),_T("my lover"),MB_OK|MB_YESNOCANCEL|MB_DEFBUTTON3);// MB_DEFBUTTON3用来指定第几个按钮为默认按钮
而这里要用CPaintDC,原因上面代码的注释里面已经说了,但是为什么只有
CPaintDC才能把消息从消息队列里面删除呢?其实准确的来说,从消息队列里面删除该消息的说法是不正确的,真正的原因在下面:
CPaintDC的构造函数中调用BeginPaint获得客户区重绘的DC,析构函数中调用EndPaint。这样就明白了吧,呵呵。在响应WM_PAINT消息时应调用或间接调用BeginPaint、EndPaint函数,使窗口变为“