勾选或取消勾选复选框都会提示:复选框被取消勾选;往左边文本框输入数字,右边文本框没有反应

写了个程序,往左边文本框输入数字后,勾选复选框,右边文本框会立刻显示该数字x2的结果,如果取消勾选则会清空。
先是发现勾不勾选复选框,在左边文本框输入数字右边文本框都没有反应,接着又试图用messagebox看看是不是复选框返回值问题,结果不管勾选还是取消勾选都会显示:复选框取消勾选
最后想绕开复选框于是把文本框和计算的代码写在开头,却还是老问题:往左边文本框输入内容右边文本框不反应

img

img

我基于codeblocksWIN32GUI项目创建了这个对话框,这是main.cpp里的代码:

img

img

代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。



```c++
#include <iostream>  
#include <string>  
#include <Windows.h>  
  
using namespace std;  
  
int main()  
{  
    // 创建一个文本框和一个复选框  
    HWND text_box = CreateWindow("TextBox", "Input", WS_CHILD | WS_VISIBLE | WS_BORDER,  
                                  100, 100, 300, 30,  
                                  GetSystemMetrics(SM_CXVIRTUALSCREEN),  
                                  GetSystemMetrics(SM_CYVIRTUALSCREEN),  
                                  NULL,  
                                  GetModuleHandle(NULL),  
                                  NULL);  
    HWND check_box = CreateWindow("Checkbox", "Input", WS_CHILD | WS_VISIBLE | WS_BORDER,  
                                  100, 100, 300, 30,  
                                  GetSystemMetrics(SM_CXVIRTUALSCREEN),  
                                  GetSystemMetrics(SM_CYVIRTUALSCREEN),  
                                  NULL,  
                                  GetModuleHandle(NULL),  
                                  NULL);  
  
    // 获取文本框的焦点  
    SetFocus(text_box);  
  
    // 获取复选框的焦点  
    SetFocus(check_box);  
  
    // 获取用户输入  
    string input;  
    GetWindowText(text_box, input);  
  
    // 判断用户是否勾选了复选框  
    if (GetCheck(check_box)然后,我们获取了文本框和复选框的焦点,并使用`GetWindowText`函数获取用户输入。接下来,我们使用`GetCheck`函数获取复选框的状态,并根据状态输出相应的结果。最后,我们清空了文本框和复选框,并关闭了窗口。  
  
请注意,这个程序只是一个简单的示例,您可以根据自己的需求进行修改和扩展。例如,您可以添加错误处理代码,以处理用户输入错误的情况。

```

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    针对这个问题,可以使用消息映射机制来实现复选框勾选与否导致右边文本框的显示不同的功能。

    首先,在对话框类中添加消息映射:

    BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
        ON_BN_CLICKED(IDC_CHECK_BOX, &CMyDlg::OnBnClickedCheckBox)
    END_MESSAGE_MAP()
    

    其中,IDC_CHECK_BOX表示复选框的ID,OnBnClickedCheckBox是复选框被点击时触发的函数,在这个函数中将实现勾选复选框时右边文本框显示数字x2的功能,取消勾选时清空右边文本框的功能。

    在头文件中定义相关变量:

    CEdit m_EditLeft;
    CEdit m_EditRight;
    CButton m_CheckBox;
    int m_nLastNumber = 0;
    

    其中,m_EditLeft是左边的文本框,m_EditRight是右边的文本框,m_CheckBox是复选框。m_nLastNumber是上一次输入的数字。

    在OnInitDialog函数中,初始化相关控件:

    m_EditLeft.SubclassDlgItem(IDC_EDIT_LEFT, this);
    m_EditRight.SubclassDlgItem(IDC_EDIT_RIGHT, this);
    m_CheckBox.SubclassDlgItem(IDC_CHECK_BOX, this);
    

    其中,IDC_EDIT_LEFTIDC_EDIT_RIGHT分别表示左边和右边的文本框的ID。

    实现OnBnClickedCheckBox函数:

    void CMyDlg::OnBnClickedCheckBox()
    {
        CString strLeft;
        m_EditLeft.GetWindowText(strLeft); // 获取左边文本框的内容
        int nNumber = _ttoi(strLeft); // 将内容转换为数字
        CString strRight;
        if (m_CheckBox.GetCheck() == BST_CHECKED) // 如果复选框被勾选
        {
            strRight.Format(_T("%d"), nNumber * 2); // 右边文本框显示数字x2的结果
        }
        else // 如果复选框被取消勾选
        {
            strRight.Empty(); // 右边文本框清空
            m_nLastNumber = 0; // 上一次输入的数字清零
        }
        if (nNumber != m_nLastNumber) // 如果输入的数字不同于上一次输入的数字右边文本框需要重新显示结果
        {
            m_nLastNumber = nNumber;
            m_EditRight.SetWindowText(strRight); // 设置右边文本框的内容
        }
    }
    

    在这个函数中,首先获取左边文本框的内容,并将其转换为数字。然后根据复选框是否被勾选,来决定右边文本框应该显示数字x2的结果还是清空。同时,由于用户可能会在左边文本框中多次输入相同的数字,因此需要判断当前输入的数字是否和上一次输入的数字相同,以区分是重新显示计算结果还是保持原来的结果。

    最后,在相应的控件资源文件中将相应的控件ID添加进去即可。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^