Mr.God 2024-06-03 10:26 采纳率: 0%
浏览 3

MFC动态控件生成问题请教

MFC动态生成按钮控件并放于子容器group box, 如何为其设置处理事件?为什么我添加了之后没有什么左右,有人知道吗

BEGIN_MESSAGE_MAP(CInputSet, CDialogEx)
    ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON_SAVEINPUTRR, IDC_BUTTON_SAVEINPUTRR + 2,OnSaveButtonClicked)
END_MESSAGE_MAP()
BOOL CInputSet::OnInitDialog()
{
    CDialogEx::OnInitDialog();
  for (int i = 0; i < m_SiteCount; ++i)
    {
        int row = i / nMaxColumn; 
        int col = i % nMaxColumn; 

        int x = 20 + col * (nGroupBoxWidth + nGroupBoxSpacingX); 
        int y = 20 + row * (nGroupBoxHeight + nGroupBoxSpacingY); 

        CRect rect(x, y, x + nGroupBoxWidth, y + nGroupBoxHeight);
        pGroupBox = new CStatic();
        pGroupBox->Create(_T("Group"), WS_CHILD | WS_VISIBLE | BS_GROUPBOX, rect, this, IDC_STATIC_SITE_GROUP + i);

        // 添加其他控件到 groupbox 中
        InsertRadio(i);
        InsertEdit(i);
        InsertStatic(i);
        InsertCombobox(i);
        CButton* pSaveButton = new CButton();
        CRect rectwww(90, 140, 120, 160); 
        pSaveButton->Create(_T("3333"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, rectwww, pGroupBox, IDC_BUTTON_SAVEINPUTRR + i);

    }
}


  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2024-06-03 10:26
    关注

    上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    你的问题主要集中在如何为动态生成的CButton控件添加事件处理函数以及确保其显示在Group Box中。在MFC中,你需要为每个动态创建的控件注册消息映射,以便它们可以响应特定的用户交互事件。

    首先,你需要确保OnSaveButtonClicked函数已经正确实现了按钮点击事件的处理逻辑。下面是修改后的BEGIN_MESSAGE_MAPON_CONTROL_RANGE部分:

    BEGIN_MESSAGE_MAP(CInputSet, CDialogEx)
        ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON_SAVEINPUTRR, IDC_BUTTON_SAVEINPUTRR + m_SiteCount, OnSaveButtonClicked) // 注意这里使用m_SiteCount而不是硬编码的2
    END_MESSAGE_MAP()
    

    然后,你需要在OnInitDialog函数中为每个动态创建的CButton添加消息映射。你可以通过pSaveButton->GetSafeHwnd()获取按钮的句柄,并使用SetWindowLong函数来注册事件处理函数:

    for (int i = 0; i < m_SiteCount; ++i)
    {
        // ...
        CRect rectwww(90, 140, 120, 160); 
        CButton* pSaveButton = new CButton();
        pSaveButton->Create(_T("3333"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, rectwww, pGroupBox, IDC_BUTTON_SAVEINPUTRR + i);
    
        // 注册事件处理
        LRESULT CALLBACK SaveButtonProc(int nCode, WPARAM wParam, LPARAM lParam)
        {
            if (nCode == HC_ACTION)
            {
                OnSaveButtonClicked(wParam, (LPARAM)pSaveButton); // 传递按钮实例作为参数
                return 0;
            }
            return 0;
        }
        pSaveButton->SetWindowLongPtr(-1, (LONG_PTR)SaveButtonProc); // 注册事件处理函数
        // ...
    }
    

    这样,当你点击这些按钮时,OnSaveButtonClicked函数就会被调用。注意,SetWindowLongPtr函数的第一个参数 -1 表示设置窗口类的消息映射,SaveButtonProc是你自定义的事件处理函数。

    解决方案总结:

    1. 更新BEGIN_MESSAGE_MAP中的ON_CONTROL_RANGE,使用m_SiteCount替换硬编码的值。
    2. OnInitDialog循环中为每个CButton动态创建者添加事件处理函数,并注册消息映射。
    3. 使用SetWindowLongPtr为CButton设置自定义事件处理函数。
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月3日