Windows程序设计4(文字、对话框、各控件)
一、 文字
1.绘制文字:
TextOut – 绘制单行文字: 将文字绘制在指定坐标位置
BOOL TextOut(
HDC hdc, // 设备上下文
int nXStart, // 文本行开始位置
int nYStart, //
LPCTSTR lpString, // 文本串
int cbString // 文本字符串的长度
);//成功返回TRUE,失败返回FALSE
BOOL ExtTextOut(
HDC hdc, //DC句柄
int X, //输出X位置
int Y, //输出Y位置
UINT fuOptions, //输出选项
CONST RECT* lprc, //输出的矩形框
LPCTSTR lpString, //字符串
UINT cbCount, //字符数量
CONST int* lpDx //字符间距的数组
DrawText- 在矩形内绘制文字
int DrawText(
HDC hDC, //DC句柄
LPCTSTR lpString, //字符串
int nCount, //字符串长度
LPRECT lpRect, //绘制文字的矩形框,区域
UINT uFormat //绘制的方式,文本格式
);//成功返回文本高度,失败返回0
uFormat:
DT_LEFT –靠左
DT_CENTER _水平居中
DT_RIGHT –靠右
DT_TOP -靠上
DT_VCENTER -垂直居中
DT_BOTTOM -靠下
DT_SINGLELINE -单行
DT_WORDBREAK -按单词进行
DT_WORD_ELLIPSIS -显示不下的单词以省略号表示
DT_NOCLIP -超出矩形区域部分不做裁剪
DT_NOPEFDIX -不转义字符
2.文字颜色和背景:
文字颜色
SetTextColor
文字背景色
SetBkColor
文件背景模式
SetBkMode
3.字体相关:
Window常用的字体格式为 TureType 字体
字体名 - 标识字体类型
HFONT - 字体句柄
1) 字体使用:
创建字体:
HFONT CreateFont(
int nHeight, //字体高度
int nWidth, //字体宽度
int nEscapement, //字符串倾斜角度
int nOrientation,//字符旋转角度
int fnWeight, //字体的粗细
DWORD fdwItalic, //斜体
DWORD fdwUnderline, //字符下划线
DWORD fdwStrikeOut, //删除线
DWORD fdwCharSet, //字符集
DWORD fdwOutputPrecision,//输出精度
DWORD fdwClipPrecision,//剪切精度
DWORD fdwQuality,//输出质量
DWORD fdwPitchAndFamily,//匹配字体
LPCTSTR lpszFace //字体名称
);//成功返回字体句柄,失败返回NULL
HFONT CreateFontIndirect(
CONST LOGFONT *lplf // 逻辑字体结构
);
2) 应用字体到DC:
HFONT hfontOld=SelectObject(hdc,hfontNew);
3) 绘制文字:
DrawText
ExtTextOut
TextOut
4) 恢复(取出)字体:
SelectObject(hdc,hfontOld);
5) 删除字体:
DeleteObject(hfontNew)
二、对话框窗口
1.对话框分类:
模(态)式对话框 - 当对话框显示时,会禁止其他窗口的输入等用户交互操作。
非模态对话框-在对话框显示后,其他窗口同样可以接收输入等用户交互操作。
2.模态对话框基本使用:
1 对话框窗口处理函数
BOOL CALLBACK DialogProc(
HWND hwndDlg, //窗口句柄
UINT uMsg, //消息ID
WPARAM wParam, //消息参数
LPARAM lParam //消息参数
);
返TRUE-表示DialogProc函数中已处理这个消息,缺省处理函数不需再处理。
返回FALSE- 表示DialogProc函数未处理这个消息,交给缺省处理函数处理。
不需要调用缺省对话框窗口处理函数。
缺省对话框处理函数如下:
LRESULT CALLBACK DefDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
// pfunDlgProc为指向自定义处理函数指针,使得调用自定义处理函数
///若没有自定义,指向NULL,则执行后续代码,默认处理方式。
If(pfunDlgProc(hDlg,uMsg,wParam,lParam)) return 0;
Switch(uMsg)
{
………..
}
…….
}
2 注册窗口类(可选,基本不使用,由系统自动完成)
3 创建对话框
int DialogBox(
HINSTANCE hInstance,//应用程序实例句柄
LPCTSTR lpTemplate, //对话框模板资源ID
HWND hWndParent, //对话框父窗口
DLGPROC lpDialogFunc //对话框窗口处理函数
);
需要添加对话框资源,定义对话框模板,根据模板创建对话框窗口。父窗口为NULL,表示桌面窗口为父窗口。
DialogBox是一个阻塞函数,只有当对话框关闭后才会返回,继续执行后续代码。若成功返回值是通过EndDialog(销毁对话框进程)设置的,失败则是-1。
4 对话框的(销毁)关闭
BOOL EndDialog(
HWND hDlg,//关闭的对话框窗口句柄
int nResult //指定关闭创建对话框的返回值
);
nResult是DialogBox函数退出时的返回值。
关闭模式对话框,只能使用EndDialog,不能使用DestroyWindow等函数。
由于模态对话框会用自己的消息循环挂起主消息循环,故只能用EndDialog函数销毁模式对话框,DestryWindow函数虽然也可以销毁,但是它不能恢复消息循环。
5 对话框消息
WM_INITDIALOG - 对话框创建之后显示之前,通知对话框窗口处理函数,可以完成自己的初始化相关的操作。不能收到WM_CREATE消息。
参数说明:
hwndFocus = (HWND) wParam; // 接受焦点的控制句柄,
lInitParam = lParam; // 初始化变量
3. 非模态对话框的使用:
1 对话框窗口处理函数 DialogProc
2 创建对话框
HWND CreateDialog(
HINSTANCE hInstance, //应用程序实例句柄
LPCTSTR lpTemplate, //模板资源ID
HWND hWndParent, //父窗口
DLGPROC lpDialogFunc //窗口处理函数
);
非阻塞函数,创建成功返回窗口句柄,失败返回NULL,需要使用ShowWindow函数显示对话框。没有自己的消息循环,只是一个普通的子窗口,最好不要用EndDialog去销毁。
父窗口为NULL,表示桌面窗口为父窗口。
3 对话框的关闭(销毁)
关闭时使用DestroyWindow销毁窗口,不能使用EndDialog关闭对话框。
BOOL DestroyWindow(
HWND hWnd //窗口句柄
);//成功返回TRUE,失败返回FALSE。
4 对话框的消息
WM_INITDIALOG - 对话框创建之后显示之前,通知对话框窗口处理函数,可以完成自己的初始化相关的操作。参数同上。也不能收到WM_CREATE消息。
4. 对话框窗口与普通窗口比较总结:
1 创建
模式对话框 - DialogBox,阻塞函数
无模式对话框 - CreateDialog
普通窗口 – CreateWindow / CreateWindowEx
2 窗口处理函数
对话框 - DialogProc ,调用缺省下,若有自定义处理函数,则调用自定义处理函数。即是缺省的调用自定义的
普通窗口 - WindowProc,自定义处理函数调用缺省处理函数DefWndProc。
3 窗口消息
普通窗口 - WM_CREATE
对话框 - WM_INITDIALOG
4 窗口关闭
模式对话框 - EndDialog
无模式对话框 / 普通窗口 - DestroyWindow
三、各类子控件的使用
1. 系统预定义的窗口类,相应窗口的处理函数等都已经由系统完成如:按钮,编辑框
2. 通常情况下控件预定义的窗口过程函数可以处理绝大多数消息,只有在比较特殊的情况下,可以通过子类化定制其窗口过程函数。
子控件的创建
不需要注册,直接使用CreateWindow/Ex
创建该类的窗口。子控件创建时,每个控件
都具有一个ID号。
3. 控件子窗口可以通过唯一的ID标识。
4. 程序与控件通过消息交换数据。
1)窗口消息:程序通过SendMessage函数发送给控件的消息。如设置获取控件的文本,激活/禁用控件。
2)通知消息:当控件有事件发生,控件会向父窗口发送特定的通知消息,父窗口可以在其窗口过程函数中处理此通知消息。
1、静态框
1)用来显示文字、图标、位图等。
文字静态框 - 显示文字
图标静态框 - 显示图标,设置SS_ICON/SS_BITMAP
2)窗口类:STATIC
3) 风格:SS_ICON -图标
SS_BITMAP --位图
SS_BLACKFRAM ---黑框
SS_BLACKRECT –-黑块
SS_GRAYFRAME --灰框
SS_GRAYRECT ---灰块
SS_LEFT ---靠左
SS_CENTER ----居中
SS_RIGHT -----靠右
SS_NOTIFY ----可发通知
SS_NOPREFIX ----不对&做转义
4)创建:
CreateWindow / CreateWindowEx
CreateWindow(“STATIC”,”标题”,…..);
假设图标 / 位图的ID 是101;
CreateWindow(“STATIC”,”#101”,…);
控件ID通过CreateWindow / CreateWindowEx函数hMenu参数设置。
5)窗口消息:SendMessage发送到控件即可
STM_SETICON --设置图标
wParam --–图标句柄
lParam -----0
STM_GETICON ---获取图标,通过SendMessage返回图标句柄
wParam ----0
lParam ----0
STM_SETIMAGE --- 设置图像
wParam --图像类型(IMAGE_ICON / IMAGE_BITMAP / IMAGE_CURSOR)
lParam --图像句柄
STM_GETIMAGE ----获取图像,通过SendMessage返回图像句柄
wParam --图像类型
lParam --0
6)通知消息
1)需要创建时应用SS_NOTIFY风格
2) 通知消息通过WM_COMMAND 消息传递
wParam -LOWORD:菜单、加速键、控件ID
HIWORD:0(菜单)、1(加速键)、通知码(控件)
lParam -NULL(菜单、加速键),句柄(控件)
通知码:
STN_CLICKED 单击
STN_DBLCLK 双击
STN_DISABLE 禁用
STN_ENABLE 激活
点击关闭按钮:
->WM_SYSCOMMAND(wParam==SC_CLOSE)àDefWindowProc->CloseWindow->WM_CLOSE->DefWindowProc->DestroyWindow->销毁窗口,然后发送WM_DESTROY->发送WM_QUIT->GetMessage返回FALSE,->结束消息循环->进程结束。
2、按钮
1)按照按钮风格分类:
1.下压式按钮:BS_PUSHBUTTON/BS_DEFPUSHBUTTON
2. 分组框:BS_GROUPBOX
3. 复选框:
两态(两种状态)复选框:
BS_CHECKBOX (通过代码设置状态)
BS_AUTOCHECKBOX (系统自动设置状态)
三态(三种状态)复选框:
BS_3STATE (通过代码设置状态)
BS_AUTO3STATE (系统自动设置状态)
4. 单选框(每组单选框中只能同时有1个被选择):
BS_RADIOBUTTON (通过代码设置状态)
BS_AUTORADIOBUTTON (系统自动设置状态)
2) 窗口类: BUTTON
3) 通知消息:
BN_CLICKED --单击
4)窗口消息:
BM_SETCHECK --- 设置选择状态
wParam -- BST_CHECKED(选择状态) / BST_UNCHECKED(非选择状态) / BST_INDETERMINATE(灰)
lParam --0
BM_GETCHECK ---- 获取选择状态,通过SendMessage返回。
wParam --0
lParam --0
对于单选按钮使用WS_GROUP风格,实现单选按钮的组内互斥,组间独立。
从一个具有WS_GROUP风格的按钮到下一个具有WS_GROUP风格时为止。
故只需要进入某组的单选按钮均加上风格WS_GROUP即可.
3、编辑框
1)分类:
1.单行编辑框:只能编辑一行文字。
2.多行编辑框:可以编辑多行文字。
3.密码编辑框:输入任何字符都显示类似于”*”的字符。
2)类名:EDIT
3)风格:
ES_AUTOHSCROLL 水平方向自动滚动
ES_AUTOVSCROLL 垂直方向自动滚动
ES_LEFT 文字靠左
ES_CENTER 文字居中
ES_RIGHT 文字靠右
ES_MULTILINE 多行
ES_NUMBER 只能输入数字(0~9)
ES_PASSWORD 密码,显示“*”。
ES_READONLY 只读
ES_UPPERCASE 大写的字符显示
4) 窗口消息:
WM_GETEXTLENGTH ——获取控件文本长度,SendMessage返回
wParam --0
lParam --0
GetWindowTextLength (); //获取文本的长度
WM_GETTEXT ---获取控件文本的内容。
wParam -- 缓冲区的长度(含结尾空字符,使用时注意加\0,防止溢出.)
lParam --- 缓冲区指针
GetWindowText ();//获取控件文本
WM_SETTEXT --设置控件文本的内容
wParam ---- 0
lParam ----缓冲区指针(必须指向以 \0结尾的字符串)
EM_LIMITTEXT ----设置编辑框的最大容纳多少字符。
wParam ---- 最大字符数
lParam -----0
WM_UNDO ---恢复
wParam ---0
lParam ----0
WM_CUT ---剪切
wParam --0
lParam ---0
WM_COPY ---复制
wParam --0
lParam ---0
WM_PASTE ---粘贴
wParam --0
lParam ---0
WM_CLEAR ---删除
wParam --0
lParam ---0
EM_SETSEL -----设置选取范围
wParam ----选取区的起始字符索引号
lParam ----选取区的终止字符索引号
WM_GETFONT ----获取字体,,通过SendMessage返回字体句柄
wParam --0
lParam --- 0
WM_SETFONT ----设置字体
wParam --字体句柄
lParam --- 是否立即重绘,如:MAKEPARAM(TRUE / FALSE , 0 );
5) 通知消息:
EN_ERRSOACE ---分配内存失败
EN_MAXTEXT ----字符数超过上限
EN_UPDATE -----文本内容发生变化之后,更新显示之前。
EN_CHANGE ------文本内容发生变化并且更新显示之后。
4、组合框
- 1 组合框相关
组合框的分类
1.1 简单组合框 - CBS_SIMPLE
1.2 下拉式组合框 - 可以输入,CBS_DROPDOWN
1.3 下拉列表式组合框 - 只能从选项中选择
CBS_DROPDOWNLIST
组合框窗口类 - COMBOBOX
- 2 组合框的使用
2.1 创建组合框 CreateWindowEx / CreateWindow创建
2.2 选项的添加
CB_ADDSTRING - WPARAM 不使用
LPARAM 字符串指针
CB_INSERTSTRING - WPARAM 在此之前插入,从0开始
LPARAM 字符串指针
2.3 选项的删除
CB_DELETESTRING - 删除指定项
WPARAM --选项索引
LPARAM ---0
CB_RESETCONTENT - 清除所有项
WPARAM -- 0
LPARAM --0
2.4 获取和设置选择项
CB_GETCURSEL - 获取选择项,SendMessage()返回当前选择项的索引,无选择返回CB_ERR(-1);
wparam 0
lparam 0
CB_SETCURSEL - 设置当前被选择项
2.5 查找选择项 (匹配忽略大小写)
CB_FINDSTRING – 非精确匹配查找,SendMessage返回匹配选项的索引,从选项的起始字符查找包含字符串,无匹配返回CB_ERR
WPARAM 查找起点的前一个索引
LPARAM 匹配的字符串指针
CB_FINDSTRINGEXACT – 精确匹配,查找的字符串
WPARAM 查找起点的前一个索引
LPARAM 匹配的字符串指针
CB_SELECTSTRING – 非精确查找,查找并设置成当前被选择项
WPARAM 查找起点的前一个索引
LPARAM 匹配的字符串指针
2.6 获取选项的字符
CB_GETLBTEXTLEN - 获取选项的字符长度
WPARAM ---选项索引
LPARAM ----0
CB_GETLBTEXT - 获取选项的字符内容
WPARAM ---选项索引
LPARAM ----缓冲区指针
注意:对于带编辑框的组合框(SIMPLE,DROPDOWN)的文本,通过WM_GETTEXTLENGTH/ WM_GETTEXT消息获取。
输入的字符串
WM_GETTEXT
2.7 设置/获取选项的附加数据 通过SendMessage设置附加数据,返回获取附加数据
CB_SETITEMDATA ---设置选项附加数据
Wparam 选项索引
Lparam 附加数据
CB_GETITEMDATA ----获取选项附加数据
WPARAM 选项索引
LPARAM 0
2.8 目录和文件的显示
CB_DIR - 在组合框中显示指定路径下的文件和子目录
WPARAM 文件类型
LPARAM 路径字符串指针
其中Wparam 可取以下值的位或:
DDL_ARCHIVE |
普通文件 |
DDL_DIRECTORY |
目录(带[]显示) |
DDL_DRIVES |
驱动文件 |
DDL_EXCLUSIVE |
只包含指定属性的文件 |
DDL_HIDDEN |
隐藏文件 |
DDL_READONLY |
只读文件 |
DDL_READWRITE |
可读写文件. |
DDL_SYSTEM |
系统文件 |
2.9 选项的附加数据
在每个选项中,可以保存自定义的数据
CB_SETITEMDATA - 将数据保存到指定选项
CB_GETITEMDATA - 从指定选项获取数据
3 通知消息(WM_COMMAND中)
CBN_SELCHANGE - 当前被选择项发生变化后,通知父窗口。
CBN_EDITCHANGE - 当输入发生变化后,仅对SIMPLE/ DROPDOWN有效
5、列表框(去除编辑框的组合框)
很大程度上同组合框。包括添加删除显示目录等均差不多的。
6、滚动条
1 滚动条分类风格:
垂直滚动条 - SBS_VERT
水平滚动条 - SBS_HORZ
2 滚动条创建
类名:SCROLLBAR
3 窗口消息
SBM_SETRANGE --设置滚动范围
wParam 最小值位置
lParam 最大值位置
SBM_GETRANGE --获取滚动范围
wParam 表示最小位置的int变量的指针
lParam 表示最大位置的int变量的指针
SBM_SETPOS ---设置滚动条位置
wParam 滚动位置
lParam 是否重绘,TRUE/ FALSE
SBM_GETPOS --获取滚动条位置,通过SendMessage返回
wParam 0
lParam 0
4 通知消息
WM_HSCROLL 水平滚动变化时
WM_VSCROLL 垂直滚动变化时
wParam --LOWORD 滚动码,HIWORD ---当前位置(仅对SB_THUMBTRACK/SB_THRUMPOSITION滚动码有效)
lParam ---滚动条控件句柄
滚动码:
SB_ENDSCROLL Ends scroll
SB_LINELEFT 点左箭头
SB_LINERIGHT 点右箭头
SB_PAGELEFT 点左空白
SB_PAGERIGHT 点右空白
SB_LINEUP 点上箭头
SB_LINEDOWN 点下箭头
SB_PAGEUP 点上空白
SB_PAGEDOWN 点下空白
SB_THUMBTRACK 拖动滑块
SB_THUMBPOSITION 释放滑块
注意:窗口附带滚动条也使用同样的消息处理,
在判断滚动条类型时,可以判断LPARAM参数是否为NULL:
1)控件滚动条为控件窗口句柄
2)窗口附带的为NULL
GetScrollInfo()///获取滚动条信息
BOOL GetScrollInfo(
HWND hwnd, // handle to window with scroll bar
int fnBar, // scroll bar flag
LPSCROLLINFO lpsi // pointer to structure for scroll parameters
);
SetScrollInfo()///设置滚动条信息
int SetScrollInfo(
HWND hwnd, // handle to window with scroll bar
int fnBar, // scroll bar flag
LPSCROLLINFO lpsi,
// pointer to structure with scroll parameters
BOOL fRedraw // redraw flag
);