BOOL CV1Dlg::OnInitDialog()
{
  ...
m_PaintClient=false; //不画客户
m_PaintServer=false; //不画服务器
  ...
}void CV1Dlg::OnPaint() 
{
if (IsIconic())
{
...
}
else
{
  if (m_PaintClient)  PaintClient();
  if (m_PaintServer)     PaintServer();   

          CDialog::OnPaint();

}


}void CV1Dlg::OnNewClient() 
{
...
m_PaintClient=true; //画客户
         Invalidate();    
}void CV1Dlg::OnSetServerPara() 
{

...
m_PaintServer=true; //画服务器
         Invalidate(); 
}
void CV1Dlg::PaintClient()
{
        CPaintDC dc(this); 
RECT rect;
CDC *mdc= new  CDC;
CBitmap *bitmap= new CBitmap;
GetClientRect (&rect);
mdc->CreateCompatibleDC(&dc);
bitmap->m_hObject = (HBITMAP)::LoadImage(NULL,"client.bmp", 
IMAGE_BITMAP, 100,100, LR_LOADFROMFILE);
mdc->SelectObject(bitmap);
dc.BitBlt(250,100,200+100, 100+100, mdc, 0, 0, SRCCOPY);
}void CV1Dlg::PaintServer()
{
        CPaintDC dc(this); 
RECT rect;
CDC *mdc= new  CDC;
CBitmap *bitmap= new CBitmap;
GetClientRect (&rect);
mdc->CreateCompatibleDC(&dc);
bitmap->m_hObject = (HBITMAP)::LoadImage(NULL,"server.bmp", 
IMAGE_BITMAP, 60,100, LR_LOADFROMFILE);
mdc->SelectObject(bitmap);
dc.BitBlt(550,100,550+60, 100+100, mdc, 0, 0, SRCCOPY);
}第一次按服务器,服务器能够被画出来。然后按客户,客户也画出来了,但服务器没有了,以后再怎么按服务器它也画不出来, 这是怎么回事?  非常感谢

解决方案 »

  1.   

    首先你画图像应该先创建一个背景dc,在那个上面画出来,然后bitblt到前面来,如果你只先画了server,然后invalidate(),这时就要看server在什么地方画的了,如果在onpaint里画的,就会重画,否则就丢了。
      

  2.   


    谢谢, 麻烦看下代码,我是在OnPaint里画的, 应该都会重画啊: void   CV1Dlg::OnPaint()   

         if   (IsIconic()) //不知道这个什么意思
         { 
             ... 
         } 
         else 
         { 
               if   (m_PaintClient)   PaintClient(); //我在OnPaint()里调用其他函数, 应该也算是
                                                            //在OnPaint()  里面画的吧
               if   (m_PaintServer)   PaintServer();                  CDialog::OnPaint();      } 

    void   CV1Dlg::PaintClient() 

               CPaintDC   dc(this);
               ...
    }void   CV1Dlg::PaintServer() 

               CPaintDC   dc(this);  
               ...
    }          
      

  3.   

     if (m_PaintClient) PaintClient();   //我在OnPaint()里调用其他函数,   应该也算是 
                    //在OnPaint()     里面画的吧 
        if (m_PaintServer) PaintServer();   
    /////////////////////////////////////////////////////
    我上面想说的是你是否在PaintClient之后Invalidate了,俺认为应该在两个都Paint之后再Invalidate。
      

  4.   

    你在Onpaint()中创建一个DC,然后将其传入至你要在里面调用的两函数中试试。即用同一个DC。
      

  5.   

    CDC   *mdc=   new     CDC; 
    CBitmap   *bitmap=   new   CBitmap; 每次都new一个,这肯定不对
      

  6.   

    To xjchilli:  出来了!CDC *mdc= new  CDC;
     mdc->CreateCompatibleDC(&dc);//这句只能用一次,这样就对了  只是这么一来 CPaintDC dc(this) 中的dc也要作为参数传过去, 因为要dc.BitBlt。 奇怪的是CPaintDC dc直接传总是说参数不能从Class CPaintDC 转换到Class CPaintDC, 这不是同一个类型么?!CPaintDC dc定义为成员变量又说没有合适的构造函数!  后来用指针就好了, 真是奇怪!大家知道是怎么回事么? 分是要散的,只是不想太早结了,想再讨论讨论