实现画布的功能,请各位畅所欲言,来者有分
scxy 2002-06-02 06:50:52 开发一个绘图的软件,需要实现的功能:实现一个图形元件(以下称图元)的拖动,滚动浏览,放大缩小;
为了实现放大和缩小,映射模式设为MM_ANISOTROPIC,为了能表现拖动,我准备在后台建立一张画布,大小为整个图稿的实际大小,当图稿大小大于窗口大小时,显示滚动条,在拖动时得到坐标偏移量,每次滚动(Scrool)窗口后先在整张画布上画图,在把相应的从偏移坐标开始的屏幕相应大小的区域拷贝到试图区,但出现以下问题:
1、在MM_ANISOTROPIC模式下,原屏幕的映射模式是否应跟画布模式设为一样;
2、这样的设计思路是否有问题:因为我的程序没有达到实际的效果,现把OnDraw的样例代码贴出,请高手帮忙测试:
void CTestModeView::OnDraw(CDC* pDC)
{
CTestModeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC dcMem;
CBitmap bpMem;
CRect rectClient;
GetClientRect(&rectClient);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(1000, 1000);
pDC->SetViewportExt(rectClient.Width(), -rectClient.Height());
pDC->SetViewportOrg(rectClient.Width() / 2, rectClient.Height() / 2);
bpMem.CreateCompatibleBitmap(pDC, rectClient.Width(), rectClient.Height());
dcMem.CreateCompatibleDC(pDC);
CBitmap *pOldBitmap = dcMem.SelectObject(&bpMem);
dcMem.SetMapMode(MM_ANISOTROPIC);
dcMem.SetWindowExt(1000, 1000);
dcMem.SetViewportExt(rectClient.Width(), -rectClient.Height());
dcMem.SetViewportOrg(rectClient.Width() / 2, rectClient.Height() / 2);
dcMem.BitBlt(m_pointOffset.x, m_pointOffset.y, rectClient.Width(), rectClient.Height(),
pDC, 0, 0, SRCCOPY);
dcMem.Ellipse(-100, 100, 100, -100);
pDC->BitBlt(0, 0, rectClient.Width(), rectClient.Height(), &dcMem,
m_pointOffset.x, m_pointOffset.y, SRCCOPY);
dcMem.SelectObject(pOldBitmap);
dcMem.DeleteDC();
bpMem.DeleteObject();
}