C++/MFC 访问控件变量时出错
C++/MFC Error accessing control's variable
我为CEdit创建了一个控件的变量:
class CGateDlg : public CDialog
{
...
public:
// here is my control's variable
CEdit m_edit_a;
// here I map variable to control
virtual void DoDataExchange(CDataExchange* pDX);
}
这就是我将变量映射到控件的方式:
void CGateDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT_A, m_edit_a);
}
它就是这样工作的:用户在编辑框中键入一些文本。然后,他按下"重置"按钮,清除编辑框。这是一段负责在点击重置按钮后清除编辑框的代码:
void CGateDlg::OnBnClickedReset()
{
// clear edit box
m_edit_a.SetWindowTextW(L"");
}
应用程序启动时没有任何错误。我在EditBox中键入一些文本,然后点击"重置"按钮。然后我得到一个错误,导致我进入winocc.cpp,第245行(确保(这个)):
void CWnd::SetWindowText(LPCTSTR lpszString)
{
ENSURE(this);
ENSURE(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));
if (m_pCtrlSite == NULL)
::SetWindowText(m_hWnd, lpszString);
else
m_pCtrlSite->SetWindowText(lpszString);
}
我认为问题出在hWnd:上
this 0x0030fa54 {CEdit hWnd=0x00000000} CWnd * const
但是如何修复呢?
当我使用访问控件的值时,一切都很好
CEdit *m_edit_a;
m_edit_a = reinterpret_cast<CEdit *>(GetDlgItem(IDC_EDIT_A));
m_edit_a->SetWindowTextW(L"");
我做错了什么?
我可以看到两种可能性:
-
对话框启动时控件不存在。CDialog::OnInitDialog要做的第一件事就是调用DoDataExchange,所以如果您稍后在初始化过程中创建控件,那就太晚了。
-
您自己的OnInitDialog没有调用CDialog::OnInitDalog,因此没有调用DoDataExchange。
我认为您不应该直接使用控件的meber(在本例中为m_edit_a
)。相反,您应该使用一个memeber变量,比如CStrimg m_edit_data
,并将其链接到控件:
DDX_Text(pDX, IDC_EDIT_A, m_edit_data); // as you did it in DDC_Cotrol
现在你可以直接使用变量,但为了更新控件,你应该在使用它之前使用以下代码:
UpdateData(true); // unlocks the control in a sense
m_edit_data = "this is my test";
UpdateData(false); // locks the control again (in a sense)
这是MFC中的正常程序:),希望我能帮助。。。
哦。。。您还应该将控件添加到字符串表。。。(如果您不知道,请告诉我)
我找不出你有什么毛病。我使用VC6.0创建一个新项目,并将一个变量关联到Edit,只需链接即可。exe运行正常。
class CEditTestDlg : public CDialog
{
// Construction
public:
CEditTestDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CEditTestDlg)
enum { IDD = IDD_EDITTEST_DIALOG };
CEdit m_Edit;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CEditTestDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
.cpp
void CEditTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CEditTestDlg)
DDX_Control(pDX, IDC_EDIT1, m_Edit);
//}}AFX_DATA_MAP
}
void CEditTestDlg::OnBnClickedReset()
{
// TODO: Add your control notification handler code here
m_Edit.SetWindowText("tttt");
}
所以,我认为这不是一个代码问题。你最好再试一次。
如果您的对话框开始调用CDialog::OnInitDialog(),DoDataExchange开始调用CDdialog::DoDataExchange,但仍然有空的hWnd指针并得到CNotSupportedException,请确保您的资源(rc)文件的对话框模板包括DoDataExchange中的所有控件(IDC_)等。
如果使用同时提供资源的DLL,请检查是否覆盖定义。
- 导入/导出变量时出错
- 在头文件中定义变量不会出错
- 分段 访问私有类变量时出错
- C++ 循环屏障中的倒计时使用原子变量出错[请无锁的解决方案]
- 变量用作C中的函数参数后出错
- 在 mingw64- 变量下的窗口中编译 openvpn3 时出错,未在范围内声明
- 如何对 int 变量应用验证,使其仅接受整数数据,并且在任何其他数据的情况下不会出错?
- 在循环中重新声明 for 循环变量时出错
- 使用静态变量未解析的外部符号/未定义的引用时出错
- 为什么当我们把变量"u"的数据类型从长整型更改为整型时,模幂会出错?
- 将值设置为 char ** 变量 c++ 时出错
- 在同一命名空间中声明变量和函数是否出错?[C++]
- 转换(常量字符*)变量出错
- Boost Python:在函数中通过引用传递变量时出错
- 将 (cin >> someVar) 的返回分配给 istream 变量时出错 C++
- 链接外部变量 c++ 时出错
- 在C++中访问静态私有变量时出错
- 为什么我在向类[C++]添加私有变量时出错
- 尝试使用全局变量时使用 Xcode C++时出错
- C++ #define 和常量变量相乘时出错