第三节 设计输出及利用在线帮助
在Windows中,消息ON_PAINT是专门用来处理输出的。基本所有的输出代码应放在这里。
。其输出方式不再限于从上往下,而是全屏可控,因此每个输出都需要告知系统输出位置。典型的文字输出代码是TextOut函数。
将WM_PAINT消息处理的内容保留BeginPaint和EndPaint函数调用,删除其他内容,用图中的内容替代。可以发现屏幕输出的内容改变了。TextOut函数使用一个叫做HDC类型的变量hdc,HDC叫做输出设备句柄,可以理解为一个结构体指针,在BeginPaint函数中被指向当前显示屏有关结构,而在EndPaint函数中释放这个指针的关联(即EndPaint函数之后,该句柄就不能被使用了)。其所指向的内容存储了和输出有关的默认属性。例如,隐含的属性包括用什么字体,用几号字,采用字体的颜色等。其后两个参数是屏幕坐标,屏幕坐标以像素为单位,左上角为0,0点。最后两个参数是待输出字符串的地址和字符串长度。
若要修改默认属性,例如使用一种新的字体如楷书,并且调整字体的大小——即变更字号,更换字体的颜色怎么办呢?Windows使用一组相关函数更改属性,例如SetTextColor函数将字体颜色设置为新的颜色,同时返回原先使用的颜色。当然在画图工作完毕后,应将字体颜色设置回原先的颜色,以免破坏其他程序的文字输出行为。SetTextColor函数具体使用可见后面的例子。
当用户希望显示魏碑字体而不是系统默认的新宋体时,则过程略微复杂一些。字体有大小和是否粗体和下划线等属性,画刷有颜色属性和贴图属性,画笔有颜色和粗细以及画实线还是虚线等属性,这样一些复杂的对象被称为GDI对象。当用户打算使用自定义的GDI对象时,可以使用各自的创建函数可以创建这些对象并得到对象句柄(可以理解为GDI对象的结构体的指针),然后使用SelectObject将这些对象句柄选入输出设备结构体中(HDC),同时得到HDC中原先使用的对象句柄。在使用完毕这些自定义对象后,应该将原先HDC中使用的默认对象选回,最后使用同一的DeleteHandle函数删除这些自定义对象。
下面的例子中创建一个字体,输出一段文字,再使用矩形把字体框住。
省略……
关于Windows画图的可用函数,可以从如图所示MSDN中找到
图 13 GDI帮助的位置以及初学者可以轻松阅读和应该精读的章节
第四节对话框与输入设计
Windows 是一种全屏的图形界面,使用行输入的scanf虽然简单但是不能满足用户的需要,用户有可能在输入一段内容以后回过头修改前面输入的内容。这时候需要使用全屏输入系统。在Windows中最常见的全屏输入系统是对话框。为允许用户输入数据,程序员需要使用对话框进行输入输出操作。下面设计一个输入顾客姓名和出生月日,输出其星座信息的程序。
首先按照程序中涉及的数据的逻辑相关性,可定义以下数据结构。注意其中全局变量MyCustomer。
程序片段8 星座之数据
然后在左侧资源视图中鼠标右键点击Dialog,调出快捷菜单,选择Insert Dialog
图14 新建对话框以及结果
从右图的控件栏中,分三次每次拖动一个 到对话框中。这个是静态文本,将用来提示用户旁边输入什么数据。右键点击第一个静态文本,出现下图对话框,将文字内容修改为姓名。
图15 设置姓名输入
从控件工具箱中,拖动一个 到对话框中,这个叫做编辑框EditBox,用户可以在这里输入一些字符。——其作用将相当于命令提示符下的scanf。将这个编辑框放在姓名边上。右键点击编辑框,将ID改名为IDC_NAME.如图
图16 修改姓名输入框属性
再次从控件工具箱中拖动 到对话框中。这个叫做组合框ComboBox,可以向用户提供一些预先设置好的选项,用户可以从这些选项中选择一项。右键点击组合框,如图设置属性。注意在输入数据时,需要按CTRL+回车键输入下一行数据。这里输入月份数据的目的是为了观察对话框执行时其效果是否良好,在程序中还需再输入一次。
图17 设置月份下拉框属性
最后再拖动一个编辑框到对话框,修改属性如图
图18 设置生日输入框属性
右键点击OK和Cancel按钮(Button)将标题修改为“确定”和“取消”,然后拖动OK和Cancel按钮,使之更美观些,设置完毕后,可以按下 按钮来测试一下你设计的输入界面的效果。
图19 测试运行效果
注意到下拉框只能同时看到两个选项,可以回到对话框设计界面,点击组合框的下箭头,就可以拉伸选择区域可以看到的内容。
图20 修改组合框显示数据行
最后,这个对话框的目的是为了输入顾客信息,所以应该给这个对话框换个更好的名字。右键点击资源视图中新建对话框的名字(原先的名字是IDD_DIALOG1),在对话框中修改ID号如下图:
图21修改对话框名字
以上内容完成了一个输入界面设计,下面需要通过程序运作这个对话框。
从系统给出的样例代码中,复制AboutProc消息处理函数,修改函数名为InputCustomer,这个函数专门处理顾客信息输入。代码如下:
程序片段9 顾客信息的输入与编辑
下面需要确定合适的时机来输入顾客信息。方法可以很多,例如当你从菜单中选择一项“输入顾客信息”的命令——使用菜单的方法,前面已经介绍过;或者当你按下回车键时输入顾客信息——这需要对按下键盘作出响应;当你用鼠标在空白地方点击窗口时输入,也是个不错的选择——这需要对用户鼠标动作作出响应。下面用鼠标响应来作为顾客信息输入的事件。
鼠标动作其实很多,左键,右键,中键,按下,松开,双击都各自有不同的事件定义。对于每个事件系统都会告诉程序,事件发生的坐标。下面是一个简表可以浏览一下。
下面的示例程序中使用了鼠标左键双击事件,其用户操作的设计如下,当用户双击屏幕上任意一点时,弹出顾客对话框。注意,因为程序设计为在大窗口中双击而弹出顾客输入框,因此下面这段消息响应代码应该放置在MainWndProc中。
程序片段10 激发“输入顾客 ”对话框
一般情况下,窗口时不响应双击消息的。为使主窗口能够接受并处理鼠标双击消息,需要修改主窗口的风格。
程序片段11 修改主窗口的处理风格
当顾客输入完毕,按下“确定”按钮后,应该在屏幕上显示相应的星座。修改WM_PAINT消息如下:
程序片段12 显示顾客星座数据
图22 运行结果