我想要在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( )的效果,各位大侠帮帮小弟
吧!!!我这里先谢谢了!!!!
我从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( )的效果,各位大侠帮帮小弟
吧!!!我这里先谢谢了!!!!
因为你的m_MemDC是CDC类的,所以这句!=NULL,也就是下面的代码都不执行了。