win32 控件

用户输入(缩小了用户的输入范围,或者提示用户的操作)

一般情况下可以在窗口上显示,一般不会在主窗口上进行显示。

需要对话框来进行承载。

对话框:是一个特殊的窗口,主要是用于用户的输入和布局控件。

对话框分两类:模态和非模态

  • 模态对话框:阻塞(同步)模式,对这个对话框之外的应用程序窗口来进行操作,必须要先操作完当前对话框

  • 非模态对话框:非阻塞(异步)模式,对这个对话框之外的应用程序窗口来进行操作,可以直接操作

对话框创建步骤

  1. 添加对话框资源
  2. 调用一个函数去创建一个对话框(模态:DialogBox,非模态:CreateDialog)
  3. 创建一个对话框的的窗口处理函数
  4. 销毁对话框(模态:EndDialog,非模态:DestroyWindow)

模态对话框

阻塞(同步)模式,对这个对话框之外的应用程序窗口来进行操作,必须要先操作完当前对话框

//模态对话框
int DialogBox(HINSTANCE hInstance,  //应用程序实例句柄
              LPCTSTR lpTemplate,   //对话框模板
              HWND hWndParent,      //标识拥有对话框的窗口。
              DLGPROC lpDialogFunc);//对话框回调函数
//销毁对话框
BOOL EndDialog(HWND hDlg,    //表示要被清除的对话框窗口
               int nResult); //指定从创建对话框函数返回到应用程序的值

代码示例

//WndProc消息处理函数中
switch (message)
{
    //鼠标的左键按下
    case WM_LBUTTONDOWN: 
    {
		DialogBox(hInst,//哪个实例需要对话框
                 MAKEINTRESOURCEW(IDD_DIALOG1),//对话框名字
                 hWnd,  //父窗口句柄
                 DlgProc);//对话框回调函数
    }
        break;
}

//对话框回调函数
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        {
            switch(wParam)
            {
                //点击按钮做相应的操作
                case IDC_BUTTON1:
                    //todo
                    MessageBox(0,0,0,0);
                    break;
                //点击OK结束对话框
                case IDOK:
                    EndDialog(hDlg, LOWORD(wParam));
                    return (INT_PTR)TRUE;
                    break;
                case IDCANCEL:
                    break;
            }
        }
    }
    return (INT_PTR)FALSE;
}

非模态对话框

非阻塞(异步)模式,对这个对话框之外的应用程序窗口来进行操作,可以直接操作

//创建
HWND CreateDialog(HINSTANCE hlnstance,  //应用程序实例句柄
                  LPCTSTR lpTemplate,   //对话框模板
                  HWND hWndParent,      //标识拥有对话框的窗口。
                  DLGPROC IpDialogFunc);//对话框回调函数
//显示
BOOL ShowWindow(HWND hWnd,    //指定窗口句柄
                int nCmdShow);//指定窗口如何显示

显示窗口nCmdShow的值

说明
SW_FORCEMINIMIZE在WindowNT5.0中最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数。nCmdShow=11。
SW_HIDE隐藏窗口并激活其他窗口。nCmdShow=0。
SW_MAXIMIZE最大化指定的窗口。nCmdShow=3。
SW_MINIMIZE最小化指定的窗口并且激活在Z序中的下一个顶层窗口。nCmdShow=6。
SW_RESTORE激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。nCmdShow=9。
SW_SHOW在窗口原来的位置以原来的尺寸激活和显示窗口。nCmdShow=5。
SW_SHOWDEFAULT依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。nCmdShow=10。
SW_SHOWMAXIMIZED激活窗口并将其最大化。nCmdShow=3。
SW_SHOWMINIMIZED激活窗口并将其最小化。nCmdShow=2。
SW_SHOWMINNOACTIVE窗口最小化,激活窗口仍然维持激活状态。nCmdShow=7。
SW_SHOWNA以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=8。
SW_SHOWNOACTIVATE以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=4。
SW_SHOWNORMAL激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。nCmdShow=1。

代码演示

//全局窗口句柄,用于非模态对话框窗口句柄(模态不需要原因为:模态对话框操作完之前,不能操作其他窗口)
HWND g_hDlgWnd;
//WndProc消息处理函数中
switch (message)
{
    //鼠标的左键按下
    case WM_LBUTTONDOWN: 
    {
        //非模态对话框
		g_hDlgWnd = CreateDialog(hInst,  //哪个实例需要对话框
                    MAKEINTRESOURCEW(IDD_DIALOG1),//对话框名字,资源
                    hWnd,    //父窗口句柄
                    DlgProc);//对话框回调函数
        //显示非模态对话框(窗口创建完需要显示一下)
        ShowWindow(g_hDlgWnd,SW_SHOWNORMAL);
    }
        break;
}

//对话框回调函数
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    //初始化对话框消息(参照WM_CREATE来理解)
    case WM_INITDIALOG:
        //这里中控件的动态添加
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        {
            switch(wParam)
            {
                //点击按钮做相应的操作
                case IDC_BUTTON1:
                    //todo
                    MessageBox(0,0,0,0);
                    break;
                //点击OK结束对话框
                case IDOK:
                    //销毁非模态对话框
                    DestroyWindow(g_hDlgWnd);
                    return (INT_PTR)TRUE;
                    break;
                case IDCANCEL:
                    break;
            }
        }
    }
    return (INT_PTR)FALSE;
}

控件

也是一个特殊的子窗口

  • 控件是窗口,只要是窗口就会有消息
  • 是一个子窗口,必须要有一个父窗口
  • 特殊的子窗口,子窗口类型在window中已经定义好
  • 系统是通过小写的标识符来定义控件的窗口类名

注:控件是不需要菜单的,那么菜单这个参数会在空间中用来保存ID号,来标记对应的控件

HWND CreateWindow(LPCTSTR lpClassName,
                  LPCTSTR lpWindowName,
                  DWORD dwStyle,
                  int x,
                  int y,
                  int nWidth,
                  int nHeight,
                  HWND hWndParent,
                  HMENU hMenu,
                  HANDLE hlnstance,
                  LPVOID lpParam);

参数说明

lpClassName

指向一个空结束的字符串或整型数atom。如果该参数是一个整型量,它是由此前调用theGlobalAddAtom函数产生的全局量。这个小于0xC000的16位数必须是lpClassName参数字的低16位,该参数的高位必须是0。

如果lpClassName是一个字符串,它指定了窗口的类名。这个类名可以是任何用函数RegisterClass注册的类名,或是任何预定义的控制类名。请看说明部分的列表。

LPWindowName

指向一个指定窗口名的空结束的字符串指针。

如果窗口风格指定了标题条,由lpWindowName指向的窗口标题将显示在标题条上。当使用Createwindow函数来创建控制例如按钮,选择框和静态控制时,可使用lpWindowName来指定控制文本。

dwStyle

指定创建窗口的风格。该参数可以是下列窗口风格的组合再加上说明部分的控制风格。风格意义:

说明
WS_BORDER创建一个带边框的窗口。
WS_CAPTION创建一个有标题框的窗口(包括WS_BORDER风格)。
WS_CHILD创建一个子窗口。这个风格不能与WS_POPUP风格合用。
WS_CHILDWINDOW与WS_CHILD相同。
WS_CLIPCHILDREN当在父窗口内绘图时,排除子窗口区域。在创建父窗口时使用这个风格。
WS_CLIPSIBLINGS排除子窗口之间的相对区域,也就是,当一个特定的窗口接收到WM_PAINT消息时,WS_CLIPSIBLINGS 风格将所有层叠窗口排除在绘图之外,只重绘指定的子窗口。如果未指定WS_CLIPSIBLINGS风格,并且子窗口是层叠的,则在重绘子窗口的客户区时,就会重绘邻近的子窗口。
WS_DISABLED创建一个初始状态为禁止的子窗口。一个禁止状态的窗口不能接受来自用户的输入信息。
WS_DLGFRAME创建一个带对话框边框风格的窗口。这种风格的窗口不能带标题条。
WS_GROUP指定一组控制的第一个控制。这个控制组由第一个控制和随后定义的控制组成,自第二个控制开始每个控制,具有WS_GROUP风格,每个组的第一个控制带有WS_TABSTOP风格,从而使用户可以在组间移动。用户随后可以使用光标在组内的控制间改变键盘焦点。
WS_HSCROLL创建一个有水平滚动条的窗口。
WS_ICONIC创建一个初始状态为最小化状态的窗口。与WS_MINIMIZE风格相同。
WS_MAXIMIZE创建一个初始状态为最大化状态的窗口。
WS_MAXIMIZEBOX创建一个具有最大化按钮的窗口。该风格不能与WS_EX_CONTEXTHELP风格同时出现,同时必须指定WS_SYSMENU风格。
WS_OVERLAPPED产生一个层叠的窗口。一个层叠的窗口有一个标题条和一个边框。与WS_TILED风格相同。
WS_OVERLAPPEDWINDOW创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX风格的层叠窗口,与WS_TILEDWINDOW风格相同。
WS_POPUP创建一个弹出式窗口。该风格不能与WS_CHILD风格同时使用。
WS_POPUPWINDOW创建一个具有WS_BORDER,WS_POPUP,WS_SYSMENU风格的窗口,WS_CAPTION和WS_POPUPWINDOW必须同时设定才能使窗口某单可见。
WS_SIZEBOX创建一个可调边框的窗口,与WS_THICKFRAME风格相同。
WS_SYSMENU创建一个在标题条上带有窗口菜单的窗口,必须同时设定WS_CAPTION风格。
WS_TABSTOP创建一个控制,这个控制在用户按下Tab键时可以获得键盘焦点。按下Tab键后使键盘焦点转移到下一具有WS_TABSTOP风格的控制。
WS_THICKFRAME创建一个具有可调边框的窗口,与WS_SIZEBOX风格相同。
WS_TILED产生一个层叠的窗口。一个层叠的窗口有一个标题和一个边框。与WS_OVERLAPPED风格相同。
WS_TILEDWINDOW创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU, WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX风格的层叠窗口。与WS_OVERLAPPEDWINDOW风格相同。
WS_VISIBLE创建一个初始状态为可见的窗口。
WS_VSCROLL创建一个有垂直滚动条的窗口。

X

指定窗口的初始水平位置。对一个层叠或弹出式窗口,X参数是屏幕坐标系的窗口的左上角的初始X坐标。对于子窗口,x是子窗口左上角相对父窗口客户区左上角的初始X坐标。如果该参数被设为CW_USEDEFAULT则系统为窗口选择缺省的左上角坐标并忽略Y参数。CW_USEDEFAULT只对层叠窗口有效,如果为弹出式窗口或子窗口设定,则X和y参数被设为零。

Y

指定窗口的初始垂直位置。对一个层叠或弹出式窗口,y参数是屏幕坐标系的窗口的左上角的初始y坐标。对于子窗口,y是子窗口左上角相对父窗口客户区左上角的初始y坐标。对于列表框,y是列表框客户区左上角相对父窗口客户区左上角的初始y坐标。如果层叠窗口是使用WS_VISIBLE风格位创建的并且X参数被设为CW_USEDEFAULT,则系统将忽略y参数。

nWidth

以设备单元指明窗口的宽度。对于层叠窗口,nWidth或是屏幕坐标的窗口宽度或是CW_USEDEFAULT。若nWidth是CW_USEDEFAULT,则系统为窗口选择一个缺省的高度和宽度:缺省宽度为从初始X坐标开始到屏幕的右边界,缺省高度为从初始Y坐标开始到目标区域的顶部。CW_USEDEFAULT只对层叠窗口有效;如果为弹出式窗口和子窗口设定CW_USEDEFAULT标志则nWidth和nHeight被设为零。

nHeight

以设备单元指明窗口的高度。对于层叠窗口,nHeight是屏幕坐标的窗口宽度。若nWidth被设为CW_USEDEFAULT,则系统忽略nHeight参数。

hWndParent

指向被创建窗口的父窗口或所有者窗口的句柄。若要创建一个子窗口或一个被属窗口,需提供一个有效的窗口句柄。这个参数对弹出式窗口是可选的。Windows NT 5.0;创建一个消息窗口,可以提供HWND_MESSAGE或提供一个己存在的消息窗口的句柄。

hMenu

菜单句柄,或依据窗口风格指明一个子窗口标识。对于层叠或弹出式窗口,hMenu指定窗口使用的菜单:如果使用了菜单类,则hMenu可以为NULL。对于子窗口,hMenu指定了该子窗口标识(一个整型量),一个对话框使用这个整型值将事件通知父类。应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的。

hlnstance

与窗口相关联的模块实例的句柄。

lpParam

指向一个值的指针,该值传递给窗口WM_CREATE消息。该值通过在IParam参数中的CREATESTRUCT结构传递。如果应用程序调用CreateWindow创建一个MDI客户窗口,则lpParam必须指向一个CLIENTCREATESTRUCT结构。

返回值:如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL。若想获得更多错误信息,请调用GetLastError函数。

按钮button

按钮代码演示

//全局窗口句柄,用于非模态对话框窗口句柄(模态不需要原因为:模态对话框操作完之前,不能操作其他窗口)
HWND g_hDlgWnd;
//WndProc消息处理函数中
switch (message)
{
    //鼠标的左键按下
    case WM_LBUTTONDOWN: 
    {
        //非模态对话框
		g_hDlgWnd = CreateDialog(hInst,  //哪个实例需要对话框
                    MAKEINTRESOURCEW(IDD_DIALOG1),//对话框名字,资源
                    hWnd,    //父窗口句柄
                    DlgProc);//对话框回调函数
        //显示非模态对话框(窗口创建完需要显示一下)
        ShowWindow(g_hDlgWnd,SW_SHOWNORMAL);
    }
        break;
}

//对话框回调函数
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    //初始化对话框消息(参照WM_CREATE来理解)
    case WM_INITDIALOG:
        //这里中控件的动态添加,button是类名,按钮类,包含很多派生类
         CreateWindow(_T("button"),
                  _T("这是按钮"), //按钮的名字(窗口名字)
                  //WS_CHILD 子窗口,必须给,WS_VISIBLE 可见,BS_PUSHBUTTON下压式按钮
                  WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, //按钮风格,通过风格来决定使用的是哪一种按钮
                  100,        //按钮显示位置的左上角X坐标
                  100,        //按钮显示位置的左上角Y坐标
                  200,        //按钮的宽度
                  50,         //按钮的高度
                  g_hDlgWnd,  //按钮显示的窗口(对话框)
                  (HMENU)5001,//按钮菜单,没有,通过菜单来表示控件ID号
                  hInst,      //窗口实例
                  nullptr);   //
        return (INT_PTR)TRUE;
            
	//命令消息
    case WM_COMMAND:
        {
            switch(wParam)
            {
                //响应5001的按钮消息
                case 5001:
                    MessageBox(hWnd,_T("这是按钮"),_T("按钮"),IDOK);
                    break;
                //点击按钮做相应的操作
                case IDC_BUTTON1:
                    //todo
                    MessageBox(0,0,0,0);
                    break;
                //点击OK结束对话框
                case IDOK:
                    //销毁非模态对话框
                    DestroyWindow(g_hDlgWnd);
                    return (INT_PTR)TRUE;
                    break;
                case IDCANCEL:
                    break;
            }
        }
    }
    return (INT_PTR)FALSE;
}

组合框BS_GROUPBOX

//组合框BS_GROUPBOX表示组合框
CreateWindow(_T("button"),
                  _T("这是组合框"), //组合框的名字(窗口名字)
                  WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 
                  100,        //组合框显示位置的左上角X坐标
                  80,        //组合框显示位置的左上角Y坐标
                  400,        //组合框的宽度
                  350,        //组合框的高度
                  g_hDlgWnd,  //按钮显示的窗口(对话框)
                  (HMENU)5002,//组合框菜单,没有,通过菜单来表示控件ID号
                  hInst,      //窗口实例
                  nullptr);   //
//静态文本static
CreateWindow(_T("static"),_T("这是一个调查问卷"),WS_CHILD|WS_VISIBLE,120,100,200,30,g_hDlgWnd,(HMENU)5003, hInst,nullptr); 
//单选框 如有没有选择一个风格,那么所有的单选都默认为一组
//WS_GROUP 表示单选的分组,直到下一个WS_GROUP宏都作为一组,或者都加上WS_GROUP没有单选
CreateWindow(_T("button"),_T("男"),WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP,120,120,100,30,g_hDlgWnd,(HMENU)6004, hInst,nullptr); 
CreateWindow(_T("button"),_T("女"),WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,120,140,100,30,g_hDlgWnd,(HMENU)6005, hInst,nullptr); 

//静态文本static
CreateWindow(_T("static"),_T("职业"),WS_CHILD|WS_VISIBLE,120,160,200,30,g_hDlgWnd,(HMENU)5004, hInst,nullptr); 
//单选框 如有没有选择一个风格,那么所有的单选都默认为一组
CreateWindow(_T("button"),_T("老板"),WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP,120,180,100,30,g_hDlgWnd,(HMENU)6006, hInst,nullptr); 
CreateWindow(_T("button"),_T("员工"),WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,120,200,100,30,g_hDlgWnd,(HMENU)6007, hInst,nullptr); 



//静态文本static
CreateWindow(_T("static"),_T("爱好"),WS_CHILD|WS_VISIBLE,120,220,220,30,g_hDlgWnd,(HMENU)5005, hInst,nullptr); 
//复选框BS_AUTPCHECKBOX
CreateWindow(_T("button"),_T("踢球"),WS_CHILD|WS_VISIBLE|BS_AUTPCHECKBOX,120,240,100,30,g_hDlgWnd,(HMENU)6008, hInst,nullptr); 
CreateWindow(_T("button"),_T("吃饭"),WS_CHILD|WS_VISIBLE|BS_AUTPCHECKBOX,120,260,100,30,g_hDlgWnd,(HMENU)6009, hInst,nullptr); 

编辑框edit

//编辑框
CreateWindow(_T("edit"),_T("请输入:"),WS_CHILD|WS_VISIBLE,120,280,100,100,g_hDlgWnd,(HMENU)6005, hInst,nullptr); 

下拉框combobox

分为3类CBS_SIMPLE 简单 CBS_DROPDOWN 下拉式 CBS_DROPDOWNLIST 下拉式列表

下拉框有两个区域:第一个为显示区域,组合框要显示什么字符串,第二个为源区域,组合框提供了哪些字符串可以选择

通过SetDlgltemText只能设置显示区域的内容,要通过SendMessage的方式来设置源区域

//静态文本static
CreateWindow(_T("static"),_T("爱好"),WS_CHILD|WS_VISIBLE,100,100,100,30,g_hDlgWnd,(HMENU)5001, hInst,nullptr); 
//编辑框 WS_BORDER在控件外加边框
CreateWindow(_T("edit"),_T(""),WS_CHILD|WS_VISIBLE|WS_BORDER,120,120,100,100,g_hDlgWnd,(HMENU)6001, hInst,nullptr); 
//按钮
CreateWindow(_T("button"),_T("添加数据"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,220,100,100,30,g_hDlgWnd,(HMENU)7001,hInst,nullptr);
CreateWindow(_T("button"),_T("删除数据"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,340,100,100,30,g_hDlgWnd,(HMENU)7002,hInst,nullptr);
//下拉框
CreateWindow(_T("combobox"),_T(""),WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|WS_BORDER,160,120,100,210,g_hDlgWnd,(HMENU)8001,hInst,nullptr);
//在使用下拉框时,尺寸的高度需要额外注意,一定要留出足够的高度,否则组合框的内容会无法完全显示,这只是预留高度,并不代表只有一行字符串的时候,也是这个高度

下拉框的操作函数

TCHAR strArr[1024] = {};
//对话框回调函数
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    //初始化对话框消息(参照WM_CREATE来理解)
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;  
	//命令消息
    case WM_COMMAND:
        {
            switch(wParam)
            {
                //响应7001的按钮消息
                case 7001:
                    {
                        //获取编辑框的内容
                        GetDlgItemText(g_hDlgWnd,6001,strArr,1023); 
                        //设置下拉框显示区域的内容
                        SetDlgltemText(g_hDlgWnd,8001,strArr);
                        //通过发消息的方式来把字符串添加都源区域
                        //应用程序层级的发送消息,这里发的是一个组合框的控件消息(CB_ADDSTRING,追加字符串消息),把添加的字符串通过lPrarm来传递,WPARAM保存的是插入的下标
                        SendMessage(GetDlgItem(g_hDlgWnd,8001),CB_ADDSTRING,0,(LPARAM)strArr);//尾部追加
                        SendMessage(GetDlgItem(g_hDlgWnd,8001),CB_INSERTSTRING,0,(LPARAM)strArr);//头部插入
                    }
                    break;
                //响应7002的按钮消息
                case 7002:
                    {
                        //删除数据,CB_DELETESTRING 从头部开始删除,WPARAM参数保存的是删除的下标
                        SendMessage(GetDlgItem(g_hDlgWnd,8001),CB_DELETESTRING,2,0);
                        //重置所有的数据CB_RESETCONTENT
                        SendMessage(GetDlgItem(g_hDlgWnd,8001),CB_RESETCONTENT,0,0);
                    }
                    break;
                //点击OK结束对话框
                case IDOK:
                    //销毁非模态对话框
                    DestroyWindow(g_hDlgWnd);
                    return (INT_PTR)TRUE;
                    break;
                case IDCANCEL:
                    break;
            }
        }
    }
    return (INT_PTR)FALSE;
}

得到对话框元素

GetDlgItem()

//获得对话框元素
HWND GetDlgItem(
    _In_opt_ HWND hDlg,    //标识含有控件的对话框
    _In_ int nIDDlgItem);  //指定将被检索的控件标识符,即ID

代码演示

//发送消息
//BM_SETCHECK设置选择。 wPrarm 1 表示选中,0表示未选中
SendMessage(GetDlgItem(g_hDlgWnd,6004),BM_SETCHECK,1,0);

SendMessage(GetDlgItem(g_hDlgWnd,6008),BM_SETCHECK,1,0);   

设置对话框元素

SetDlgItemInt

SetDlgItemText 设置对话框元素文本

atoi -> ascii to int 字符串转int

itoa -> int to ascii int转字符串

//该函数将uValue的值设为对话框控件的文本。
BOOL SetDlgItemInt(HWND hDlg,     //指向对话框窗口的句柄
                   int nIDDlgItem,//要改变其文本的控件ID
                   UINT uValue,   //指向要设置的值
                   BOOL bSigned); //指定uValue是否为一个有符号的值

//该函数设置对话框中控件的文本和标题。
BOOL SetDlgltemText(HWND hDlg,        //指向对话框窗口的句柄
                   int nlDDlgltem,    //标识带有将被设置的标题和文本的控件ID
                   LPCTSTR IpString); //指向一个以NULL结尾的字符串指针,该字符串指针包含了将被复制到控件的文本
//返回值:如果函数调用成功,则返回值为非零值。如果函数调用失败,则返回值为零。若想获得更多的错误信息,请调用GetLastError函数。

代码示例

//全局窗口句柄,用于非模态对话框窗口句柄(模态不需要原因为:模态对话框操作完之前,不能操作其他窗口)
HWND g_hDlgWnd;
//WndProc消息处理函数中
switch (message)
{
    //鼠标的左键按下
    case WM_LBUTTONDOWN: 
    {
        //非模态对话框
		g_hDlgWnd = CreateDialog(hInst,  //哪个实例需要对话框
                    MAKEINTRESOURCEW(IDD_DIALOG1),//对话框名字,资源
                    hWnd,    //父窗口句柄
                    DlgProc);//对话框回调函数
        //显示非模态对话框(窗口创建完需要显示一下)
        ShowWindow(g_hDlgWnd,SW_SHOWNORMAL);
    }
        break;
}

//对话框回调函数
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    //初始化对话框消息(参照WM_CREATE来理解)
    case WM_INITDIALOG:
        //这里中控件的动态添加,button是类名,按钮类,包含很多派生类
         CreateWindow(_T("button"),_T("这是按钮"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,100,100,200,50,g_hDlgWnd,(HMENU)5001,hInst,nullptr);
        return (INT_PTR)TRUE;
            
	//命令消息
    case WM_COMMAND:
        {
            switch(wParam)
            {
                //响应5001的按钮消息
                case 5001:
                    //设置ID为6005的控件文本为你好
                    SetDlgltemText(g_hDlgWnd,6005,_T("你好!"));
                    break;
                //点击按钮做相应的操作
                case IDC_BUTTON1:
                    //todo
                    MessageBox(0,0,0,0);
                    break;
                //点击OK结束对话框
                case IDOK:
                    //销毁非模态对话框
                    DestroyWindow(g_hDlgWnd);
                    return (INT_PTR)TRUE;
                    break;
                case IDCANCEL:
                    break;
            }
        }
    }
    //这里必须返回为False
    return (INT_PTR)FALSE;
}

得到对话框文本元素

GetDlgItemText

GetDlgItemInt

//用GetDlgItemInt函数获取hwndDlg窗口中的IDC_a控件中输入的数值并赋给变量a。
UINT GetDlgItemInt(HWND hDlg,           //控件所在窗口句柄
                   int nIDDlgItem,      //控件标识符(名称)ID
                   BOOL *lpTranslated,  //布尔变量的指针
                   BOOLbSigned);        //有符号或无符号值

//函数以获得与对话框中的控件相关的标题或文本
int GetDlgItemText(HWND hDlg,     //控件所在窗口句柄
                   int nID,       //控件标识符(名称)ID
                   LPTSTR lpStr,  //指向要接收控件的标题或文本的缓冲区
                   int nMaxCount);//指定了要拷贝到lpStr的字符串的最大长度

//如果字符串的长度大于缓冲区的长度,则会被截断,并以空字符结束。

代码示例

//将得到的文本存放到数组srtARR中
TCHAR srtARR[1024]={};
GetDlgItemText(g_hDlgWnd,6005,srtARR,1023);

按钮是否被选中

IsDlgButtonChecked()

//该函数可以确定某个按钮控件是否有选中标志,或者三态按钮控制是否为灰色的、选中的、或两者都不是。
UINT IsDlgButtonChecked(HWND hDlg,      //控件所在窗口句柄 
                        Int nlDBUtton); //指定按钮控制的整型标识符(名称)ID

返回值

使用BS_AUTOCHECKBOX、BS_AUTORADIOBUTTON、BS_AUTO3STATE、BS_CHECKBOX、BS_RADIOBUTIONBS_3STATE样式创建的按钮的返回值可以是如下值之一:

说明
BST_CHECKED表示按钮被选中。
BST_INDETERMINATE表示按钮是灰色的,即为不确定状态(只有具有BS_3STATE或BS_AUTO3STATE样式的按钮才使用该值)。
BST_UNCHECKED表示该按钮未选中(unckecked)。如果该按钮用其他任何样式,那么返回值为零。

代码演示

//命令消息
    case WM_COMMAND:
        {
            switch(wParam)
            {
                //响应5001的按钮消息
                case 5001:
                    //判断按钮是否被选中,选中了弹出一个MessageBox
                    if(IsDlgButtonChecked(g_hDlgWnd,6003))
                    {
                         MessageBox(0,0,0,0);
                    }
                    break;
                //点击按钮做相应的操作
                case IDC_BUTTON1:
                    //todo
                    MessageBox(0,0,0,0);
                    break;
                //点击OK结束对话框
                case IDOK:
                    //销毁非模态对话框
                    DestroyWindow(g_hDlgWnd);
                    return (INT_PTR)TRUE;
                    break;
                case IDCANCEL:
                    break;
            }
        }
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值