友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
C语言实例教程(PDF格式)-第67部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
向,因此,如果我们在程序中将映射模式更改为其它的映射模式,需
要注意应该随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 (缇)〃;
〃磅〃;
〃英寸〃;
〃厘米〃;
〃水平对话框单位 (系统字体)〃;
〃垂直对话框单位 (系统字体)〃};
// 初始化列表控件中的项
for (int i=0; i
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!