Почему не работает ComboBox в CDialog?
От: ymax  
Дата: 07.10.09 15:09
Оценка:
Я новичок в области MFC. Читаю книжку и натолкнулся на непонятное явление.
имеем класс диалога, автоматом сгенеренный студией (на основе ресурса):

class rrr : public CDialog
{
  DECLARE_DYNAMIC(rrr)

public:
  rrr(CWnd* pParent = NULL);   // standard constructor
  virtual ~rrr();

// Dialog Data
  enum { IDD = IDD_DIALOG1 };

protected:
  virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

  DECLARE_MESSAGE_MAP()
public:
  CString m_val;
  CComboBox m_cb;
};


на самом диалоге находятся Edit и ComboBox
для них созданы переменные m_val и m_cb

в обработчике основного окна:
void cMyWnd::OnLButtonDown(UINT, CPoint)
{
    rrr tmprr(this);
    tmprr.m_val = "текст1";
    tmprr.m_cb.AddString("текст2"); // !!! Здесь студия выдает ошибку ассерта
    tmprr.DoModal();
};

собственно в результате в диалоге в Edit находится "текст1", а ComboBox — пустой. Вопрос: почему он пустой? как тогда передавать значения для ComboBox снаружи?

PS студия 2008
Re: Почему не работает ComboBox в CDialog?
От: REV1  
Дата: 07.10.09 23:33
Оценка:
Здравствуйте, ymax, Вы писали:

Y>в обработчике основного окна:

Y>[ccode]
Y>void cMyWnd::OnLButtonDown(UINT, CPoint)
Y>{
Y> rrr tmprr(this);
Y> tmprr.m_val = "текст1";
Y> tmprr.m_cb.AddString("текст2"); // !!! Здесь студия выдает ошибку ассерта
В этот момент собственно Windows-окна ни диалога, ни, тем более ComboBox-a, еще не существует
Y> tmprr.DoModal();
Они создадутся в DoModal.

Если нужно заполнить комбик извне, то возможно применить след.варианты:
1) В классе диалога rrr создать коллекцию строк (+, возможно, ассоциированную коллекцию числовых значений), проинициализировать ее/их или в конструкторе, или вызовом специального метода типа rrr::AddString(CString& str). Собственно комбик заполнить в rrr::OnInitDialog;
2) Создать собственный сабкласс от CComboBox, который будет хранить всю информацию о комбике. Заполнить его любым доступным способом (конструктор, метод инициализации), а потом также в rrr::OnInitDialog вызвать собственный метод по инициализации уже окна ComboBox.
Re: Почему не работает ComboBox в CDialog?
От: Carc Россия http://www.amlpages.com/home.php
Дата: 08.10.09 14:29
Оценка:
rrr tmprr(this);
tmprr.m_val = "текст1";

tmprr.m_cb.AddString("текст2"); // !!! Здесь студия выдает ошибку ассерта
//судя по всему, окна то CComboBox еще нет, также как и самого диалога, а пытаемся уже положить в окно какой-то текст
tmprr.DoModal();//вот как раз тут и создается видимо диалог

Попробуйте вызывать AddString в OnInitDialog, тогда уже и будет существовать окно ComboBox`а
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.