《C语言实例教程(PDF格式)》第122章


向,因此,如果我们在程序中将映射模式更改为其它的映射模式,需 
要注意应该随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 (缇)〃;
〃磅〃;
〃英寸〃;
〃厘米〃;
〃水平对话框单位 (系统字体)〃;
〃垂直对话框单位 (系统字体)〃};
// 初始
小说推荐
返回首页返回目录