向,因此,如果我们在程序中将映射模式更改为其它的映射模式,需
要注意应该随y轴的正方向的不同而更改图形输出函数所使用的坐标
值的正负。
SetMapMode将映射模式设置为指定的映射模式,同时返回原有的映射
模式。
下面我们来编写一个实用工具MappingConverter,该工具在不同的逻
辑单位之间进行转换。需要注意的是,这种转换有两种不同的方式,
即逻辑的还是物理的。如果当前映射模式为MM_TEXT,这时一英寸所
对应的象素值大小是一定的,我们称这种映射方式的逻辑的;如果当
前映射模式为MM_HIENGLISH、MM_LOENGLISH等,则屏幕上的一英寸对
应的象素值依赖于屏幕的实际分辨率,在这种模式下,800 600的屏
"
幕分辨率下一英寸所对应的象素值要比在640" 480的屏幕分辨率多。
工具MappingConverter考虑到了这种差异,允许用户指定转换是基于
逻辑英寸进行还是基于物理英寸进行。对于实际的转换过程,则通过
调用CDC类的成员函数DPtoHIMETRIC来实现的,该成员函数将设备坐
标值转换为相应的HIMETRIC度量。
由于使用的方便考虑,我们还在工具MappingConverter中添加了其它
…………………………………………………………Page 578……………………………………………………………
几种度量单位的转换,这些度量单位包括:磅 (point)、英寸
(inch)、厘米 (centimeter)、水平对话框单位 (horizontal dialog
units)和垂直对话框单位 (vertical dialog units)。这里需要说明
的是水平对话框单位和垂直对话框单位。这两种度量单位在对话框模
板中用于对话框和控件的度量,此外,在编辑控件和列表框以及组合
框控件设置制表位的函数SetTabStops也使用对话框单位。水平对话
框单位等于当前系统字体的半角字符的平均宽度的1/4,而垂直对话
框单位则等于当前系统字体的字符的高度的1/8。API函数
GetDialogBaseUnits返回了当前系统所使用的对话框基本单位,由此
可以导出当前使用的水平对话框单位和垂直对话框单位。但是要注意
的是,实际使用的对话框单位依赖于当前对话框所使用的字体。
CDialog类的成员函数MapDialogRect可以将一个以对话框单位表示的
矩形转换为相应的屏幕象素单位。在工具MappingConverter,对话框
单位是通过函数GetDialogBaseUnits的返回值计算得到的,也就是
说,该单位是基于默认的系统字体,而不是对话框实际所选用的字体
的。
图9。 13 应用程序MappingConverter的主对话框
下面的步骤讲述了工具MappingConverter的创建。
1。 使用AppWizard创建一个基于对话框的MFC应用应用程序,按图修
改应用程序的主对话框。
各主要控件的ID如表9。6所示。
表9。 6 控件属性列表
控件 ID 属性
“单位”组合 IDC_BO1 Type:Drop
框 List
Sort:假
…………………………………………………………Page 579……………………………………………………………
“值”文本编 IDC_EDIT1
辑框
“转换”按钮 IDOK
列表控件 IDC_LIST1 View:Report
Sort:None
“物理的”单 IDC_RADIO1 Group:真
选钮
“逻辑的”单 IDC_RADIO2
选钮
按图9。14设置各控件的Tab Order。
图9。 14 各控件的Tab Order
在组合框IDC_BO1的属性对话框的Data选项卡内输入以下的列表
项:
MM_HIENGLISH (0。001英寸)
MM_LOENGLISH (0。01英寸)
MM_HIMETRIC (0。01毫米)
MM_LOMETRIC (0。1毫米)
MM_TEXT (象素)
MM_TWIPS (缇)
磅
英寸
厘米
…………………………………………………………Page 580……………………………………………………………
水平对话框单位 (系统字体)
垂直对话框单位 (系统字体)
注意各列表项的排列顺序,如果顺序出错,将导致在单位转换是进行
不正确的换算,这也是将组合框的Sort属性设置为假的缘故。
按图9。15映射对话框的控件到类CMappingConverterDlg的成员变量。
由于我们仅使用编辑框IDC_EDIT1来输入数值,因此我们将它映射到
类型为float的成员变量m_fValue;同时,我们将单选钮组
IDC_RADIO1映射为类型为int的成员变量m_nradio,当变量m_nradio
的值为0时表示单选钮 “逻辑的”被选中,变量值为1时表示单选钮
“物理的”被选中。
图9。 15 映射成员变量到对话框控件
按下面的代码修改类CMappingConverterDlg的成员函数
OnInitDialog:
/////////////////////////////////////////////////////////////////////////////
// CMappingConverterDlg 消息处理函数
BOOL CMappingConverterDlg::OnInitDialog()
{
// 设置默认选中的单选钮为 “逻辑的”
m_nradio=0;
…………………………………………………………Page 581……………………………………………………………
CDialog::OnInitDialog();
// 在系统菜单中添加 “关于”菜单项
// IDM_ABOUTBOX 必须在系统命令的范围内
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX 《 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu。LoadString(IDS_ABOUTBOX);
if (!strAboutMenu。IsEmpty())
{
pSysMenu…》AppendMenu(MF_SEPARATOR);
pSysMenu…》AppendMenu(MF_STRING; IDM_ABOUTBOX; strAboutMenu);
}
}
// 设置对话框的图标。当应用程序的主窗口不是对话框时框架会 自动进行这个过程
SetIcon(m_hIcon; TRUE); // Set big icon
SetIcon(m_hIcon; FALSE); // Set small icon
// TODO: 添加额外的初始化代码
// 在列表控件中添加两列: “单位”和 “值”
m_lst。InsertColumn(0; 〃单位〃; LVCFMT_LEFT; 180; 0);
m_lst。InsertColumn(1; 〃值〃; LVCFMT_LEFT; 100; 1);
// 初始化列表控件中的项所用的字符串数组
char *szItemTexts''={〃MM_HIENGLISH (0。001英寸)〃;
〃MM_LOENGLISH (0。01英寸)〃;
…………………………………………………………Page 582……………………………………………………………
〃MM_HIMETRIC (0。01毫米)〃;
〃MM_LOMETRIC (0。1毫米)〃;
〃MM_TEXT (象素)〃;
〃MM_TWIPS (缇)〃;
〃磅〃;
〃英寸〃;
〃厘米〃;
〃水平对话框单位 (系统字体)〃;
〃垂直对话框单位 (系统字体)〃};
// 初始
小说推荐
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 其他
- 最新章:第4章
- JMS简明教程(PDF格式)
- -Page 1-JMS1.1规范中文版卫建军2007‐11‐22-Page 2
- 其他
- 最新章:第28章
- SQL语言艺术(PDF格式)
- -Page 1-SQLSSQQLL语言艺术内容介绍本书分为12章,每一章包含许多原则或准则,并通过举例的方式对原则进行解释说明。这些例子大多来自于实际案例,对九种SQL经典查询场景以及其性能影响讨论,非常便于实践,为你数据库应用维护人员阅读。资深 SQL 专家 Stéphane Faroult倾力打
- 其他
- 最新章:第27章
- 软件工程实践者的思想(PDF格式)
- -Page 1-大 道 至 简—软件工程实践者的思想周爱民(Aimingoo 著-Page 2-序2004 年 11 月初爱民(Aimingoo)第一次把他的书稿给我,我翻看了一下,第一反应讲的是感想。这不错,在技
- 其他
- 最新章:第26章
- asp基础实用教程(DOC格式)
- 目 录一、关于ASP二、ASP的新功能三、创建ASP页四、使用脚本语言五、使用变量和常量六、使用集合七、ASP内建对象八、向浏览器发送内容九、包含文件十、访问数据库十一、调试ASP脚本十二、维护ASP应用程序的安全一、关于ASP Active Server Pages(ASP)是服务器端脚本编写环境
- 其他
- 最新章:第17章
- Linux实用培训教程(PDF)
- -Page 1-rrktqt的个人空间 Linux实用培训教程第一部分 作者:红联Linux实用培训教程第一部分-共三部分解的Linux知识,循序渐进的介绍Linux相关知识,从入门到提高,希望对所有学习Linux的朋友都有帮助 红联Linux论坛是致力于Linux技术讨论的站点,目前网站收录的文章
- 其他
- 最新章:第42章
- php程序设计简明教程(DOC格式)
- -Page 1-PHP 程序设计简明教程PHP 讲义 第 1 页 共 90 页-Page 2-目录序 4第一章 PHP 简介 6
- 其他
- 最新章:第31章
- 路由器基本知识及应用实例(DOC格式)
- 第二章 路由器第一节 路由器发展概述自从1984年问世至今,路由器已经走过了近20年的快速技术发展历程。路由器的应用领域不断扩展、从单一的互通网关逐渐扩展到覆盖广域网、城域网乃至用户接入的各个领域。近年来,路由器早已逐渐脱离单纯用于企业网出口和互联的概念,开始成为运营网络和各种专用业务网络的核心设备
- 其他
- 最新章:第48章
- Java编程思想第4版[中文版](PDF格式)
- -Page 1-Page 2《Thinking In Java》中文版作者:Bruce Eckel主页:http/BruceEckel.编译:Trans Bot主页:http/memberease~transbot致谢-献给那些直到现在仍在孜孜不倦创造下一代计算机语言的人们!指导您利用万维网的语言进
- 其他
- 最新章:第295章