none
关于GDI绘图闪烁的三个问题 RRS feed

  • 问题

  • 各位好,

    系统:wince 5.0( x86), wince 5.0 emulator( x86 based),

    开发环境:Visual Studio 2008,xp sp3,x86. MFC SDI程序,框架由MFC产生。

    有两个奇怪的问题,

    1. 很简单的双缓冲绘图问题,只在OnDraw中绘图。实际wince设备执行pDC->BitBlt(,,,,,memDC,...) 时会闪烁一下,如果动态绘图,比如定时器中Invalidate(FALSE),那么闪烁的频率与定时器频率表相同。

    但是同一个程序在emulator一点都不闪烁。而且我写了一个类似的win32程序,也是一点都不闪烁。

    请问可能的原因在哪里?如何解决?

    PS:当我把双缓冲绘图移到OnEraseBkgnd(返回true),让这个函数绘背景图时,在OnDraw中直接用pDC 画直线。我设法trigger OnEraseBkgnd,比如点击顶层菜单然后释放,好像也没看到闪烁。

    2. 当我点击SDI的顶层菜单时,如果我就点击以下,那么在我释放之前(也就是在我在其他地方点击之前),OnEraseBkgnd, OnDraw都不会触发(除非我程序中通过消息等技巧动态触发),可是这时候不能完全擦除以前的直线(OnDraw中,代码如下)。但是能准确定位到以前的直线,会留下一些斑斑点点。注意:弹出的下拉菜单并没有遮住任何直线。为什么?(如果我不点击菜单,那么程序能完美的擦除掉旧线,并画出新线)

    OnDraw

    {

    SetROP2(R2_NOTXORPEN);

    if (旧线存在)

    pDC->MoveTo, LineTo(以前旧线起点终点)  //无论是否点击菜单,都能准确找到

    //画新线

    pDC->MoveTo,LineTO(新线), 记录,旧线存在标志置位

    }

    3. 如果我背景花花绿绿,我应该用什么办法擦除旧线画出新线,SetROP2的参数我挨个试了,也不好使。症状是空白地方能完全擦除掉,但是有图片覆盖的地方就会画出两条线(实际上一条应该是旧线)。

    我也试了画旧线时SetROP2(R2_NotXXX),画新线时SetROP2(R2_XXX)。也是不好使。

    谁能给我一些建议意见,先谢谢了。

    fang

    2012年11月12日 2:34

答案

  • 1、关于绘图,模拟器采用的是操作系统的机制,真机才是最可信的,不知道你怎么处理OnEraseBkgnd的,这里应该只返回true,这样应该没有闪烁

    2、这个问题不太好分析,感觉可能和你所谓的擦出机制有关

    3、SetROP2其实不是为了擦除背景而设计的,只是为了擦出痕迹,同时避免大面积更新,一般用于trace的设计,如果你想擦除绘制背景应该用背景色重新绘制欲擦除区域


    新浪微博http://weibo.com/xianglitian,欢迎围观

    2012年11月13日 15:36

全部回复

  • 顶一记!  猜测是WM_绘制 的问题....

    Please not forget mark your answer, and unmark your disagreed point.

    2012年11月13日 9:30
  • 1、关于绘图,模拟器采用的是操作系统的机制,真机才是最可信的,不知道你怎么处理OnEraseBkgnd的,这里应该只返回true,这样应该没有闪烁

    2、这个问题不太好分析,感觉可能和你所谓的擦出机制有关

    3、SetROP2其实不是为了擦除背景而设计的,只是为了擦出痕迹,同时避免大面积更新,一般用于trace的设计,如果你想擦除绘制背景应该用背景色重新绘制欲擦除区域


    新浪微博http://weibo.com/xianglitian,欢迎围观

    2012年11月13日 15:36