• 全部
...

WM_ERASEBKGND的返回值

sdchenchen2012 2012-11-26 09:56:26
WM_ERASEBKGND的返回值:
Return value
Type: LRESULT
An application should return nonzero if it erases the background; otherwise, it should return zero.





根据msdn的资料,无论改成return 1或者return 0,只要移动窗口,就导致画图的的乱七八糟的。

貌似返回值不管用啊.

问题2:wm_erasebkgnd什么什么情况下使用??


case WM_ERASEBKGND:
{
int j=2;


j++;
return 1; //return 0
}
break;

case WM_PAINT:
{

hdc = BeginPaint (hwnd, &ps) ;
SelectObject(hdc,GetStockObject(GRAY_BRUSH));

for (i = 0 ; i < 10 ; i++)
{
apt[i].x = cxClient * aptFigure[i].x / 200 ;
apt[i].y = cyClient * aptFigure[i].y / 100 ;
}

SetPolyFillMode(hdc,ALTERNATE);

Polygon(hdc,apt,sizeof(apt)/sizeof(POINT));

EndPaint (hwnd, &ps) ;

return 0 ;
}
break;
...全文
给本帖投票
402 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
c1sdn20003 2012-11-27
  • 打赏
  • 举报
回复
引用 11 楼 gfm688 的回复:
引用 10 楼 sdchenchen2012 的回复:刚试了,无论WM_ERASEBKGND返回0还是1,DefWindowProc处理WM_PAINT时都不会画背景的 方便贴你的关键代码吗 没什么特别的代码,就是那个经典的Hello World窗口程序代码,然后直接在WM_ERASEBKGND返回0 如果WM_ERASEBKGND返回1,MSDN说得很清楚,是……
msdn自己都没搞清楚吧 wm_erasebkgnd这个消息出现在wm_paint之前,可以设置断点调试。 无论什么返回值都是如此。 wm_erasebkgnd有时候出现,有时候不出现。 正如其名一样,需要擦除背景时候才出现, 或者手动让其出现。 当由调用者来处理的话,最好是 ,重新填充背景,否则导致画面花了。 如果让wm_paint来用函数填充背景, 过于频繁。 没必要过于频繁。 wm_erasebkgnd交给defwindproc,也会擦出背景, 如何擦出不得而知。 可以spy++观察,这个消息会产生
gfm688 2012-11-27
  • 打赏
  • 举报
回复
引用 10 楼 sdchenchen2012 的回复:
刚试了,无论WM_ERASEBKGND返回0还是1,DefWindowProc处理WM_PAINT时都不会画背景的 方便贴你的关键代码吗
没什么特别的代码,就是那个经典的Hello World窗口程序代码,然后直接在WM_ERASEBKGND返回0 如果WM_ERASEBKGND返回1,MSDN说得很清楚,是需要程序员自己擦背景的:
引用
An application should return nonzero in response to WM_ERASEBKGND if it processes the message and erases the background;
如果WM_ERASEBKGND返回0,MSDN只是说PAINTSTRUCT结构的fErase将会是TRUE; 那么DefWindowProc处理WM_PAINT时会不会根据fErase来决定用不用hbrBackground刷背景呢?经测试,是不会的。结论就是WM_ERASEBKGND返回0和1的区别只在于PAINTSTRUCT结构的fErase会是TRUE还是FALSE
bsnry 2012-11-27
  • 打赏
  • 举报
回复
引用 17 楼 GLSC_CENA 的回复:
引用 12 楼 c1sdn20003 的回复:引用 11 楼 gfm688 的回复:引用 10 楼 sdchenchen2012 的回复:刚试了,无论WM_ERASEBKGND返回0还是1,DefWindowProc处理WM_PAINT时都不会画背景的 方便贴你的关键代码吗 没什么特别的代码,就是那个经典的Hello World窗口程序代码,然后直接在WM_ERA……
http://www.gamedev.net/topic/42135-meet-trouble-with-psferase-and-petzold/ 程序擦出 当刷子为空,那么创建的时候,否则系统没刷子,不会擦 我们要做是: mfc内部有了刷子,就导致不为空, 自然是默认由系统擦出。 如果你想擦出: 必须返回1, 否则影响paitnstruct的标识为true. 当标识为true的时候,谁来擦? 没有资料说明这一点。你擦?系统擦? 不知道 表示为true的时候, 就很可能导致闪烁,不管谁来擦出,反正是闪了。 有人就提出,闪烁,说明wm_erasebkgnd被调用, 所以避免它被多次调用,return 1出现了。 既然避免多次被调用,自然填充背景的代码只能往wm_paint里移了。
这个娜戒海了 2012-11-27
  • 打赏
  • 举报
回复
引用 12 楼 c1sdn20003 的回复:
引用 11 楼 gfm688 的回复:引用 10 楼 sdchenchen2012 的回复:刚试了,无论WM_ERASEBKGND返回0还是1,DefWindowProc处理WM_PAINT时都不会画背景的 方便贴你的关键代码吗 没什么特别的代码,就是那个经典的Hello World窗口程序代码,然后直接在WM_ERASEBKGND返回0 如果WM_ERASEB……
同意这个 ERASEBKGROUND是先于ON_PAINT而产生的,也就是说,系统在绘制的时候,先画背景这一层, 再画PAINT这一层 一般情况下,通过调用INVALIDATE,INVALIDATE(TRUE或FALSE)可以导致背景重绘
这个娜戒海了 2012-11-27
  • 打赏
  • 举报
回复
小哥,你又新开帖了啊,那个帖子结了先 为了研究背景的东西,还真不容易
c1sdn20003 2012-11-27
  • 打赏
  • 举报
回复
引用 14 楼 gfm688 的回复:
引用 13 楼 c1sdn20003 的回复:可见返回值是左右不了结果的, 差异可能就是一个规范问题了。 除了规范问题,还会影响PAINTSTRUCT结构的fErase的,MSDN也说了
影响这个值无意义的。 特意看了不少文章,讲解为什么有时候绘图会闪烁, 五花八门的方法,wm_erasebkgnd返回0 的也有,返回1的也有。 在wm_erasebkgnd里绘制背景色的也有。 无一个标准答案。
gfm688 2012-11-27
  • 打赏
  • 举报
回复
引用 13 楼 c1sdn20003 的回复:
可见返回值是左右不了结果的, 差异可能就是一个规范问题了。
除了规范问题,还会影响PAINTSTRUCT结构的fErase的,MSDN也说了
c1sdn20003 2012-11-27
  • 打赏
  • 举报
回复
引用 11 楼 gfm688 的回复:
引用 10 楼 sdchenchen2012 的回复:刚试了,无论WM_ERASEBKGND返回0还是1,DefWindowProc处理WM_PAINT时都不会画背景的 方便贴你的关键代码吗 没什么特别的代码,就是那个经典的Hello World窗口程序代码,然后直接在WM_ERASEBKGND返回0 如果WM_ERASEBKGND返回1,MSDN说得很清楚,是……
afx_msg BOOL OnEraseBkgnd( CDC* pDC ); Parameters pDC Specifies the device-context object. Return Value Nonzero if it erases the background; otherwise 0. 这个是mfc里的, 意思:如果你擦出,那么就通过返回值告诉系统。 返回值只是一个告诉的方式,仅此而已。 并没有说,通过返回值来所谓擦出。 可见返回值是左右不了结果的, 差异可能就是一个规范问题了。 结论:如果调用了填充界面的函数,就返回1, 否则返回0.
sdchenchen2012 2012-11-26
  • 打赏
  • 举报
回复
引用 9 楼 gfm688 的回复:
引用 4 楼 gfm688 的回复:注意只是marked,DefWindowProc处理WM_PAINT时才会画背景,由于你自己处理WM_PAINT了,所以背景需要自己画 刚试了,无论WM_ERASEBKGND返回0还是1,DefWindowProc处理WM_PAINT时都不会画背景的 总之,你不让DefWindowProc处理WM_ERASEBKGND或WNDCLA……
是的, 一旦程序要处理这个消息,但处理这个消息的代码不是fillrect之类的, 那么就容易导致画面很糟糕的, 这个时候,其实无论返回什么值的。都是如此。 这个可以试验得出。 刚试了,无论WM_ERASEBKGND返回0还是1,DefWindowProc处理WM_PAINT时都不会画背景的 方便贴你的关键代码吗,
gfm688 2012-11-26
  • 打赏
  • 举报
回复
当然,我一直强调在不让DefWindowProc处理WM_ERASEBKGND或WNDCLASS结构的hbrBackground为NULL的情况下,否则DefWindowProc擦了背景,程序员再自己擦背景就会造成闪烁
gfm688 2012-11-26
  • 打赏
  • 举报
回复
因为你自己处理WM_PAINT了,所以无论0还是1都需要程序员自己擦背景
sdchenchen2012 2012-11-26
  • 打赏
  • 举报
回复
引用 4 楼 gfm688 的回复:
在不让DefWindowProc处理WM_ERASEBKGND或WNDCLASS结构的hbrBackground为NULL的情况下: return 1 则是不画背景,即透明了;这种透明不像分层窗口那种透明,移动窗口不会刷新背景,就导致画图乱七八糟的了。 return 0 需要在WM_PAINT里画背景,否则也是透明 引用If the application re……
是否说反了? 1:擦出背景,需要程序员自己擦背景 0:不擦背景,但是windows将其标记为已经擦出背景了。
sdchenchen2012 2012-11-26
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
“An application should return nonzero if it erases the background; otherwise, it should return zero.” 如果擦除了 背景 返回 1,否则 返回 0。 返回 1 时 你要擦除背景 才行。 你现在是 根本 不 擦除 背景。 那个 1,0 只是 告诉 系统 有没有 擦……
schlafenhamster gfm688 两位老师的答案矛盾啊 return 1 则是不画背景,即透明了;这种透明不像分层窗口那种透明,移动窗口会背景不会刷新背景,就导致画图乱七八糟的了。 return 0 需要在WM_PAINT里画背景,否则也是透明 ??
gfm688 2012-11-26
  • 打赏
  • 举报
回复
在不让DefWindowProc处理WM_ERASEBKGND或WNDCLASS结构的hbrBackground为NULL的情况下: return 1 则是不画背景,即透明了;这种透明不像分层窗口那种透明,移动窗口不会刷新背景,就导致画图乱七八糟的了。 return 0 需要在WM_PAINT里画背景,否则也是透明
引用
If the application returns zero, the window will remain marked for erasing. (Typically, this indicates that the fErase member of the PAINTSTRUCT structure will be TRUE.)
注意只是marked,DefWindowProc处理WM_PAINT时才会画背景,由于你自己处理WM_PAINT了,所以背景需要自己画
schlafenhamster 2012-11-26
  • 打赏
  • 举报
回复
“An application should return nonzero if it erases the background; otherwise, it should return zero.” 如果擦除了 背景 返回 1,否则 返回 0。 返回 1 时 你要擦除背景 才行。 你现在是 根本 不 擦除 背景。 那个 1,0 只是 告诉 系统 有没有 擦除, 系统不管你 是不是 真正擦除了 没有。
gfm688 2012-11-26
  • 打赏
  • 举报
回复
在不让DefWindowProc处理WM_ERASEBKGND或WNDCLASS结构的hbrBackground为NULL的情况下: return 1 则是不画背景,即透明了;这种透明不像分层窗口那种透明,移动窗口会背景不会刷新背景,就导致画图乱七八糟的了。 return 0 需要在WM_PAINT里画背景,否则也是透明
引用
If the application returns zero, the window will remain marked for erasing. (Typically, this indicates that the fErase member of the PAINTSTRUCT structure will be TRUE.)
.
hdg3707 2012-11-26
  • 打赏
  • 举报
回复
返回0时你移动窗口后界面就会变得乱七八糟的,这说明没有自动刷新界面,如果你返回1,移动窗口后界面就会自动刷新,界面不会乱七八糟的
gfm688 2012-11-26
  • 打赏
  • 举报
回复
引用 4 楼 gfm688 的回复:
注意只是marked,DefWindowProc处理WM_PAINT时才会画背景,由于你自己处理WM_PAINT了,所以背景需要自己画
刚试了,无论WM_ERASEBKGND返回0还是1,DefWindowProc处理WM_PAINT时都不会画背景的 总之,你不让DefWindowProc处理WM_ERASEBKGND或WNDCLASS结构的hbrBackground为NULL就需要程序员自己擦背景了

16,548

社区成员

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

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

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

手机看
关注公众号

关注公众号

客服 返回
顶部