• 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 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  -- 缓冲区的长度(含结尾空字符,使用时注意加,防止溢出.

    lParam   --- 缓冲区指针

    GetWindowText ();//获取控件文本

    WM_SETTEXT  --设置控件文本的内容

    wParam  ---- 0

    lParam   ----缓冲区指针(必须指向以 结尾的字符串)

    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

    );

  • 相关阅读:
    CodeForces 796D bfs
    2017 UESTC Training for Graph Theory
    CodeForces 776D 2-SAT
    CodeForces 776E 数学规律,欧拉
    希尔排序
    怎么把大数据的二维数组转化为一维数组????
    关于while((c=getchar()))的一些应用与思考
    uva 1586 Molar mass(Uva-1586)
    uva 1585 Score(Uva-1585)
    uva1584 Circular Sequence(Uva-1584)
  • 原文地址:https://www.cnblogs.com/haomiao/p/11646556.html
Copyright © 2020-2023  润新知