改了之后,菜单不能用了,而且控件的位置发生了变化(我是用CreateWindow来创建的控件)因为我用Popup风格的时候,我画在对话框上面的图片,如果被遮一下,背景不能自动更新,如弹出一下菜单,如果遮住了图片,则图片不会被刷新,就留下来了一块空白,所以我想改成overlapped风格的,但是一改,发现问题太多了希望大家给点意见,或者在popup风格下解决不能刷新的问题
我用IImage来显示的图片,可能用Static控件来显示图片的话,没法画上去吧,因为它要使用Bitmap,并且有Bitmap的句柄才可以。不知道有没有其它方法,将其显示在某个控件上面也行。非常感谢!!!

解决方案 »

  1.   

    1、如果是用类似BitBlt之类的画图片,需要更新的时候,调用相应窗体的Invalidate函数触发重画事件
    2、需要现实图片,可以自己从CWnd派生一个类,专门用来现实图片,图片的处理可以用GDI+,如果楼主需要这个类,留下E-MAIL
      

  2.   

    http://download.csdn.net/source/826748
      

  3.   

    我把对话框设置为Overlapped和设置为popup,都不影响使用,楼主的情况比较奇怪,再说菜单挡住了窗口,菜单消失后窗口不能自动重绘,这也太奇怪了,除非你的程序做了什么特殊设定。我有点不相信跟popup和Overlapped这两个风格有关系。
      

  4.   


    哦,呵呵,我是看到网上有人说到有可能是因为没有设为Overlapped风格,可能导致这样的情况我以前都没注意过这两个风格,也不知道是什么原因造成的,所以我想试一下,但发现改了之后问题更多……我是直接用GetDC来获取的对话框窗口的DCHDC hdc = GetDC(hDlgWnd);
    RECT rt;
    GetClientRect(&rt);
    //然后再hdc上画图这样画出来之后,图片就不能自动重画
      

  5.   

    HDC hdc = GetDC(hDlgWnd); 
    RECT rt; 
    GetClientRect(&rt); 
    //然后再hdc上画图 这些代码你放在哪里了?放到onpaint()里吧
      

  6.   

    没有放到WM_PAINT里面
    因为我的程序是在接收到某个事件响应的时候才去画图,而且图片并不是固定的
      

  7.   

    hehe,原来绘图动作不在WM_PAINT里a,那可能就不能自动重绘了。“接收到某个事件响应的时候才去画图, 而且图片并不是固定的”这个在WM_PAINT里也可以做啊。
      

  8.   

    还是那句老话,“绘制过程”一定要放在OnPaint或OnDraw当中,
    即一定是被动的。主动做的只能是触发绘制即刷新(Invalidate)。一般是图形在内存中有对应的内存数据模型,修改数据模型后,
    再刷新视口、触发绘制过程。绘制过程当中除非绝对必要,应
    避免对数据模型做任何更改。