首页 > 其他分享 >MFC中动态创建多个按钮并实现其消息响应

MFC中动态创建多个按钮并实现其消息响应

时间:2024-06-05 17:34:47浏览次数:17  
标签:MFC int void buttonID 动态创建 OnButtonClick 按钮 btnArray

我们需要根据程序输入或运行时信息在界面上动态生成一个或多个按钮,并分别添加消息响应,实现这一目标包括如下几步:

1.在类中声明按钮变量指针CButton btnArray[n];

2.在类中声明并定义按钮控件的ID, buttonID = 10000;

3.想要创建按钮的数量static const int n = 6;

主要这几行:

afx_msg void OnButtonClick(UINT uID);

static const int n = 6;

CButton btnArray[n];

static const int buttonID = 10000;
void AutoCreateButton(int n);

【.h文件】

class CMFCApplication2Dlg : public CDialogEx
{
protected:
    HICON m_hIcon;

    // 生成的消息映射函数
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();

    afx_msg void OnButtonClick(UINT uID);

    DECLARE_MESSAGE_MAP()

public:
    static const int n = 6;
    CButton btnArray[n];
    static const int buttonID = 10000;

    void AutoCreateButton(int n);
};

【cpp文件】

1、ON_COMMAND_RANGE(buttonID, buttonID + n - 1, OnButtonClick),注意些的位置

BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication2Dlg::OnBnClickedButton1)
    ON_COMMAND_RANGE(buttonID, buttonID + n - 1, OnButtonClick)
END_MESSAGE_MAP()

2、AutoCreateButton(n); 写在OnInitDialog()函数里

BOOL CMFCApplication2Dlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
        ------省略
    AutoCreateButton(n);//自动生成n个按钮
    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

3、OnButtonClick(UINT uID)

void CMFCApplication2Dlg::OnButtonClick(UINT uID)
{
    //int nBtnID = uID - buttonID;
}

4、AutoCreateButton(int n)的实现,一行最多5个按钮,大于5个显示在第二行

void CMFCApplication2Dlg::AutoCreateButton(int n)
{
    DWORD dwStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;
    int x1 = 20, y1 = 20, buttonSize = 100;
    int maxButtonsPerRow = 5;
    int buttonSpacing = 10;
    int verticalSpacing = 30;//第一行和第二行按钮的间距

    for (int i = 0; i < n; i++)
    {
        CString str;
        str.Format(_T("Button %d"), i + 1);

        int row = i / maxButtonsPerRow;
        int col = i % maxButtonsPerRow;

        int x = 20 + col * (buttonSize + buttonSpacing);
        int y = 20 + row * (buttonSize + buttonSpacing) + row * verticalSpacing;

        btnArray[i].Create(str, dwStyle, CRect(x, y, x + buttonSize, y + buttonSize), this, buttonID + i);
        btnArray[i].SetFont(GetFont()); // 设置按钮控件字体
        btnArray[i].ShowWindow(TRUE);
    

     //这两行可以去掉,我是用来在按钮上显示图片的IDB_BITMAP1是图片的ID HBITMAP hBmpMLT = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1)); btnArray[i].SetBitmap(hBmpMLT); y1 += 50; // 调整下一个按钮控件的位置 } }

 

我参考的博客:
MFC中动态创建多个按钮并实现其消息响应 - happyboy2 - 博客园 (cnblogs.com)

标签:MFC,int,void,buttonID,动态创建,OnButtonClick,按钮,btnArray
From: https://www.cnblogs.com/mengyaoli/p/18233450

相关文章

  • 可扩展的触摸屏按钮纹理
    如何在Godot中使`TouchScreenButton`可展开,从而使其边缘不会拉伸?使用普通按钮时,我们可以编辑主题,并在`Style.normal`下添加`StyleBoxTexture`以防止边缘拉伸。我如何使用`TouchScreenButton`实现这一功能?TouchScreenButton纹理可以像ninepachrect一样在不拉伸边......
  • 返回顶部按钮的组件
    目录1.封装2.调用3.效果1.封装<template><transition:name="transitionName"><divv-show="visible"class="back-to-ceiling"@click="backToTop"><svgwidth="16"height=&quo......
  • vue 项目中使用v-permission 实现按钮级权限控制
    在使用vue-element-admin框架进行开发时,您可以通过自定义指令来实现按钮级的权限控制。这个自定义指令可以根据用户的权限动态地控制按钮的显示。以下是一个详细的实现步骤:1、在src目录下按照如下目录结构,创建一个权限文件,例如permission.js:目录结构:src/directive/permissi......
  • 如何在启动活动或启动活动结果中只在导航栏上显示返回按钮
    我在pax设备上使用启动器应用程序,其中有一个打开显示设置的选项,点击该选项后,它将导航到Android显示设置,并且只显示返回按钮。以下是用户界面:......
  • vue后台用户路由权限和按钮权限实现原理
    概论主要是通过一个唯一标识name或者id来过滤判断用户所处的角色是否有路由的权限或者按钮的权限一般路由都有一个一个name可以作为唯一标识一般按钮的话,可以自定义一个name作为标识业务逻辑后台通过选中路由或者按钮给角色,代表这个角色有数组中name[]的权限,用户或者部门再......
  • 按按钮题解
    按按钮题解在量体温,打不了代码,来写题解。赞美lwq,三句话让我跟上了课堂节奏。题意数轴\(n\)个按钮,第\(i\)个按钮在坐标\(i\)。有\(m\)次询问,\(i\)询问为在时刻\(t_i\)按下\(b_i\)。可以在时刻\(0\)安排一些机器人,机器人可以花\(1\)单位时间向左或右移动\(1\)......
  • 防止按钮重复点击 Swift
     typealiasActionBlock=((UIButton)->Void)extensionUIButton{privatestructAssociatedKeys{staticvarActionBlock="ActionBlock"staticvarActionDelay="ActionDelay"}///运行时关联......
  • BootStrap入门到实战:BootStrap组件(一)- Glyphicons字体图标、下拉菜单、按钮组、按钮式
    目录 一、Glyphicons字体图标二、下拉菜单1.基本实例1.1示例1.2用jQuery实现1.3菜单向上弹出2.对齐3.标题4.分割线5.禁用的菜单项三、按钮组1.基本实例2.按钮工具栏3.尺寸4.嵌套5.垂直排列6.两端对齐排列的按钮组四、按钮式下拉菜单1.单按......
  • C#.NET根据不同业务类别类型写入不同文件中,动态创建log4net实例验证
    C#.NET根据不同业务类别类型写入不同文件中,动态创建log4net实例验证 参考了:https://www.cnblogs.com/-dawn/p/8598566.html GetLog4netInstance:usinglog4net;usinglog4net.Appender;usinglog4net.Config;usinglog4net.Core;usinglog4net.Filter;usinglog4net.L......
  • QShop商城-页面按钮权限控制(基于角色)
    QShop商城-页面按钮权限控制基于角色的权限控制在业界接受度较高的权限模型是RBAC(Role-BasedAccessControl),基本的概念是将“角色”这个概念赋予用户,在系统中用户通过分配角色从而获得相应的权限,一个用户可以有多个角色,一个角色可以有多个权限,从而实现权限的灵活配置。......