窗口的按钮和下拉框控件
一、工程创建
- 打开VS,左上角
文件
-新建
-项目
。 - 筛选语言为
C++
,平台为Windows
,项目类型为桌面
,选择Windows桌面向导
,下一步。
Windows桌面向导
- 对项目命名,选定项目路径为先前的文件夹,创建。
- 在应用程序类型中选择
桌面应用程序(.exe)
,勾选空项目,确定。
应用程序类型
- 在解决方案资源管理器窗口中,选中创建的项目,右击,
添加
-新建项
,分别选择C++文件(.cpp)
和头文件(.h)
,改名,添加。
添加文件
二、控件的创建
1、控件
窗口控件种类繁多,按钮、编辑框、列表框、组合框(下拉框)、滚动条等。实际上,它们都属于父窗口的子窗口,因此在创建时,同样是使用CreateWindow
/ CreateWindowEx
函数。在窗口样式的指定时,将其指定为WS_CHILD
就可以使其成为一个子窗口。标准的子窗口控件,也称为通用控件(Common Control)。
对窗口样式指定的选项很多,样式参考。
2、创建控件
创建控件通常在WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
函数内。
具体代码如下:
hwndButton = CreateWindowEx(0, TEXT("Button"), NULL, //子窗口控件句柄
WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_AUTOHSCROLL, //样式指定
10, 420, 150, 25, hwnd, (HMENU)(1014), hInstance, NULL); //位置以及大小
hwndEdit1 = CreateWindowEx(0, TEXT("Edit"), NULL,
WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_READONLY | ES_LEFT |ES_WANTRETURN ,
200, 10, 400, 100, hwnd, (HMENU)(1015), hInstance, NULL);
3、创建多个同类控件
多个同类控件可以用数组搭配循环的形式,简化语句。文章来源:https://www.toymoban.com/news/detail-453903.html
- 定义数组,如下:
static HWND hwndButton[NUM]; // 子窗口控件句柄数组 int arrPos[NUM] = { 0, 30, 60, 90, // 每个子窗口控件的起始Y坐标 130, 160, 190, 220, 260, 290, 320, 350, 390, 450};
- 利用循环,创建一组控件
for (int i = 0; i < NUM; i++) { hwndButton[i] = CreateWindowEx(0, TEXT("Button"), Buttons[i].m_pText, WS_CHILD | WS_VISIBLE | Buttons[i].m_nStyle, 20, arrPos[i], 150, 25, hwnd, (HMENU)(1000 + i), ((LPCREATESTRUCT)lParam)->hInstance, NULL); }
三、下拉框(组合框)配置
组合框由列表和选择字段组成,时编辑控件和列表框组合起来的一种子窗口控件,通俗来说,也叫做下拉框。 该列表显示用户可以选择的选项,并且选择字段显示当前所选内容。
组合框ComboBox
,通常可以用SendMessage
函数进行操作。可以参考Combo Box 用法大全。文章来源地址https://www.toymoban.com/news/detail-453903.html
- 添加组合框选项,如下
SendMessage(hwndComboBox, CB_ADDSTRING, 0, (LPARAM)TEXT("跳绳"));
- 参数1:组合框控件句柄
- 参数2:操作命令,可以参考组合框-消息
- 参数3:其他的消息特定信息。通常设0。
- 参数4:添加的选择项的文本
- 读取组合框当前选项信息
int idx = SendMessage(hwndComboBox, CB_GETCURSEL, 0, 0);
该语句可以将组合框当前的选项序号,返回给前面的数idx
。第一个选项,则返回0;第二个选项,则返回1;…。
四、具体代码
1 、.cpp :
#include <Windows.h>
#include <tchar.h>
#include <strsafe.h>
#include "resource.h"
#include <CommCtrl.h>
#include <windowsx.h>
#pragma comment(lib, "Comctl32.lib")
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
// 函数声明
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
// 按下默认按钮
VOID OnDefPushButton(HWND hwnd);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wndclass;
TCHAR szAppName[] = TEXT("晚会意向调查"); // 程序标题、窗口类名
HWND hwnd;
MSG msg;
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WindowProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = NULL;
RegisterClassEx(&wndclass);
hwnd = CreateWindowEx(0, szAppName, szAppName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 280, 550, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0) != 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
// 全局变量
struct
{
int m_nStyle;
PTSTR m_pText;
}Buttons[] = {
BS_GROUPBOX, (PTSTR)TEXT("年级"),
BS_AUTORADIOBUTTON | BS_NOTIFY | WS_GROUP | WS_TABSTOP, (PTSTR)TEXT("高一"), // BS_AUTORADIOBUTTON 自动单选
BS_AUTORADIOBUTTON | BS_NOTIFY, (PTSTR)TEXT("高二"),
BS_AUTORADIOBUTTON | BS_NOTIFY, (PTSTR)TEXT("高三"),
BS_GROUPBOX, (PTSTR)TEXT("喜欢的音乐"),
BS_AUTOCHECKBOX | BS_NOTIFY | WS_GROUP | WS_TABSTOP, (PTSTR)TEXT("摇滚"), // BS_AUTOCHECKBOX 自动复选
BS_AUTOCHECKBOX | BS_NOTIFY, (PTSTR)TEXT("民谣"),
BS_AUTOCHECKBOX | BS_NOTIFY, (PTSTR)TEXT("流行"),
BS_GROUPBOX, (PTSTR)TEXT("喜欢的节目"),
BS_AUTO3STATE | BS_NOTIFY | WS_GROUP | WS_TABSTOP, (PTSTR)TEXT("小品"), // BS_AUTO3STATE 自动三态复选
BS_AUTO3STATE | BS_NOTIFY, (PTSTR)TEXT("相声"),
BS_AUTO3STATE | BS_NOTIFY, (PTSTR)TEXT("魔术"),
BS_GROUPBOX, (PTSTR)TEXT("意向的晚会时间"),
BS_DEFPUSHBUTTON | BS_NOTIFY | WS_TABSTOP, (PTSTR)TEXT("生成"), // CtrlID 1016
};
int idx = 0;
static HWND hwndComboBox;
static HWND hwndEdit1;
static HWND hwndEdit2;
static HWND hwndEdit3;
static HWND hwndEdit4;
#define NUM (sizeof(Buttons) / sizeof(Buttons[0]))
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HWND hwndButton[NUM]; // 子窗口控件句柄数组
int arrPos[NUM] = { 0, 30, 60, 90, // 每个子窗口控件的起始Y坐标
130, 160, 190, 220,
260, 290, 320, 350,
390, 450};
HINSTANCE hInstance;
switch (uMsg)
{
case WM_CREATE:
// 创建子窗口控件
for (int i = 0; i < NUM; i++)
{
hwndButton[i] = CreateWindowEx(0, TEXT("Button"), Buttons[i].m_pText,
WS_CHILD | WS_VISIBLE | Buttons[i].m_nStyle, 20, arrPos[i],
150, 25, hwnd, (HMENU)(1000 + i),
((LPCREATESTRUCT)lParam)->hInstance, NULL);
}
// 创建下拉框
hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
hwndComboBox = CreateWindowEx(0, TEXT("ComboBox"), NULL,
WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_AUTOHSCROLL,
10, 420, 150, 25, hwnd, (HMENU)(1014), hInstance, NULL);
// 添加一些列表项
SendMessage(hwndComboBox, CB_ADDSTRING, 0, (LPARAM)TEXT("周五"));
SendMessage(hwndComboBox, CB_ADDSTRING, 0, (LPARAM)TEXT("周六"));
SendMessage(hwndComboBox, CB_ADDSTRING, 0, (LPARAM)TEXT("周日"));
SendMessage(hwndComboBox, CB_SETCURSEL, 0, 0);
// 移动3个分组框的位置
MoveWindow(hwndButton[0], 10, arrPos[0], 170, 120, TRUE);
MoveWindow(hwndButton[4], 10, arrPos[4], 170, 120, TRUE);
MoveWindow(hwndButton[8], 10, arrPos[8], 170, 120, TRUE);
return 0;
case WM_COMMAND:
if(HIWORD(wParam) == BN_CLICKED) //否则弹出两次
{
switch (LOWORD(wParam))
{
// 子窗口控件ID常量定义请参见resource.h,可以根据需要在此处理每个控件的点击事件
case IDC_AUTORADIOBUTTON1:break;
case IDC_AUTORADIOBUTTON2:break;
case IDC_AUTORADIOBUTTON3:break;
case IDC_AUTOCHECKBOX1: break;
case IDC_AUTOCHECKBOX2: break;
case IDC_AUTOCHECKBOX3: break;
case IDC_AUTO3STATE1: break;
case IDC_AUTO3STATE2: break;
case IDC_AUTO3STATE3: break;
case IDC_DEFPUSHBUTTON: OnDefPushButton(hwnd); break;
}
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
VOID OnDefPushButton(HWND hwnd)
{
TCHAR szBuf1[128] = { 0 };
TCHAR szBuf2[128] = { 0 };
TCHAR szBuf3[128] = { 0 };
TCHAR szBuf4[128] = { 0 };
TCHAR szBuf[128] = { 0 };
if (IsDlgButtonChecked(hwnd, IDC_AUTORADIOBUTTON1) & BST_CHECKED)
StringCchCopy(szBuf1, _countof(szBuf1), TEXT("年级:高一 "));
if (IsDlgButtonChecked(hwnd, IDC_AUTORADIOBUTTON2) & BST_CHECKED)
StringCchCopy(szBuf1, _countof(szBuf1), TEXT("年级:高二 "));
if (IsDlgButtonChecked(hwnd, IDC_AUTORADIOBUTTON3) & BST_CHECKED)
StringCchCopy(szBuf1, _countof(szBuf1), TEXT("年级:高三 "));
if ((IsDlgButtonChecked(hwnd, IDC_AUTOCHECKBOX1) & BST_CHECKED) || (IsDlgButtonChecked(hwnd, IDC_AUTOCHECKBOX2) & BST_CHECKED) || (IsDlgButtonChecked(hwnd, IDC_AUTOCHECKBOX3) & BST_CHECKED))
{
StringCchCat(szBuf2, _countof(szBuf2), TEXT("喜欢的音乐:"));
if (IsDlgButtonChecked(hwnd, IDC_AUTOCHECKBOX1) & BST_CHECKED)
StringCchCat(szBuf2, _countof(szBuf2), TEXT("摇滚 "));
if (IsDlgButtonChecked(hwnd, IDC_AUTOCHECKBOX2) & BST_CHECKED)
StringCchCat(szBuf2, _countof(szBuf2), TEXT("民谣 "));
if (IsDlgButtonChecked(hwnd, IDC_AUTOCHECKBOX3) & BST_CHECKED)
StringCchCat(szBuf2, _countof(szBuf2), TEXT("流行 "));
//StringCchCat(szBuf2, _countof(szBuf2), TEXT("\t\r"));
}
if ((IsDlgButtonChecked(hwnd, IDC_AUTO3STATE1) & BST_CHECKED)|| (IsDlgButtonChecked(hwnd, IDC_AUTO3STATE2) & BST_CHECKED)|| (IsDlgButtonChecked(hwnd, IDC_AUTO3STATE3) & BST_CHECKED))
{
StringCchCat(szBuf3, _countof(szBuf3), TEXT("喜欢的节目:"));
if (IsDlgButtonChecked(hwnd, IDC_AUTO3STATE1) & BST_CHECKED)
StringCchCat(szBuf3, _countof(szBuf3), TEXT("小品 "));
if (IsDlgButtonChecked(hwnd, IDC_AUTO3STATE2) & BST_CHECKED)
StringCchCat(szBuf3, _countof(szBuf3), TEXT("相声 "));
if (IsDlgButtonChecked(hwnd, IDC_AUTO3STATE3) & BST_CHECKED)
StringCchCat(szBuf3, _countof(szBuf3), TEXT("魔术 "));
//StringCchCat(szBuf3, _countof(szBuf3), TEXT("\t\r"));
}
idx = SendMessage(hwndComboBox, CB_GETCURSEL, 0, 0);
if ((idx == 0)|| (idx == 1)||(idx == 2))
{
StringCchCat(szBuf4, _countof(szBuf4), TEXT("意向的晚会时间: "));
if (idx == 0)
StringCchCat(szBuf4, _countof(szBuf4), TEXT("周五 "));
if (idx == 1)
StringCchCat(szBuf4, _countof(szBuf4), TEXT("周六 "));
if (idx == 2)
StringCchCat(szBuf4, _countof(szBuf4), TEXT("周日 "));
}
StringCchCat(szBuf, _countof(szBuf), szBuf1);
StringCchCat(szBuf, _countof(szBuf), TEXT("\r"));
StringCchCat(szBuf, _countof(szBuf), szBuf2);
StringCchCat(szBuf, _countof(szBuf), TEXT("\r"));
StringCchCat(szBuf, _countof(szBuf), szBuf3);
StringCchCat(szBuf, _countof(szBuf), TEXT("\r"));
StringCchCat(szBuf, _countof(szBuf), szBuf4);
// 弹窗显示
MessageBox(hwnd, szBuf, TEXT("晚会意向调查"), MB_OK);
}
2、resource.h:
#define IDC_GROUPBOX1 1000
#define IDC_AUTORADIOBUTTON1 1001
#define IDC_AUTORADIOBUTTON2 1002
#define IDC_AUTORADIOBUTTON3 1003
#define IDC_GROUPBOX2 1004
#define IDC_AUTOCHECKBOX1 1005
#define IDC_AUTOCHECKBOX2 1006
#define IDC_AUTOCHECKBOX3 1007
#define IDC_GROUPBOX3 1008
#define IDC_AUTO3STATE1 1009
#define IDC_AUTO3STATE2 1010
#define IDC_AUTO3STATE3 1011
#define IDC_GROUPBOX4 1012
#define IDC_DEFPUSHBUTTON 1013
#define IDC_COMBOBOX 1014
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 104
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
五、运行结果
运行结果
到了这里,关于Windows API应用程序开发——按钮和下拉框的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!