为什么系统执行了OnPaint过程却不显示出来。

lebor 2005-01-05 10:15:06
这样一段程序,鼠标按下,在对话框上画一个不同颜色的方块,抬起恢复。

鼠标按下后方块绘制过程也执行了,但是没有画到屏幕上,方块颜色没变。是何缘故, 请求指点。

为什么PAINT执行却不被应用到屏幕上。

void CMoeventDlg::OnPaint()
{

CPaintDC dc(this); // device context for painting
if(mouse_on)
dc.FillSolidRect(0,0,30,30,RGB(123,121,12));
else
dc.FillSolidRect(0,0,30,30,RGB(0,121,200));
CDialog::OnPaint();

}

void CMoeventDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
mouse_on=true;
SendMessage(WM_PAINT);
CDialog::OnLButtonDown(nFlags, point);
}

void CMoeventDlg::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
mouse_on=false;
SendMessage(WM_PAINT);
CDialog::OnRButtonUp(nFlags, point);
}

...全文
473 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamzxx 2005-01-06
  • 打赏
  • 举报
回复
嗯,一样的问题以前遇到也没仔细去想,
fanqing 2005-01-06
  • 打赏
  • 举报
回复

SendMessage(WM_PAINT);
UpdateWindow();//只有出现更新区域此函数才有效果
不行.
fanqing 2005-01-06
  • 打赏
  • 举报
回复
楼主我试过了

Invalidate(TRUE);
UpdateWindow();



RedrawWindow();
作用是相同.
fingerfox 2005-01-06
  • 打赏
  • 举报
回复
去掉 CDialog::OnPaint();
I_Love_CPP 2005-01-06
  • 打赏
  • 举报
回复
我也仔细研究了一下,有如下结论:
1、MFC的Invalidate()和InvalidateRect()都是调用的
WIN API: InvalidateRect().
2.
使用InvalidateRect(..)可以触发WM_PAINT,但系统并不立即重绘
(这是因为WM_PAINT的2个特性:low priority、
Windows combines multiple WM_PAINT messages in the message queue
into a single message. )
3.
如果想立即重绘,那么就需要调用UpdateWindow();
4.
InvalidateRect(true,...,NULL)
UpdateWindow();

RedrawWindow(..);
等价。
5.
这是最重要的,本帖的关键:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/pantdraw_88ac.asp

The WM_PAINT message is generated by the system and should not be sent by an application.
linfeng1216 2005-01-05
  • 打赏
  • 举报
回复
同意
chuanke 2005-01-05
  • 打赏
  • 举报
回复
InvalidateRect(rect,FALSE);
chuanke 2005-01-05
  • 打赏
  • 举报
回复
还有我觉得用InvalidateRect(FALSE);更好,如果说错了当我没说,出现这个现象,可以肯定地是被“刷”掉了
chuanke 2005-01-05
  • 打赏
  • 举报
回复
UpdateWindow();//为什么它同样触发了OnPaint函数,为什么也不行?
RedrawWindow();//它比上面的UpdateWindow多做了什么?为什么它能行?

我的理解:UpdateWindow是对整个窗口的全部进行绘画比如包括系统菜单等,而RedrawWindow去不包含系统菜单的绘画
老夏Max 2005-01-05
  • 打赏
  • 举报
回复
如果有高手为我们解释一下以下调用详细过程最好了:
SendMessage(WM_PAINT);//是不是应该有后面的两个参数wParam和lParam?怎么设置这两个参数?
UpdateWindow();//为什么它同样触发了OnPaint函数,为什么也不行?
RedrawWindow();//它比上面的UpdateWindow多做了什么?为什么它能行?
老夏Max 2005-01-05
  • 打赏
  • 举报
回复
仔细研究了一下。MSDN上说WM_PAINT会被UpdateWindow或者RedrawWindow引起,其处理一般为BeginPaint和EndPaint等等,就是重画。但是使用楼主的程序Debug也可以明显的看到它调用了OnPaint函数,但是就是没有改变。测试了一下,使用UpdateWindow代替SendMessage(WM_PAINT);同样可以触发OnPiant函数,但是效果一样没有改变;使用RedrawWindow代替SendMessage(WM_PAINT);就可以看到改变了,为什么?Invalidate确实也能更新。
oyljerry 2005-01-05
  • 打赏
  • 举报
回复
用Invalidate(FALSE);刷新
fanqing 2005-01-05
  • 打赏
  • 举报
回复
你光在按钮中设置变量有什么用啊(不会启动画图)!设置了变量后你要呼叫程序画才有用吗?(设置无效区域或发送消息画图)
HunterForPig 2005-01-05
  • 打赏
  • 举报
回复
用Invalidate(FALSE)来触发wm_pain消息
老夏Max 2005-01-05
  • 打赏
  • 举报
回复
SendMessage(WM_PAINT);=>Invalidate(FALSE);
老夏Max 2005-01-05
  • 打赏
  • 举报
回复
OnLButtonDown?
OnRButtonUp?
DentistryDoctor 2005-01-05
  • 打赏
  • 举报
回复
不要调用
CDialog::OnPaint();
SendMessage(WM_PAINT);=>Invalidate(FALSE);
快乐鹦鹉 2005-01-05
  • 打赏
  • 举报
回复
void CMoeventDlg::OnPaint()
{

CPaintDC dc(this); // device context for painting
if(mouse_on)
dc.FillSolidRect(0,0,30,30,RGB(123,121,12));
else
dc.FillSolidRect(0,0,30,30,RGB(0,121,200));
CDialog::OnPaint();

}
这段函数不行吧。虽然你前面调用了dc的绘制函数。但是,CDialog::OnPaint()将把你前面绘制的内容又刷掉的
Mr-Chen 2005-01-05
  • 打赏
  • 举报
回复
使用Invalidate(FALSE);
chuanke 2005-01-05
  • 打赏
  • 举报
回复
代码:
头文件中:bool mouse_on;
构造函数中mouse_on = false;


void CMoeventDlg::OnPaint()
{

CClientDC dc(this); // device context for painting
if(!mouse_on)
dc.FillSolidRect(10,10,30,30,RGB(123,121,12));
else
dc.FillSolidRect(0,0,30,30,RGB(0,121,200));
CDialog::OnPaint();

}

void CMoeventDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
mouse_on=true;
SendMessage(WM_PAINT);
CDialog::OnLButtonDown(nFlags, point);
}

void CMoeventDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
mouse_on=false;
SendMessage(WM_PAINT);
CDialog::OnRButtonUp(nFlags, point);
}
加载更多回复(7)

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧