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

MFC应该说在这个方面提供了强大的支持,但是也有一些是由于历史的原因需要去除的地方,特别是在缩放的这个地方还存在一些问题。
我认为关键是形成知识的框架,这样面对未来的需求就能够灵活应变。
这里,我结合GreenOpenPaint的具体实现进行总结。
我总结了一下,有几点:
1、肯定是要为这个矩形生成专门的类。这个类的实现,需要在DOC中,因为DOC就是用来管理所有的模型的;那么注意,由于DOC统一管理所有模型,所以关于fscalefactor(缩放尺度)等数据都应该直接从DOC中获取。
2、由于采用了滚动,所有的VIEW在向模型中输入坐标的时候都要DPTOLP(Lbuttondown,Lbuttonup,mousemove)
CClientDC dc(this);
    OnPrepareDC(&dc);

dc.DPtoLP(&point);//转换为逻辑坐标

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模式,自己控制这里的转换。

GreenOpenPaint的实现(五)矩形框的更多相关文章

  1. WPF 矩形框8个控制点伸缩及拖拽

    最近在研发图片控件矩形框8个控制点进行控制边框的大小.位置等信息,之前查阅了相关的信息,比如别人整合的类:ControlResizer 这个类虽然是好,但是很大程度上是有限制,换句话说,它需要你二次更 ...

  2. CAD交互绘制带周长面积的矩形框(网页版)

    主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE dY1 直线的开始点y坐标 DOUBLE ...

  3. CAD交互绘制带周长面积的矩形框(com接口)

    主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE dY1 直线的开始点y坐标 DOUBLE ...

  4. C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框

    最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...

  5. 【python】PIL 批量绘制图片矩形框工具

    工具采用PIL:Python Imaging Library,图像处理标准库.PIL功能非常强大,但API却非常简单易用. 安装PIL 在Debian/Ubuntu Linux下直接通过apt安装 $ ...

  6. 无废话ExtJs 入门教程五[文本框:TextField]

    无废话ExtJs 入门教程五[文本框:TextField] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个两个文本框.如下所示代码区的第42行位置,items: ...

  7. 如何用 matlab 在图片上绘制矩形框 和 添加文字 ?

    如何给图像添加矩形框?以及添加想要输入的文字 ? 案例程序,如下所示: clc; close all; clear all;image = imread('/home/wangxiao/Picture ...

  8. Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)

    Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView) 分类: Android开发 Androi ...

  9. c#在pictureBox控件上绘制多个矩形框及删除绘制的矩形框

    在pictureBox上每次只绘制一个矩形框,绘制下一个矩形框时上次绘制的矩形框取消,代码如链接:https://www.cnblogs.com/luxiao/p/5625196.html 在绘制矩形 ...

随机推荐

  1. Pandas新建一个DataFrame

    我们在使用Pandas时候,前提需要一个新的DataFrame,需要首先初始化一个: 那么可以根据字典形式初始化: # 新建一个dataFrame df = pd.DataFrame({']) 必须包 ...

  2. intptr_t、uintptr_t数据类型的解析

    https://blog.csdn.net/cs_zhanyb/article/details/16973379 2013年11月26日 22:20:09 binggo 阅读数:14066   最近开 ...

  3. complexity_action

    大话数据结构 /* 顺序存储的结构 */ #define MAXSIZE 20 //存储空间初始分配量 typedef int ElemType; //ElemType类型根据实际情况而定,这里假设为 ...

  4. Master Boot Record

    https://en.wikipedia.org/wiki/Master_boot_record https://zh.wikipedia.org/wiki/主引导记录 A master boot r ...

  5. centos 7 update to python V3.43 to assure git clone as usual

    vim /usr/bin/yum vim /usr/libexec/urlgrabber-ext-down yum update -y nss curl libcurl

  6. QtCreator 可以通过 Clang-Tidy 和 CLazy 对你的代码进行静态检查

    QtCreator 可以通过 Clang-Tidy 和 CLazy 对你的代码进行静态检查 打开你的工程,点击Analyze -> Clang-Tidy and CLazy 选择你想分析的 cp ...

  7. Can you answer these queries?---hdu4027

    题目链接 有n个数:当操作为1时求L到R的和: 当操作为0时更新L到R为原来的平方根: 不过如果仔细演算的话会发现一个2^64数的平方根开8次也就变成了 1,所以也更新不了多少次,所以可以每次更新到底 ...

  8. pyqt5 主界面打开新主界面、打开Dialog、打开提示框的实现模板

    import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * ###### ...

  9. EControl平台测试向生产版本工程切换说明

    第一步,备份生产环境版本,假设生产环境版本工程名为SEHEControl,记录版本说明第二部,拷贝测试版本到新文件夹,假设测试版本工程名为SEHEControlTest第三步,进入工程文件夹,修改SL ...

  10. 查询mysql事务隔离级别

    查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava   1.查看当前会话隔离 ...