视图的ONPAINT 问题 谢谢!

antsmoving 2008-10-22 06:25:08
我在视图类中有段代码 改变图标信息的坐标变量,然后发送消息SengMessage(WM_PAIN,0,0);
我在OnPaint函数中加了Beep,运行时发出了声音,但图标的位置在界面上没有改变,但是,当最小化后在恢复这样的时候,图标的位置发生改变,另外如果不发送消息,直接Invalidate(),图标位置的改变也能显现出来。

程序中
void CSCNView::OnDraw(CDC* pDC)
{
// TODO: 在此添加专用代码和/或调用基类

//CPaintDC dc(this);
//COLORREF crMask = RGB(0x00,0x00,0xff);

}

请问是什么原因?如何解决 ? 谢谢!
...全文
131 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jyh_baoding 2008-10-23
  • 打赏
  • 举报
回复
可能是消息传递的问题,发送消息没有起作用或失败
ok1234567 2008-10-23
  • 打赏
  • 举报
回复
在SengMessage(WM_PAIN,0,0); 之前,要先Invalidate或者InvalidateRect,使界面无效,OnPaint() 只重绘无效的区域
菜牛 2008-10-23
  • 打赏
  • 举报
回复
The WM_PAINT message is generated by the system and should not be sent by an application.

为什么不应该自己发送WM_PAINT消息呢,因为系统在发送WM_PAINT消息的时候还要设置剪裁区域,然后程序通过BeginPaint函数来获取这个剪裁区域,MFC中的CPaintDC构造函数调用了BeginPaint函数。否则,剪裁区域就是空的,所有用CPaintDC(或者用BeginPaint函数获取的HDC)的绘制内容都会被GDI优化掉。因此,要刷新就用InvalidateRect等函数而不要自己发送WM_PAINT消息。
zzz822163 2008-10-23
  • 打赏
  • 举报
回复
或者你使用InvalidateRect 看看,指定需要重绘的区域
zzz822163 2008-10-23
  • 打赏
  • 举报
回复
那你发送消息想要的作用不就是Invalidate吗
antsmoving 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zzz822163 的回复:]
最小化后在恢复这样的时候,图标的位置发生改变,另外如果不发送消息,直接Invalidate(),图标位置的改变也能显现出来。
---------------------
这两个操作都产生了无效区域,所以能够成功,我看你还是直接Invalidate好了,
[/Quote]

那样的话 东西多了 闪屏阿
而且代码执行的次数很多 受不了阿
zzz822163 2008-10-22
  • 打赏
  • 举报
回复
PostMessage和SengMessage都是一样的发消息,没指定无效区域,结果当然一样了
zzz822163 2008-10-22
  • 打赏
  • 举报
回复
最小化后在恢复这样的时候,图标的位置发生改变,另外如果不发送消息,直接Invalidate(),图标位置的改变也能显现出来。
---------------------
这两个操作都产生了无效区域,所以能够成功,我看你还是直接Invalidate好了,
antsmoving 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dirdirdir3 的回复:]
PostMessage试试
[/Quote]
试过了
没有变化啊
zzz822163 2008-10-22
  • 打赏
  • 举报
回复
而Invalidate就是使区域无效,所以能够实现目的
zzz822163 2008-10-22
  • 打赏
  • 举报
回复
错了,是加上上面两个函数,
zzz822163 2008-10-22
  • 打赏
  • 举报
回复
Invalidate();
UpdateWindow();
我觉得可能需要在OnPaint中加上上面两个区域,因为OnPaint只更新无效区域,而你根本就没指定无效区域,所以他图象没变.
不知道你懂没懂我的意思.
antsmoving 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zzz822163 的回复:]
不对,没看到Invalidate可以实现,
OnDraw被调用了没,是不是没更新
[/Quote]

我画图代码都在OnPaint中,OnDraw中没有作图代码 还是要调用基类的OnDraw 么 ?
zzz822163 2008-10-22
  • 打赏
  • 举报
回复
不对,没看到Invalidate可以实现,
OnDraw被调用了没,是不是没更新
antsmoving 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zzz822163 的回复:]
OnDraw没有响应消息的功能,如果你重载了OnPaint,要调用基类OnPaint,OnDraw才会被响应
[/Quote]

我重画的代码都在onpaint里面阿
antsmoving 2008-10-22
  • 打赏
  • 举报
回复

void CSCNView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CFormView::OnPaint() ( (CMainFrame*)GetParentFrame() )->tree.viewhwnd = this->m_hWnd;

CFormView::OnPaint();
OnDraw( &dc );

Beep(1000,100);

COLORREF crMask = RGB(0x00,0x00,0xff);

for ( int i=0; i<icons.size(); ++i ){ //bmptar.LoadBitmap(IDB_BITMAP1);
BITMAP bm;

switch ( icons[i].type ){
case 0: bmptar.GetBitmap(&bm); break;
case 1: bmprad.GetBitmap(&bm); break;
case 2: bmpmis.GetBitmap(&bm); break;
}

int nWidth = bm.bmWidth;
int nHeight = bm.bmHeight;
CDC ImageDC;
ImageDC.CreateCompatibleDC(&dc);
CBitmap *pOldImageBMP;

switch ( icons[i].type ){
case 0: pOldImageBMP = ImageDC.SelectObject(&bmptar); break;
case 1: pOldImageBMP = ImageDC.SelectObject(&bmprad); break;
case 2: pOldImageBMP = ImageDC.SelectObject(&bmpmis); break;
}


TransparentBlt(dc.m_hDC,icons[i].x -nWidth/2,icons[i].y -nHeight/2,nWidth,nHeight,ImageDC.m_hDC,0,0,nWidth,nHeight,crMask);

ImageDC.SelectObject(pOldImageBMP);
}
}
zzz822163 2008-10-22
  • 打赏
  • 举报
回复
OnDraw没有响应消息的功能,如果你重载了OnPaint,要调用基类OnPaint,OnDraw才会被响应
zzz822163 2008-10-22
  • 打赏
  • 举报
回复
OnPaint()怎么写的?
dirdirdir3 2008-10-22
  • 打赏
  • 举报
回复
PostMessage试试

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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