我做的是一个最顶层窗口,他的背景是透明的,可是每当后面窗口一改变,我的窗口背景就粘上了那一块,请问怎么在后面窗口改变时再把窗口背景画一下?

解决方案 »

  1.   

    这时应该重画客户区!
    调用 InvalidateRect( NULL );
    参数 NULL 表示重画整个客户区!
    或者你可你传一个 CRect 对象!来规定重画的范围!
      

  2.   

    如果你是用MFC做的话。
    你的问题很大可能是OnDraw或OnPaint出了问题。
    我估计你在设置重画的客户区的范围(或者说大小)定义的不对。
    如果你规定的客户区的范围是通过程序算出来的话,我建议你,你的参考系数(或者基数)用系统的分辨率。
      

  3.   

    我的程序是做一个时钟,在onpaint()里用的映射模式是ISOTROPIC,我用ONTIMER来画时钟走动,如果每次都调用InvalidateRect()的话,画面狂闪。
      

  4.   

    对,应调用invalidateRect激发WM_ONPAINT消息重画。客户区坐标可通过
    CRect rect
    GetClientDC(rect)
    得到。
      

  5.   

    我是想问当有别的窗口重叠是,我的窗口会调用哪个函数(或激发哪个事件),OnPaint()吗?
      

  6.   

    应该设变量来标志要不要Invalidate或者InvalidateRect,在后面窗口改变时就要了,在不需要的时候就不调用
      

  7.   

    试试SetWindowRgn就可以制作出有透明背景的视窗了。
      

  8.   

    在我了解的范畴里,好像没有判断后面窗口是否改变的api函数。
    老兄,如果你要解决“.........可是每当后面窗口一改变,我的窗口背景就粘上了那一块,..........”的话,就好好看看你的OnDraw()或OnPaint()。
      

  9.   

    你是不是通过在创建时复制保存背景实现窗口透明的?这种方法好像不能解决窗口下面的背景改变的情况(以前的贴子应该有讨论),因为Windows不会将被遮盖窗口的刷新动作通知你。如果只需要在Win2000下实现透明效果的话,可以用Layered Windows方法:
    利用2000提供的窗口属性:WS_EX_LAYERED 和几个API:
    SetLayeredWindowAttributes
    UpdateLayeredWindow 
    可以实现透明或Alpha混合效果的窗口。