/* 第十七章使用对话框和控件 1 对话框的概念, 创建对话框资源的方法 2 控件的概念,如何把控件添加到对话框上 3 可用控件的基本种类似 4 如何时创建管理对话框的对话框类 5 如何编写创建对话框的代码,如何获得来自对话框中控件的信息 6 模态和非模态对话框 7 如何实现并使用与控件之间的直接数据交换和数据验证 8 如何实现视图缩放 9 如何给应用程序添加状态栏 17.1 理解对话框 17.2 理解控件 控件类型列表 静态控件 这些控件用来提供标题或说明信息 按钮控件 按钮提供一种单击输入机制,基本上有三种按钮控件,简单的自动复位按钮,任何时刻只有一个可以是选择中状态的单选按钮以及同时可以有多个处于选中状态的复选框 滚动条 滚动条通常用来水平或者垂直滚动另一个控件内的文本或图像 列表框 列表框提供一个选项列表,同时有效的可能是一个选项,也可以是多个选择 编辑控件 编辑控件允许文本输入或者对显示的文本进行编辑 给合框 给合框提供了可以从中选择的选项列表,还允许用户直接输入 通用控件 被MFC和Resource Editor支持的标准控件的集合被称为通用控件,通用控件包括我们刚刚见过的所有控件, 通过控件集合中另一个有用的控件是微调按钮,使用该控件,可以递增或递减相关编辑控件中的数值 17.3 创建对话框资源 我们给Sketcher程序添加一个对话框,来提供图元素的线宽选项,该功能最终需要修改文档中的当前线宽,还需要在CElement类中添加或修改处理线宽的函数,在得到该对话框这后,我们将处理所有这些功能 给对话框添加控件 测试对话框 17.4 对话框的编程 对话框的编程有两个方面,第一是使对话框显示出来,第二是处理对话框中控件的作用 在能够显示对应于刚才所创建资源的对话框之前,必须首先定义一个对话框类,类向导可以帮助我们做这件事情 17.4.2 模态和非模态对话框 模态和非模态对话框,两者以完全不同的方式工作 在模态对话框有效期间,应用程序的其他窗口中的所有操作将都被挂起,直到该对话框被关闭为止--通常是通过单周ok或Cancel按钮, 非模态对话框的时候,可以使焦点在对话框和应用程序中的其他窗口之间来回移动--只需在目标窗口单击即可,而且在任何时候都可以继承使用对话框,直到将其关闭为止 17.4.3 显示对话框 1 显示对话框的代码 2 关闭对话框的代码 void CPenDialog::Onok() { CDialog::OnOK(); } //在复杂的对话框中,我们可能希望验证选择中的选项或输入的数据是否有效,可以把检查对话框状态和整理数据的代码乃到使对话框在有问题时保持梊开状态的代码都放在这里 调用基类中定义的OnOK()函数将关闭对话框,并使DoModal()函数返回IDOK,因此,可以使用DoModal()函数返回的值,检测对话框是何时因单周OK按钮而关闭的 17.5 支持对话框控件 对Pen对话框来说,要把选择中的线宽存储在CPenDialog类的数据成员m_PenWidth中,可以通过右击CPenDialog类名,并从上下文菜单中选择适当菜单项的方法添加该数据成员, 17.5.1 初始化控件 可以通过重定在基类CDialog中定义的OnInitDialog()函数来初始化那些单选按钮,OnInitDialog()函数是在响应WM_INITDIALOG消息时被调用的,该消息是在执行DoModal()的过程中,正好在显示对话框之前发送的 17.5.2 处理单选按钮消息 在显示对话框之后,每当单周一个单选按钮时,就会有一条消息产生并被发送给该应用程序 17.6 完成对话框的操作 17.6.1 给文档类添加存储线宽的成员 需要给文档类添加m_PenWidth成员,还需要添加GetPenWidth()函数,以允许从外部访问该成员存储的数值 17.6.2 给元素添加线宽 需要给CElement类从CElement类派生的形状类添加代码要稍多一些 17.6.3 在视图中创建元素 17.6.4 练习使用对话框 17.7 使用微调按钮控件 17.7.1 添加Scale菜单和工具栏按钮 17.7.2 创建微调按钮 控件的制表键顺序 17.7.3 生成比例对话框类 1 对话框数据的交换和验证 2 初始化对话框 17.7.4 显示微调按钮 CSketcherView类的构造函数,把m_Scale初始化为1, 这样就使视图总是以1:1的比例开始 如果忘记这么做,该程序将不可能正常式作 17.8 使用比例系数 Windows中的缩放通常需要使用两种可缩放的映射模式之一: MM_ISOTROPIC 或者MM_ANISORTOPIC 了解一下与使用该映射模式有关的内容 17.8.1 可缩放的映射模式 MM_ISOTROPIC 逻辑坐标 MM_ANISORTOPIC 映射坐标 MM_ISOTROPIC模式具有使windows强制让x轴和y轴的比例系数相等的属性 其优点是圆始终是圆,缺点是不能使被映射的文档适应不同形状的矩形 MM_ANISOTROPIC模式允许每一个轴单独缩放,因为这是一种更为灵活的模式 逻辑坐标转换为设备坐标的方式 Window Origin 窗口左上角的逻辑坐标,调用CDC::SetWindowOrg()函数可以设定该参数 Window Extent 以逻辑坐标指定的窗口尺寸,调用CDC::SetWindowExt()函数可以设定该参数 Viewport Origin 以设置坐标(像素)指定的窗口左上角的坐标,调用CDC::SetViewportOrt()函数可以设定该叁数 Viewport Extent 以设备坐标(像素)指定的窗口尺寸,调用CDC::SetViewportExt()函数可以设定该叁数 记住: 逻辑坐标(亦称作页面坐标)是由映射模式决定的,例如, MM_LOENGLISH映射模式具有以0.01英寸为单位的逻辑坐标,坐标原点位于客户区左上角,y轴的正向是从下向上,逻辑坐标由设备环境的绘图函数使用 设备坐标(在窗口中亦称作客户坐标)在窗口的环境中是以像素为量度的,其原点在客户区的左上角,y轴的正向是从上向下,设备坐标是在设置环境的外部使用的,比如用来在鼠标消息的处理程序中定义光标的位置 屏幕坐标也是以像素为量度,其原点在屏幕的左上角,y轴的正向是从上向下,屏幕坐标在获取或设置光标的位置时使用 Windows 使用的把逻辑坐标转为设备坐标的公式如下 xDevice = (xLogical-xWindwsOrg) * (xWindowExt/xViewportExt)+xViewportOrg; yDevice = (yLogical-yWindwsOrg) * (yWIndowExt/yViewportExt)+yVIewportOrg; 17.8.2 设置文档的大小 需要在文档对像中以逻辑单位表示文档的大小 17.8.3 设置映射模式 17.8.4 同时实现滚动与缩放 CScrollView类不能与MM_ANISOTROPIC映射模式共同工作,因此必须使用另一种映射模式来设置滚动条 设置滚动条 //不知道是不是什么地方错了,反正放大没有效果,并没有以中心点放大 17.9 使用状态栏 状态栏分为若干段(称作窗格),Sketcher程序中的状态栏有四个窗格,左边的一个窗格包含文本Ready, 其他三个在右边的窗格是进的区域,用来记录CAPS LOCK, NUM LOCK和SCROLL LOCK这三个键的状态 给框架窗口添加状态栏 状态栏应该是框架的组成部分,而不是视图的组成部分,我们不需要滚动状态栏或在状态栏上画图,它们只应该固定在状态栏的低部,如果把状态栏添加到视图上,则状态栏将出现在滚动条之内,并且会跟滚动视图一起滚动,任何在包含状态栏的视图部分的绘图操作都会使状态栏被重画,从而导致令人讨厌的闪烁出现,使状态栏成为框架的组成部分可以避免这些问题 2 更新状态栏 靠又不知道什么地方弄错了,状态栏没有出现,烦 17.10 使用列表框 17.10.1 删除比例对话框 17.10.2 创建列表框控件 1 创建对话框类 2 显示对话框 //虽然列表框出来了,但并没有达到指定的效果一样 17.11 使用编辑框控件 我们将需要一种以应于文本串的新的元素类型CText,还需要添加一个新的菜单项来设置文本元素的TEXT模式,因为文本元素只需要一个参考点,所以可以在视图类的OnLButtonDown()处理程序中创建这种元素,还需要给Element菜单添加新的设置TEXT模式的菜单项,将以下面的顺序给Sketcher程序添加这种文本功能 1 创建对话框资源和相关联的对话框类 2 添加新的菜单项 3 添加打开创建文本元素的对话框的代码 4 添加对CText类的支持 17.11.1 创建编辑框资源 17.11.2 创建对话框类 CString类 CString类提供了一种非常方便和易用的处理字符串的机制,我们几乎可以在需要字符串的任何地方使用CString类,更准确地说,可以使用CString对像来代替const char*(本地C++中表示字符串的通常类型)功LPCTSTR(经常出现在Windows API函数中的类型)类型的字符串 CString类提供了许多使字符串的处理更容易的重载运算符 运算符: = + += == < <= > >= 注意: 通常,应该尽可能避免在堆上创建CString对像,使这些对像增长所需要的内存管理开销意味着操作速度将变慢 17.11.3 添加Text菜单项 17.11.5 实现CText类 我们要为CText类实现3个函数 1 初始化CText对像的构造函数 2 显示CText对像的Draw()虚函数 3 支持以鼠标拖动方式移动文本对像的Move()函数 17.11.6 创建文本元素 在把元素类型设置为TEXT之后,只需要单击鼠标左键并输入希望显示的文本,文本对象就应该在光标所在的位置被创建,因此,需要在OnLButtonDown()处理程序中打开允许输入文本的对话框,给CSketcherView类中的OnLButtonDown()处理程序添加代码 =====需然实现了,但效果不理想 17.12 CLR Sketcher中的对话框和控件 这个CLR实例做得所点慢了,不想在往下做了,转到19章看 */