一、 文字
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 -- 缓冲区的长度(含结尾空字符,使用时注意加