Windows API应用程序开发——按钮和下拉框

这篇具有很好参考价值的文章主要介绍了Windows API应用程序开发——按钮和下拉框。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

窗口的按钮和下拉框控件

一、工程创建

  • 打开VS,左上角文件-新建-项目
  • 筛选语言为C++,平台为Windows,项目类型为桌面,选择Windows桌面向导,下一步。
Windows API应用程序开发——按钮和下拉框
Windows桌面向导

  • 对项目命名,选定项目路径为先前的文件夹,创建。
  • 在应用程序类型中选择桌面应用程序(.exe),勾选空项目,确定。
Windows API应用程序开发——按钮和下拉框
应用程序类型

  • 在解决方案资源管理器窗口中,选中创建的项目,右击,添加-新建项,分别选择C++文件(.cpp)头文件(.h),改名,添加。
Windows API应用程序开发——按钮和下拉框
添加文件

二、控件的创建

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、创建多个同类控件

多个同类控件可以用数组搭配循环的形式,简化语句。

  • 定义数组,如下:
    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应用程序开发——按钮和下拉框
运行结果

到了这里,关于Windows API应用程序开发——按钮和下拉框的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是 API(应用程序接口)?

    API(应用程序接口) 是一种软件中介,它允许两个不相关的应用程序相互通信。它就像一座桥梁,从一个程序接收请求或消息,然后将其传递给另一个程序,翻译消息并根据 API 的程序设计执行协议。API 几乎存在于我们数字生活的各个方面,可以说是我们现代插件、数字接口

    2024年02月09日
    浏览(51)
  • 应用程序接口(API)安全的入门指南

    本文简单回顾了 API 的发展历史,其基本概念、功能、相关协议、以及使用场景,重点讨论了与之相关的不同安全要素、威胁、认证方法、以及十二项优秀实践。   根据有记录的历史,随着 Salesforce 的销售自动化解决方案的推出,首个 Web API 在 1990 年底出现了。在那个时候,

    2024年02月03日
    浏览(47)
  • WebUSB API 是一个用于在Web应用程序中访问USB设备的API

    WebUSB API 是一个用于在Web应用程序中访问USB设备的API。它允许Web应用程序与连接到计算机的USB设备进行通信,从而实现与USB设备的交互和控制。 以下是WebUSB API的基本使用说明: 获取USB设备许可:您可以使用navigator.usb.requestDevice方法请求用户许可来访问USB设备。示例代码如下

    2024年04月27日
    浏览(37)
  • 解释 RESTful API,以及如何使用它构建 web 应用程序。

    RESTful API是一种利用HTTP协议进行通信的Web API设计风格,它采用了一组统一且可缓存的操作,包括GET、POST、PUT、DELETE等,通过URL来定位资源,以及使用JSON、XML等格式来传输数据,以实现系统之间的数据交互和资源共享。 使用RESTful API构建Web应用程序,首先需要设计API的URL、

    2024年02月11日
    浏览(70)
  • 解释 RESTful API,以及如何使用它构建 web 应用程序

             RESTful API stands for Representational State Transfer Application Programming Interface. It is a set of principles and guidelines for building web services that provide data in a standard format, typically JSON or XML. RESTful API emphasizes on uniformity, scalability, reliability, performance, and flexibility. It operates on HTTP and follo

    2024年02月14日
    浏览(70)
  • Windows应用程序——记事本

    本博客介绍如何使用Visual Studio 2019设计一个Windows应用程序——记事本,通过学习,可以进一步掌握MenuStrip(菜单)、ToolStrip(工具栏)、RichTextBox(高级文本框)和StatusStrip(状态栏控件)等控件的使用,以及如何使用CommonDialog(公共对话框)实现对文本的存取、格式设置等

    2024年02月03日
    浏览(54)
  • C#程序设计之windows应用程序设计基础

    题目描述 设计一个“简单通讯录”程序,在窗体上建立一个下拉式列表框、两个文本框和两个标签,实现以下功能:当用户在下拉式列表框中选择一个学生姓名后,在“学生姓名”、“地址”两个文本框中分别显示出对应的学生和地址。 代码 窗体代码 运行结果 题目描述 设

    2024年02月06日
    浏览(50)
  • Windows 通过端口占用查找应用程序

    对于开发人员在启动项目的过程中也许会遇到程序使用 端口被占用的情况;如下: 遇到这种情况我们可以换一个端口,也可以查找是哪个程序暂用了这个端口;在Windows上我们可以通过如下方式去查找对应的端口程序信息。 1、打开dos命令窗口 开始—-运行—-cmd,或者是wind

    2024年02月12日
    浏览(42)
  • Windows应用程序基础(详细,简单易懂)

    大家好!这是我的 第一篇博客 ,首先来个自我介绍吧!我是来自一所双非院校的大一新生,所学的专业是 计算机科学与技术 ,纯纯小白一枚。 那我为什么要写博客呢 ?为什么?说实话,我一开始一直都没有写博客的想法,我都是看别人的博客,直到有一天,我的好同学

    2024年02月04日
    浏览(46)
  • “深入了解API和Python的完美结合:构建强大、灵活的应用程序“

    引言: 在当前科技高速发展的时代,应用程序是各行各业的重要组成部分。而API(Application Programming Interface)作为不同系统之间实现通信和数据交换的桥梁,具有至关重要的作用。而Python作为一种强大而灵活的编程语言,与API的结合更是创造了无限的可能性。本文将深入探讨

    2024年02月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包