Windows程序设计4(文字、对话框、各控件)

与世无争的帅哥 提交于 2019-12-01 01:47:28

 

一、 文字

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 hDlgUINT uMsgWPARAM wParamLPARAM lParam)

{

// pfunDlgProc为指向自定义处理函数指针,使得调用自定义处理函数

///若没有自定义,指向NULL,则执行后续代码,默认处理方式。

If(pfunDlgProc(hDlguMsgwParamlParam)) 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 //指定关闭创建对话框的返回值

);

nResultDialogBox函数退出时的返回值。

关闭模式对话框,只能使用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

  HIWORD0(菜单)、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

);

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!