简单描述:
我自己写了一个简单的绘图程序,OnDraw里面显示一张位图怎么才能达到这样的效果:另外的无关窗口(比如word窗口等)覆盖了我写的程序的窗口而我写的程序不产生重绘,也就是我的程序被覆盖的时候我不想去重绘我的程序界面,觉得没重绘的必要。谢谢。

解决方案 »

  1.   

    这非常简单:
    头文件里:
    BOOL m_HaveRefresh;
    CPP文件初始化函数里:
    m_HaveRefresh=FALSE;
    if(!m_HaveRefresh)
    {
    m_HaveRefresh=TRUE;
    绘图
    }
    这样就不会重绘了,但这样可能会有问题,你试试就知道会有什么问题
      

  2.   

    GetForegroundWindow判断一下是否绘图主窗口
    或者GetUpdateRect判断一下和图片的Rect是否有交集
      

  3.   

    先表示感谢,,可能我表述不是很清楚,我想的效果是另外窗口覆盖了我的窗口,我的窗口不要重绘,也就是里面的图像一直是保持的,也就是自始至终不会有WM_PAINT消息,
      

  4.   

    非常规搞法,白花时间,建议改变思路触发WM_PANIT的地方太多了.你必须要响应它,才能在窗口内容被破坏时保持你自己的样式.比较常规的作法是 dc的GetClipRect 只取出需要绘制的剪切区,只部分重绘,例如一个小窗口在你的大窗口上拖动.
      

  5.   


    谢谢提供思路。我不是说不处理WM_PAINT消息了,别的触发WM_PAINT的消息还是处理,只是想窗口被覆盖的时候不去触发WM_PAINT消息。
      

  6.   


    在WM_PAINT里绘图前拦截掉不行么?
    不明白问什么要这样搞?
      

  7.   

    你的窗口被其它窗口挡住的时候会不停的收到WM_PAINT消息?
      

  8.   


    你好,谢谢解答。
    透明窗口覆盖另一个窗口的情况下,不管怎么覆盖,被覆盖的窗口是不会有无效区域的,也不会有WM_PAINT消息的产生,被覆盖窗口的图形一直被保持,就是现在是一般的普通窗口,能不能有一种方法可以达到这样的效果。
      

  9.   

    HWND desWnd = ::GetDesktopWindow();
    HWND topWnd = ::GetTopWindow(desWnd);
    if(topWnd == this->m_hWnd)
    {
       //说明自己在顶层
    }
    else
    {
        //被覆盖  设置不重绘
    }
      

  10.   


    thanks,
    请问怎么 设置不重绘 当用其他窗口覆盖我的程序窗口再移开,可以保证我的程序窗口的图形是一直保持的而不是重绘来的?
      

  11.   

    类似这样的效果是我期望的,移动窗口的时候,我的图形是一直保持之前的,不是OnDraw重绘而来,就是当有窗口在我的程序窗口上移动时有重绘发生,并不一定是透明窗口,我只是举例移动窗口我的程序窗口会重绘,如果是这样就就不是我想要的结果了,因此我提出了以上问题,希望有人看懂我的意思了,如表述不清,还请见谅
      

  12.   

    OnPaint 的重绘不是你说的重绘!
    使用缓冲区机制。当你需要更新客户区的时候,绘制到缓冲区。
    然后翻转到客户区。