首页 > 其他分享 >GreenOpenPaint的实现(五)矩形框

GreenOpenPaint的实现(五)矩形框

时间:2022-12-22 12:34:16浏览次数:45  
标签:case GreenOpenPaint 实现 矩形框 LoadCursor CR NULL pDC IDC

想显示一副图片相对来说比较容易。但是想在SDI中显示一个可以拖拽的矩形框,并且在滚动和缩放下都不变形,是很困难的。


MFC应该说在这个方面提供了强大的支持,但是也有一些是由于历史的原因需要去除的地方,特别是在缩放的这个地方还存在一些问题。



我认为关键是形成知识的框架,这样面对未来的需求就能够灵活应变。



这里,我结合GreenOpenPaint的具体实现进行总结。




GreenOpenPaint的实现(五)矩形框_缩放


我总结了一下,有几点:


1、肯定是要为这个矩形生成专门的类。这个类的实现,需要在DOC中,因为DOC就是用来管理所有的模型的;那么注意,由于DOC统一管理所有模型,所以关于fscalefactor(缩放尺度)等数据都应该直接从DOC中获取。


2、由于采用了滚动,所有的VIEW在向模型中输入坐标的时候都要DPTOLP(Lbuttondown,Lbuttonup,mousemove)


CClientDC dc(this);


    OnPrepareDC(&dc);


3、将rectex的draw直接级联到view的draw中去,并传入DC

    m_pDoc->m_Rectangle.Draw(pDC);


4、 OnSetCursor设置

BOOL CGreenOpenPaintView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
switch(m_CurrentCtrlRect)
{
case CR_NORTHWEST:
case CR_SOUTHEAST:
SetCursor(LoadCursor(NULL,IDC_SIZENWSE));
break;
case CR_NORTHEAST:
case CR_SOUTHWEST:
SetCursor(LoadCursor(NULL,IDC_SIZENESW));
break;
case CR_WEST:
case CR_EAST:
SetCursor(LoadCursor(NULL,IDC_SIZEWE));
break;
case CR_NORTH:
case CR_SOUTH:
SetCursor(LoadCursor(NULL,IDC_SIZENS));
break;
default:
SetCursor(LoadCursor(NULL,IDC_ARROW));
}
return FALSE;
}

5、关于DPI的思考
void CGreenOpenPaintView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: 在此添加专用代码和/或调用基类
CScrollView::OnPrepareDC(pDC, pInfo);
pDC->SetMapMode(MM_TEXT); // Set the map mode
pDC->SetViewportExt(0,0);
}

实际上,MFC可以设置多种MapMode。但是这里MapMode的选择主要是针对显示区域来说的,也就是如何达到屏幕上去。对于这里的图像本身(也就是扫描仪或摄像机的DPI),相关的还是比较少的。而显示的DPI主要是和RUler相关的。因此,我统一采用MM_TEXT模式,自己控制这里的转换。


标签:case,GreenOpenPaint,实现,矩形框,LoadCursor,CR,NULL,pDC,IDC
From: https://blog.51cto.com/jsxyhelu2017/5962541

相关文章

  • GreenOpenPaint的实现(六)图片的保存和打开
    如果只是直接的图片保存和打开,是没有很多内容的。但是我这里,将EXIF的信息融入其中,使得图像处理的结果能够保存下来。这样就非常有价值意义了。所有的操作都放在DOC中进行处......
  • GreenOpenPaint的实现(二)打开显示图片
    1、DOC中添加,核心图片文件保存在这里。之所以不用Mat,是因为CVVImage有更好的输入输出函数。我这里直接使用了public public:  CvvImagem_image;2、重载打开//将文......
  • GreenOpenPaint的实现(三)添加标尺
    标尺对于图像处理程序,特别是需要精确测量的程序来说意义很大。这里进行了专门的研究。基于现在已经引入的类和定义的变量,主要讲一讲如何调用。1、添加放大缩小voidCGreenOp......
  • 『牛角书』鸿蒙实现简单的每日新闻
    (目录)Guide这是一篇讲解如何实现基于鸿蒙JS的简单的每日新闻。1.可滚动区域在许多场景中,页面会有一块区域是可滚动的,比如这样一个简单的每日新闻模块:上面的新闻类......
  • 为了实现2025年汽车业务盈利,华为准备复制几个问界
    车企准备好交出灵魂了吗?据《晚点Auto》报道,在今年12月8日的华为内部会议上,消费者BGCEO、智能汽车解决方案BUCEO余承东表示,车BU要在2025年实现盈利。......
  • 【拟合】基于粒子群算法实现热瞬态阻抗曲线拟合附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 工业视觉检测项目的算法实现
    一、基本情况在较好的成像质量下,可以通过ROI直接完成初略定位;而后通过手工定义特征提取信息;完成量化和评价。  这次项目能够实现的首要原因:一是因为在已经布置了......
  • 如何在云原生环境中实现安全左移?
    在过去几年里,勒索软件一直是企业安全团队关心的头等大事,而当前软件漏洞问题数量也在逐渐抬头。基于云的应用程序和服务的爆发式增长以及数字化工作的增加,对黑客来说是一大......
  • 用c++代码实现golang里面的map数据类型
    因为之前写过一篇golang数据类型分析的文章。包含slice、map、channel等。想写一篇用其它语言实现golang数据类型的代码,于是选中map作为实验对象。笔者之前写过5年的c++,......
  • 超市订单管理系统的设计与实现
    管理系统实战-前后端分离第一章项目需求分析和技术架构1.1项目需求订单管理系统采用数据化管理订单、管理商品进销、供应商信息维护、员工管理等加快对店铺运营效率......