我想要在Picture控件上绘图,希望实现下面的效果:改变映射模式、视口范围和坐标原点,将坐标原点设在距控件左下角1/8处,X轴向右为正,Y轴向上为正,然后绘出坐标轴.
我从CStatic类中派生了CShowWnd类,CShowWnd类中两个数据成员:CDC m_MemDc; CBitmap m_bitmap;然后为Picture控件(IDC_STATIC_RECT)生成CShowWnd类变量m_show;
主代码如下:
void CShowWnd::InvalidateCtrl()
{
  CRect rect;
  this->GetClientRect(rect);
  CClientDC dc(this);  if(m_MemDc.GetSafeHdc()==NULL)
  {
     m_MemDc.CreateCompatibleDC(&dc) ;                     m_bitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Heigh)) ;      m_MemDc.SelectObject(m_bitmap);
     int max=0;
     if(!max) max=400;
     int viewportrange=int(1.5*max);     int xClient,yClient;
     xClient=rect.Width();
     yClient=rect.Height();
     m_MemDc.SetMapMode(MM_ISOTROPIC);
     m_MemDc.SetWindowExt(viewportrange,(-1)*viewportrange);
     m_MemDc.SetViewportExt(xClient,yClient);
     m_MemDc.SetViewportOrg(int(0.125*xClient),int(0.875*yClient));     CPen m_whitepen; CPen *m_oldpen;
     m_whitepen.CreatePen(PS_SOLID,1,RGB(255,255,255));
     m_oldpen=m_MemDc.SelectObject(&m_whitepen);     m_MemDc.MoveTo(0,0);
     m_MemDc.LineTo(int(0.75*viewportrange),0);
     m_MemDc.MoveTo(0,0);
     m_MemDc.LineTo(0,int(0.75*viewportrange));
  }
  this->InvalidateRect(rect);
}
void CShowWnd::OnPaint() 
{
  CPaintDC dc(this); 
  CRect rect;
  this->GetClientRect(rect);
  if(m_MemDc.GetSafeHdc()!=NULL)
 dc.BitBlt(0, 0, rect.Width(), rect.Height(), &m_MemDc, 0, 0, SRCCOPY);}
单击按纽BUTTON1的代码:
void CTempDlg::OnButton1() 
{
  m_show.InvalidateCtrl(); 
}
但得不到我要的效果,下面的代码却可以得到我要的效果,可做不到重绘:
void CTempDlg::OnButton2() 
{   CWnd *pwnd=this->GetDlgItem(IDC_STATIC_RECT);
   CRect rect;
   pwnd->GetClientRect(rect);
   CDC *pdc=pwnd->GetDC();
   int max=0;
   if(!max) max=400;
   int viewportrange=int(1.5*max);   int xClient,yClient;
   xClient=rect.Width();
   yClient=rect.Height();
   pdc->SetMapMode(MM_ISOTROPIC);
   pdc->SetWindowExt(viewportrange,(-1)*viewportrange);
   pdc->SetViewportExt(xClient,yClient);
   pdc->SetViewportOrg(int(0.125*xClient),int(0.875*yClient));   CPen m_whitepen; CPen *m_oldpen;
   m_whitepen.CreatePen(PS_SOLID,1,RGB(255,255,255));
   m_oldpen=pdc->SelectObject(&m_whitepen);   pdc->MoveTo(0,0);
   pdc->LineTo(int(0.75*viewportrange),0);
   pdc->MoveTo(0,0);
   pdc->LineTo(0,int(0.75*viewportrange));
   pwnd->ReleaseDC(pdc); 
}
谁能告诉我两个BUTTON的响应函数有什么区别吗?为什么OnButton2()可以实现我
开头提到的效果,可InvalidateCtrl()中几乎相同的代码却无法实现那样的效果?InvalidateCtrl( )要怎样改才可以实现OnButton2( )的效果,各位大侠帮帮小弟
吧!!!我这里先谢谢了!!!!