Windows的用户界面分为两种:字符图形界面和图形用户界面。字符界面较为简单,主要内容包括如何在节目上读取用户输入,如何向界面中断输出信息、如何控制界面的字体、背景、颜色等。Windows图形用户界面内容很多,尤其控件类型很多,本书选取了最具有代表性的文本编辑控件、树形控件、列表控件作重点介绍。
字符界面程序
Console句柄:字符界面应用程序的所有输入和输出都是通过Console,相关的API函数都是通过Console句柄来操作控制台的。Console句柄分为两种,标准输入和标准输出句柄,分别用于从界面上读取输入和向界面输出。
GetStdHandle 获取句柄,包括应用程序所拥有的控制台的标准输入和标准输出句柄。
WriteConsole 向Console写入字符串。
ReadConsole 从Console读取字符串。
GetConsoleTitle 获取标题。
SetConsoleTitle 修改字符界面窗口标题。
GetConsoleProcessList 获取控制台附加的进程。
GetConsoleWindow 获取字符界面窗口句柄。
GetCurrentConsoleFont 获取字体。
SetConsoleTextAttribute 设置文本前后景的颜色等。
FillConsoleOutputAttribute 改变控制台的输出属性。
ReadConsoleOutputCharacter 从屏幕缓存中读取输出的字符。
WriteConsoleOutputCharacter
GetConsoleScreenBufferInfo 获取屏幕缓存属性。
SetConsoleScreenBufferInfo
ReadConsoleOutputAttribute
WriteConsoleOutputAttribute 设置屏幕缓存属性。
GetConsoleCursorPosition 获取屏幕光标的位置。
SetConsoleCursorPosition 设置屏幕光标的起始位置。
CreateConsoleScreenBuffer 创建屏幕缓存。
SetConsoleActiveScreenBuffer 设置屏幕活动缓存。
ReadConsoleOutput 读取屏幕输出缓存。
WriteConsoleOutput 写屏幕输出缓存。
ReadConsoleInput 读取屏幕输入缓存,可用来读取控制台事件。
WriteConsoleInput 写屏幕输入缓存。
GetConsoleMode 获取控制台当前模式。
SetConsoleMode 设置控制台当前模式。
图形用户界面
窗口:窗口是Windows图形用户界面罪重要的元素。一个典型的窗口包括多个组成部分,标题栏(包括应用程序图标、窗口标题、最大最小关闭按钮)、菜单、客户区、滚动条、边框等。每个窗口都属于一个窗口类。每种窗口类都具有固定的用户输入的处理模式,同一类窗口具有相同的菜单项、背景、图标、鼠标指针样式和窗口消息处理函数。应用程序创建窗口前,需向系统注册窗口类或使用系统已经定义好的窗口类。注册窗口类时,需指定窗口消息的处理函数。
消息:WIndows系统是消息驱动的。消息在windows处理用户交互的过程中具有重要作用。当用户操作输入设备,产生硬件中断后,系统内核会得到这些硬件中断,硬件中断在系统中经过复杂的运算和处理最终变成消息。消息被系统发送给指定的窗口。消息并不是只有用户的输入才会产生消息,很多情况下如系统关机、外设插入、计时器到达等都会产生消息。
消息处理函数:是个回调函数,由操作系统调用。
控件:实际上是一种特殊的窗口。Windows将一些常用的窗口模式定义为控件。应用程序可以直接使用这些控件而不需要重新定义。
资源:是应用程序在运行中可能会使用到的一些数据,包括图标、位图、菜单等。开发人员可以在资源脚本(.rc)中配置资源,在程序构建时,资源编译器会将资源编译为资源文件(.res),然后由链接器链接到可执行文件中。
对话框:一种临时性窗口,一般用来显示信息,获取用户输入等。对话框也是一种窗口,也可以使用控件,也有消息处理函数等。但又是一种特殊的窗口,不同点在于可以通过资源来创建对话框,对话框及对话框上所显示的所有控件都可以在资源脚本中配置,而窗口不可以。
线程消息队列:Windows系统为每一个线程创建消息队列,从消息队列中获取消息使用GetMessage函数,也可以调用API函数将消息添加到消息队列中。在开发多线程的图形用户界面程序时,最好将所有的窗口创建放置在同一个线程中,子窗口的创建最好在主窗口的消息处理函数中,这样能保存消息都集中在同一个线程。如果在其他线程中需要操作界面,可能直接使用PostThreadMessage、SendMessage等API想窗口发送自定义消息。PostMessage与SendMessage不同的是,PostMessage只是将消息放置在线程的消息队列之后便立即返回,而SendMessage是直接将消息交给窗口消息处理函数。
MSG 讯息结构
WNDCLASS 视窗类别结构
PAINTSTRUCT 绘图结构
RECT 矩形结构
HINSTANCE 执行实体(程序自身)代号
HWND 视窗代号
HDC 装置内容代号
HICON 图示代号
HCURSOR 滑鼠游标代号
HBRUSH 画刷代号
SetLayeredWindowAttributes 透明化窗口
SetScrollRange设置滚动条范围
SetScrollPos 指定滑块在滚动条范围中的位置
SetScrollInfo设置页面大小也就是设置滑块大小
添加滚动条 在CreateWIndow第三个参数中包括 WS_VSCROLL(垂直滚动条)或WS_HSCROLL(水平滚动条)
GetScrollInfo 该函数找到滚动条的参数,包括滚动条位置的最小值、最大值,页面大小,滚动按钮的位置等
RegisterClass 注册窗口类。
RegisterClassEx 注册窗口类,支持扩展属性。
CreateWIndow 创建窗口。
CreateWIndowEx 创建窗口,支持扩展风格。
ShowWindow 显示窗口,可设置显示方式。
DefWindowProc 系统默认窗口处理过程。
SetWindowPos 设置窗口位置。
SetWindowLong 可实现窗口的多种属性设置。
GetMessage 从线程消息队列中获取消息。
TranslateMessage 转换某些键盘消息。
DispatchMessage 将消息发送到消息处理函数。
PostMessage 投递消息。
SendMessage 将消息发送到窗口处理过程函数。
PostQuitMessage 将WM_QUIT消息放置在消息队列中。
PlaySound 播放一个音效档案
BeginPaint 开始绘制视窗
GetClientRect 取得视窗显示区域的大小
DrawText 显示字串 TEXTOUT 显示文本字串
SetTextAlign 显示的字符串是否居中
SetTextColor 设置指定设备环境(HDC)的字体颜色
EndPaint 结束绘制视窗
GetDC 开始绘制视窗 返回窗口客户区的设备环境句柄
RleaseDC 结束绘制视窗
SetPixel 该函数将指定坐标处的像素设为指定的颜色
GetPixel 获取DC中每个像素当前的颜色值
GetWindowsDC返回整个窗口设备环境句柄 WM_NCPAINT (非客户区绘制)
GetSytemMetrics 获取用户界面尺寸 返回的是windows中各种图形项 例如(图标,鼠标指针,标题栏和滚动栏)的尺寸信息。
GetTextMetrics 获取字体尺寸 返回的是字体的各种信息 X Y 等高度
PostQuitMessage 在讯息列中插入一个退出程序信息
DefWindowProc 执行内定的讯息处理
LoadMenu 加载资源菜单。
TrackPopupMenuEx 弹出菜单。
CreateMenu 创建空菜单。
InsertMenuItem 增加菜单项。
AppendMenu 给菜单附加一个新的项。
DeleteMenu 删除菜单项。
ModifyMenu 修改菜单项。
CreateDialog 从资源中创建无模式对话框,设置对话框消息处理过程。
CreateDialogParam 从资源中创建无模式对话框,设置对话框消息处理过程,与上面不同的是在对话框显示前后发送WM_INITDIALOG消息。
DialogBox 从资源中创建无模式对话框,设置对话框消息处理过程。
DialogBoxParam 从资源中创建无模式对话框,设置对话框消息处理过程,与上面不同的是在对话框显示前后发送WM_INITDIALOG消息。
CreateDialogIndirect 不依赖资源从内存中直接创建对话框。
CreateDialogIndirectParam 不依赖资源从内存中直接创建对话框,与上面不同的是在对话框显示前后发送WM_INITDIALOG消息。
DialogBoxIndirect 不依赖资源从内存中直接创建对话框。
DialogBoxIndirectParam 不依赖资源从内存中直接创建对话框,与上面不同的是在对话框显示前后发送WM_INITDIALOG消息。
控件
实际上是一种特殊的窗口。每一种控件有固定的样式、消息处理过程等,系统将这些属性做了固定的模式化处理,并提前注册为窗口类。这些控件在程序设计时不用再重新注册,也不用再去定义其消息处理函数、界面样式、窗口大小等,可以直接使用。
在程序使用控件之前,最好先调用InitCommonControls API函数以保证调用控件所需使用的动态链接库被加载。
Tree View控件
创建Tree View控件使用WC_TREEVIEW类,WC_TREEVIEW是一个字符串常量,实际值为“SysTreeView32”。在使用控件时,新创建的控件必须有一个父窗口。所有的子窗口再被用户操作后,会向主窗口发送WM_NOTIFY通知。主窗口在收到子窗口的通知处理消息,弹出右键菜单等。
TreeView_SetImageList 设置Tree View图标列表。
TreeView_InsertItem 实现增加节点的宏。在增加节点前,需填充TVINSERTSTRUCT结构,致命控件的句柄、父节点句柄、显示的文字,被选择和未被选择时的图标(ImageList的索引)。
TreeView_HitTest 测试是否单击的节点,返回被单击节点的句柄。需要填充TVHITTESTINFO结构,指定单击的鼠标位置。
TreeView_SelectItem 用户右键单击节点后,节点并不会自动被选中,而需要调用该函数来选中。
List View控件
创建List View控件使用WC_LISTVIEW,List View有很多样子,包括“详细信息”(LVS_REPORT)、“图标”(LVS_ICON大图标、LVS_SMALLICON小图标)、“列表”(LVS_LIST)等。LVM_SETVIEW消息可以设置List View的显示样式。
ListView_SetImageList 设置List View图标列表。
ListView_InsertColumn 插入分栏,参数为LVCOLUMN。
ListView_InsertItem 插入项,参数为LVITEM。
文本框
文本框控件具有基本的文本编辑功能。创建文本框控件所使用的控件窗口类为“EDIT”,文本样式也有很多样式,通常包括市多行(ESMULTILINE)还是单行、是否是密码框(ES_PASSWORD)、是否只能输入数字(ES_NUMBER)、是否将全大写、全小写(ESUPPERCASE、ES_LOWERCASE)、文字的对齐方式(ES_LEFT、ES_CENTER、ES_RIGHT),是否是自动换行(ES_AUTOVSCROLL)等。文本框还支持一些基本的文本操作,包括复制、剪切、粘贴等。
创建完文本框控件后可以使用消息来设置和获取文本框中的文字。WM_SETTEXT用于设置文字。