http://community.csdn.net/Expert/topic/5758/5758697.xml?temp=.4749872

解决方案 »

  1.   

    不清楚。
    但这句话可能会有所帮助:
    ! WARNING   Before you delete the object, make sure it is not selected into a device context.
      

  2.   

    是不是要加上pannel.Invalidate();
      

  3.   

    警告的意思是,在删除pannel之前,确保它没有被选入到设备上下文环境里。
    第二次LoadBitmap时,应该会试图删除原来的句柄。
      

  4.   

    if(type==TYPE_OPSW_BLACK)
    {
    pannel.LoadBitmap(IDB_TBOPSW_BLACK);
    }
    SetBitmap((HBITMAP)pannel);
    问题就是当执行完pannel.LoadBitmap(IDB_TBOPSW_BLACK)后,系统会生成
    一个位图IDB_TBOPSW_BLACK的句柄(用来唯一的标识该位图)并将其绑定到
    CBitmap对象pannel上。
    假设你上面的操作是在一个按钮中实现的:
    当你第一次点按钮时,他就会实现上面的操作,但是当你再次点按钮时就会报错
    因为位图已经绑定到pannel上了(这和创建按钮一样,如果按钮已经创建,你再创建
    就会报错)如果你想再点按钮时不报错实现位图的再次加载,那你就得在按钮操作返回前
    将位图句柄和pannel分离.
    可以用下面的两种办法:m_bmp是一个CStatic对象
    主要用到的就是Detach()方法,将一个对象和它所关联的句柄分离
    对应的还有一个Attach()将一个对象和一个对应的句柄关联起来
    void CTestStaticDlg::OnButton1() 
    {
            if( pannel.m_hObject )//如果位图已经绑定
    {
    pannel.Detach( );//将位图句柄和pannel分离
    }
    pannel.LoadBitmap( IDB_BMP_DX );
    m_bmp.SetBitmap( HBITMAP(bmp) );

    或者
    void CTestStaticDlg::OnButton1() 
    {
    pannel.LoadBitmap( IDB_BMP_DX );
    m_bmp.SetBitmap( HBITMAP(bmp) );
            pannel.Detach( );