如何将CComboBox添加到CDialog

问题描述 投票:0回答:1

我很难将 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();

我应该在哪里填充我的组合?

c++ mfc
1个回答
0
投票

两个原因:

  • m_comboBox
    未初始化,不与实际控件绑定。使用类向导添加类型为“Control”而不是“Value”的成员变量 (
    m_comboBox
    )。向导将在
    DDX_Control()
    中添加
    DoDataExchange()
    调用。
  • AddString()
    不应从
    DoDataExchange()
    内部调用,而是从任何命令处理处理程序(例如
    OnClickSth()
    )或从
    OnInitDialog()
    ;
  • 调用它
© www.soinside.com 2019 - 2024. All rights reserved.