想显示一副图片相对来说比较容易。但是想在SDI中显示一个可以拖拽的矩形框,并且在滚动和缩放下都不变形,是很困难的。
MFC应该说在这个方面提供了强大的支持,但是也有一些是由于历史的原因需要去除的地方,特别是在缩放的这个地方还存在一些问题。
我认为关键是形成知识的框架,这样面对未来的需求就能够灵活应变。
这里,我结合GreenOpenPaint的具体实现进行总结。
1、肯定是要为这个矩形生成专门的类。这个类的实现,需要在DOC中,因为DOC就是用来管理所有的模型的;那么注意,由于DOC统一管理所有模型,所以关于fscalefactor(缩放尺度)等数据都应该直接从DOC中获取。
2、由于采用了滚动,所有的VIEW在向模型中输入坐标的时候都要DPTOLP(Lbuttondown,Lbuttonup,mousemove)
dc.DPtoLP(&point);//转换为逻辑坐标 3、将rectex的draw直接级联到view的draw中去,并传入DC
m_pDoc->m_Rectangle.Draw(pDC); BOOL CGreenOpenPaintView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) switch(m_CurrentCtrlRect) SetCursor(LoadCursor(NULL,IDC_SIZENWSE)); SetCursor(LoadCursor(NULL,IDC_SIZENESW)); SetCursor(LoadCursor(NULL,IDC_SIZEWE)); SetCursor(LoadCursor(NULL,IDC_SIZENS)); SetCursor(LoadCursor(NULL,IDC_ARROW)); } void CGreenOpenPaintView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) CScrollView::OnPrepareDC(pDC, pInfo); pDC->SetMapMode(MM_TEXT); // Set the map mode pDC->SetViewportExt(0,0); 实际上,MFC可以设置多种MapMode。但是这里MapMode的选择主要是针对显示区域来说的,也就是如何达到屏幕上去。对于这里的图像本身(也就是扫描仪或摄像机的DPI),相关的还是比较少的。而显示的DPI主要是和RUler相关的。因此,我统一采用MM_TEXT模式,自己控制这里的转换。
目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com