void CMyDialog::OnPaint()
{
CWnd* pWnd = GetDlgItem(IDC_STATIC1);
CDC* pControlDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pControlDC->SelectStockObject(BLACK_BRUSH);
pControlDC->Rectangle(0,0,10,10);
pWnd->ReleaseDC(pControlDC);
}
其中的pWnd->Invalidate();执行后,是不是马上发送消息?
为什么不把pControlDC->SelectStockObject(BLACK_BRUSH);
pControlDC->Rectangle(0,0,10,10);放在pWnd->Invalidate();的前面?
{
CWnd* pWnd = GetDlgItem(IDC_STATIC1);
CDC* pControlDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pControlDC->SelectStockObject(BLACK_BRUSH);
pControlDC->Rectangle(0,0,10,10);
pWnd->ReleaseDC(pControlDC);
}
其中的pWnd->Invalidate();执行后,是不是马上发送消息?
为什么不把pControlDC->SelectStockObject(BLACK_BRUSH);
pControlDC->Rectangle(0,0,10,10);放在pWnd->Invalidate();的前面?
解决方案 »
- 子类化CFileDialog问题。为何没有效果呢。
- 关于函数地址
- IXMLDOMNode可以强制转换成IXMLElement吗?没分了,下次一定补上!!
- 打印:debug与release版本打印效果不一致的问题
- 急!有关CArray的用法的问题!在线等一会
- CListCtrl中ICON风格,怎样设置选中和没选重两个ICON啊?
- 如何得到窗口的标题?GetWindowText(hWnd,name,255);为何得到的是程序的路径呢?
- getline为什么会失败?
- 手写体汉字归一化如何处理
- 请教几个问题:组合框,DATAGRID
- 如何实现:菜单->文件->打开中如何选中多个文件?
- 在VC中如何调用文件的默认程序,打开该文件
The region can also be validated before a WM_PAINT message occurs by the ValidateRect or ValidateRgn member function.
pControlDC->SelectStockObject(BLACK_BRUSH);
pControlDC->Rectangle(0,0,10,10);
操作?
正常的WM_PAINT是什么时候就是什么时候,Static被覆盖又被重现的时候,或者程序初始化的时候。Static的WM_PAINT在程序初始化时应该紧随在Dialog的WM_PAINT之后发生。程序启动后,Dialog界面正常地显示出来,此时WM_PAINT不再发生。而楼主的代码改变了WM_PAINT发生的顺序。
当Dialog再度被拖到屏蔽以外并拉回来或者被其它窗口覆盖并重新显示的时候,Dialog的WM_PAINT发生,但由于代码中有pWnd->UpdateWindow()这句,所以同时也必然导致Static的WM_PAINT发生。/*
在上面的例子中,有没有执行
pControlDC->SelectStockObject(BLACK_BRUSH);
pControlDC->Rectangle(0,0,10,10);
操作?
*/
当然执行了,而且每次Dialog的WM_PAINT发生时,都会执行一遍(其实不应该这样)。总结:
楼主的代码有点乱,事实上,不应该在Dialog的OnPaint中去Paint Static。如果想实现代码中现在的效果,应该处理Static的WM_PAINT,也就是重写Static的OnPaint,而不是在Dialog的OnPaint中做。对于楼主的代码,有一个事实,在Dialog的每一次WM_PAINT中,无论Static是否需要paint,都向Static发出了WM_PAINT。这是不正常的。说的有点乱,但楼主仔细想想应该能想明白。主要的问题是弄清Dialog的WM_PAINT和Static的WM_PAINT在什么时候发生。如果去掉pWnd->UpdateWindow(),在启动时之所以画不出小方块,是因为在Dialog的WM_PAINT发生后,Static的WM_PAINT会覆盖Dialog的paint的结果。