在一个Dialog的OnPaint按照下面的方法实现:
void CMyDialog::OnPaint()
{
CWnd* pWnd = GetDlgItem(IDC_STATIC1);
CDC* pDC = pWnd->GetDC();
pWnd->Invalidate(); //??????????
pWnd->UpdateWindow(); //????????????
pDC->SelectStockObject(BLACK_BRUSH);
pDC->Rectangle(0,0,10,10);
pWnd->ReleaseDC(pDC);
}按照MSDN上的说明,通过UpdateWindow会向窗口发送WM_PAINT的消息,
那么相应改消息的时候是否又会调用OnPaint函数呢?上面这段函数执行的顺序到底是怎么样的呢?
void CMyDialog::OnPaint()
{
CWnd* pWnd = GetDlgItem(IDC_STATIC1);
CDC* pDC = pWnd->GetDC();
pWnd->Invalidate(); //??????????
pWnd->UpdateWindow(); //????????????
pDC->SelectStockObject(BLACK_BRUSH);
pDC->Rectangle(0,0,10,10);
pWnd->ReleaseDC(pDC);
}按照MSDN上的说明,通过UpdateWindow会向窗口发送WM_PAINT的消息,
那么相应改消息的时候是否又会调用OnPaint函数呢?上面这段函数执行的顺序到底是怎么样的呢?
但是,如何做到呢?
想知道一个真真的过程
但是,UpdateWindow让窗口及时处理WM_PAINT消息,
这时窗口是否又一次调用OnPaint函数呢?
如果是,这不就是一个死循环。另外,对话框的窗口,负责自己以及它所包含的控件的绘制。
pDC->SelectStockObject(BLACK_BRUSH);
pDC->Rectangle(0,0,10,10);
pWnd->ReleaseDC(pDC);
对某个空件的特别定制又是如何反映到对话框中的。对这些函数调用的过程,已经消息的处理过程不是太清除。
因为,的确对WINDOWS不是太了解。
如果是这样,就存在一个逻辑上的死循环。
这对系统可是比较大的负担的哦
OnPaint执行后会清空无效区域,直到下一次窗口状态改变或者Invalidate/InvalidateRect之类的函数设置新的无效区域。
TRACE("On Paint\n"),然后调试却没有看到不断的打印信息
摆脱各位了。
不设置断点,直接f5进入调试状态,用afxDump输出到Output窗口,看到不停的有信息输出
谢谢
Invalidate同样。
上面代码调窗口的IDC_STATIC1控件重画。也就是执行IDC_STATIC1对应的静态空间的OnPaint函数。
你可以试试在OnPaint前声明一个全局变量:
int xTime = 0;
OnPaint里边
xTime ++;然后重载OnCancel,加入下面代码:
CString str;
str.Format("OnPaint ran %d times!", xTime);
AfxMessageBox(str);CDialog::OnCancel();
1、dialog处理WM_PAINT消息,即调用OnPaint
2、在该函数中,为了对IDC_STATIC进行特殊的定制,通过pWnd->UpdateWindow由向dialog发送了WM_PAINT消息
3、在OnPaint函数中,在调用pWnd->UpdateWindow后,继续完成函数的下面处理
pDC->SelectStockObject(BLACK_BRUSH);
pDC->Rectangle(0,0,10,10);
pWnd->ReleaseDC(pDC);
这些处理完成对IDC_STATIC的定制(画了一个黑色的矩形)
4、当刚才发送的WM_PAINT到达dialog后,由于它消息的属主是IDC_STATIC空件,那么IDC_STATIC空件将会重画一次,而这次画出的东西,则是由
pDC->SelectStockObject(BLACK_BRUSH);
pDC->Rectangle(0,0,10,10);
pWnd->ReleaseDC(pDC);
所定制的内容上面是我自己凭个人推测的,由于对WINDOWS不是太熟悉,请大家给意见。
CWnd* pWnd = GetDlgItem(IDC_STATIC1);
CDC* pDC = pWnd->GetDC();
pWnd->Invalidate(); //??????????
pWnd->UpdateWindow(); //????????????不是针对对话框的,而是针对控件发的。
1、dialog处理自己的WM_PAINT消息,然后调用OnPaint
2、在该函数中,为了刷新IDC_STATIC状态,通过pWnd->UpdateWindow由向dialog发送了WM_PAINT消息
3、在OnPaint函数中,在调用pWnd->UpdateWindow后,继续完成函数的下面处理
pDC->SelectStockObject(BLACK_BRUSH);
pDC->Rectangle(0,0,10,10);
pWnd->ReleaseDC(pDC);
这些处理完成对IDC_STATIC的定制(画了一个黑色的矩形)
4、当刚才发送的WM_PAINT到达dialog后,由于它消息的属主是IDC_STATIC空件,那么IDC_STATIC空件将会重画一次,而这次画出的东西,并不是则是由
pDC->SelectStockObject(BLACK_BRUSH);
pDC->Rectangle(0,0,10,10);
pWnd->ReleaseDC(pDC);
所定制的内容
不知道其它同志还有别的意见不?
刷新的是子窗口。