我很难将 CComboBox 添加到我的对话框中。每当我尝试将字符串添加到组合中时,我都会在这个地方收到失败的断言:
_AFXWIN_INLINE int CComboBox::AddString(LPCTSTR lpszString)
{ ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, CB_ADDSTRING, 0, (LPARAM)lpszString); }
当时combo好像还没有初始化。这是对话框的代码:
#pragma once
#include "afxdialogex.h"
class FeedbackDialog : public CDialog
{
public:
FeedbackDialog(CWnd* pParent = nullptr);
virtual ~FeedbackDialog();
BOOL OnInitDialog() override
{
m_comboBox.AddString(L"Super item");
return TRUE;
}
#ifdef AFX_DESIGN_TIME
enum {
IDD = IDD_FEEDBACK_DIALOG
};
#endif
protected:
DECLARE_DYNAMIC(FeedbackDialog)
DECLARE_MESSAGE_MAP()
void DoDataExchange(CDataExchange* pDX) override;
private:
CComboBox m_comboBox;
int m_comboSelectedIndex = 0;
};
标题:
#include "pch.h"
#include "afxdialogex.h"
#include "FeedbackDialog.h"
#include "resource.h"
IMPLEMENT_DYNAMIC(FeedbackDialog, CDialog)
BEGIN_MESSAGE_MAP(FeedbackDialog, CDialog)
END_MESSAGE_MAP()
FeedbackDialog::FeedbackDialog(CWnd* pParent) : CDialog(IDD_FEEDBACK_DIALOG, pParent){}
FeedbackDialog::~FeedbackDialog(){}
void FeedbackDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_CBIndex(pDX, IDC_FEEDBACK_DIALOG_COMBO, m_comboSelectedIndex);
m_comboBox.AddString(L"Super item");
}
我正在尝试以模式方式打开我的对话框:
FeedbackDialog d;
d.DoModal();
我应该在哪里填充我的组合?
两个原因:
m_comboBox
未初始化,不与实际控件绑定。使用类向导添加类型为“Control”而不是“Value”的成员变量 (m_comboBox
)。向导将在 DDX_Control()
中添加 DoDataExchange()
调用。AddString()
不应从 DoDataExchange()
内部调用,而是从任何命令处理处理程序(例如 OnClickSth()
)或从 OnInitDialog()
;