univers1314 2026-01-08 15:31 采纳率: 36.4%
浏览 3
已结题

MFC里,把SetDlgItemText(),GetDlgItem(IDC_EDIT1)->SetWindowText() 。放在类函数里,调用会抛异常。

MFC里,把SetDlgItemText(),GetDlgItem(IDC_EDIT1)->SetWindowText() 。放在类函数里,调用会抛异常,百度了半天也不得其解?
为什么会这样?

img

img


```c++
//**********************************//
class MyClass : CTsDlg        //类
{
public:              // 访问说明符  
    void myFu()   // 在类内部定义的方法/函数  
    {
    SetDlgItemText(IDC_EDIT1, _T("123456"));    //放在类里面,调用函数就报错了。为什么会这样?
    }
};
//*********************************//

void CTsDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
//    GetDlgItem(IDC_EDIT1)->SetWindowText("888");    //放这里是没有问题 正常输出
//    SetDlgItemText(IDC_EDIT1, _T("123456"));        //放这里是没有问题 正常输出

    MyClass AA;    //创建实列AA
    AA.myFu();    //调用函数就报错了。
}


```

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2026-01-08 15:32
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    在 MFC 中,SetDlgItemText()GetDlgItem(IDC_EDIT1)->SetWindowText() 是用于操作对话框控件的函数。你提到的问题是:将这些代码放在类的成员函数中调用时会抛出异常,但在 OnBnClickedButton1() 这样的对话框消息处理函数中却不会出现问题。

    这表明问题的关键在于 类对象的生命周期和上下文环境


    一、为什么会抛异常?

    1. 类对象未正确关联到对话框窗口

    你定义了一个类 MyClass,它继承自 CTsDlg,但你在 OnBnClickedButton1() 中创建的是一个 MyClass 的实例:

    MyClass AA; // 创建了一个 MyClass 实例
    AA.myFu();  // 调用 myFu()
    

    然而,这个 MyClass 实例并不是一个真正的对话框对象,它并没有被附加到任何实际的窗口(即 HWND)上,因此在调用 SetDlgItemText()GetDlgItem() 时,会因为找不到对应的窗口句柄而抛出异常。

    关键点:
    在 MFC 中,SetDlgItemText()GetDlgItem(...) 等方法必须在对话框或窗口对象的上下文中才能正常工作。也就是说,它们必须属于某个已经创建并显示的对话框或窗口。


    二、解决方案

    为了修复这个问题,你需要确保 myFu() 方法是在一个有效的对话框对象上下文中调用的。

    ✅ 解决方案 1:不要在独立的类中直接使用 SetDlgItemText()

    如果你需要在多个地方调用类似功能,可以考虑将逻辑封装在对话框类内部,而不是单独的类中。

    修改后的代码示例:

    // CTsDlg.h
    class CTsDlg : public CDialogEx
    {
        ...
    public:
        void SetEditControlText();
    };
    
    // CTsDlg.cpp
    void CTsDlg::SetEditControlText()
    {
        SetDlgItemText(IDC_EDIT1, _T("123456"));
    }
    
    void CTsDlg::OnBnClickedButton1()
    {
        SetEditControlText(); // 正常调用
    }
    

    ✅ 解决方案 2:通过对话框指针传递上下文

    如果你确实需要在另一个类中使用对话框控件,可以通过将对话框指针传入该类。

    修改后的代码示例:

    // MyClass.h
    class MyClass
    {
    public:
        MyClass(CTsDlg* pDlg);
        void myFu();
    
    private:
        CTsDlg* m_pDlg;
    };
    
    // MyClass.cpp
    MyClass::MyClass(CTsDlg* pDlg)
        : m_pDlg(pDlg)
    {
    }
    
    void MyClass::myFu()
    {
        if (m_pDlg != nullptr)
        {
            m_pDlg->SetDlgItemText(IDC_EDIT1, _T("123456"));
        }
    }
    

    OnBnClickedButton1() 中调用:

    void CTsDlg::OnBnClickedButton1()
    {
        MyClass AA(this); // 将当前对话框指针传入
        AA.myFu();        // 安全调用
    }
    

    三、总结

    | 原因 | 解决方式 | |------|----------| | SetDlgItemText() 需要运行在对话框对象上下文中 | 确保调用该函数的对象是真正的对话框类实例 | | 使用非对话框类直接调用 MFC 控件函数会导致异常 | 将对话框指针传入子类,避免在无上下文的类中操作控件 |


    四、推荐做法

    • 不要在非对话框类中直接使用 SetDlgItemText()GetDlgItem()
    • 如果需要跨类共享控件操作逻辑,应将对话框指针作为参数传递,或者将逻辑封装在对话框类中。

    五、修改后的完整代码示例(推荐)

    CTsDlg.h

    class CTsDlg : public CDialogEx
    {
        ...
    public:
        void SetEditControlText();
    };
    

    CTsDlg.cpp

    void CTsDlg::SetEditControlText()
    {
        SetDlgItemText(IDC_EDIT1, _T("123456"));
    }
    
    void CTsDlg::OnBnClickedButton1()
    {
        SetEditControlText(); // 正常调用
    }
    

    如有更多关于 MFC 对话框和控件交互的问题,欢迎继续提问!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 今天
  • 已采纳回答 1月8日
  • 创建了问题 1月8日