想显示一副图片相对来说比较容易。但是想在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. HDU_6043_KazaQ's Socks

    KazaQ's Socks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  2. ubuntu x64 debootstrap

      sudo debootstrap jessie /mnt/jessie http://mirrors.163.com/debian

  3. Linux 程序后台运行

    例子: shadowsocks 程序后台运行: sslocal -c /etc/shadowsocks-libev/config.json > /dev/>& & 参考: ...

  4. LoadRunner-循环

    Edit Runtime Settings ,设置循环次数 在Open Parameter List 里设置循环参数,比如用例为删除notice,每执行一次用例id值不同. 把id替换为参数,并在参数 ...

  5. 实现一个2008serve的IIS的虚拟目录(通过网络路径(UNC)的形式,共享在另外一个2008服务器上

    转载:http://www.cnblogs.com/top5/archive/2012/12/10/2812133.html 目的:实现一个2008serve的IIS的虚拟目录(通过网络路径(UNC) ...

  6. CentOS工作内容(五)单一网卡配置多个IP

    CentOS工作内容(五)单一网卡配置多个IP 用到的快捷键 tab 自动补齐(有不知道的吗) ctrl+a 移动到当前行的开头(a ahead) ctrl+e 移动到当前行的开头(e end) ct ...

  7. (转)FastDFS文件存储

    一.FastDFS介绍 FastDFS开源地址:https://github.com/happyfish100 参考:分布式文件系统FastDFS设计原理 参考:FastDFS分布式文件系统 个人封装 ...

  8. openstack 部署笔记--nova

    控制节点 配置用户与服务 $ . admin-openrc $ openstack user create --domain default --password-prompt nova $ open ...

  9. NLP语料库

    文本语料库是一个大型结构化文本的集合 NLTK包含了许多语料库: (1)古滕堡语料库 (2)网络和聊天文本 (3)布朗语料库 (4)路透社语料库 (5)就职演讲语料库 (6)标注文本语料库  词汇列表 ...

  10. java调用存储过程mysql

    在java中调用带返回值的存储过程的实现 直接上代码: DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `t ...