Очевидно ты неправильно связываешь комбобокс на диалоге с соответствующей переменной в классе. Если пользуешься VS2003, то порядок такой: бросаешь на шаблон диалога комбобокс, вызываешь для него контекстное меню и в нем выбраешь Add Variable. Далее появится визард, который поможет все правильно сделать.
Если хочется сделать это вручную, то следует учесть, что просто добавить в класс диалога переменную типа CComboBox недостаточно. Нужно связать эту переменную с самим комбобоксом через механизм data exchange (макрос DDX_Control):
Здравствуйте, Wallrunner, Вы писали:
W>Читая MSDN я пока что докопался по метода Attach и в OnInitDialog() сделал вот такое: W>Неужели это и есть правильный ответ?
Добавь в начале метода, где делается AddString, строчку
Я новичок в MFC и скорее всего вопрос такой задавался, но я не знаю как нормально сформулировать поисковый запрос, поэтому решил написать пост.
Дело в том что я создал в своем проекте диалог и поместил туда ComboBox. Затем создал член класса, типа CComboBox в классе диалога.
При загрузке диалога мне нужно инициализировать комбо бокс некоторыми значение из БД. Но при попытке сделать это вызовом CComboBox::AddString() в конструкторе диалога или же в методе OnInitDialog() прога выдает assertion failed, причем не совсем понятно что ей не нравится, по-моему пустой hWnd в объекте контрола. При этом если добавить обработчик OnPaint() и сделать инициализаию там то все проходит нормально. Но мне этот способ не нравится, потому как он кривоватый — каждый раз при перерисовке диалога надо проверять не был ли контрол уже проинициализирован. Т.е. я не могу инициализировать контрол до появления окна. Так что хотел бы спросить когда (в обработчике какого события) нужно инициализировать контролы?
Да кстати, на этом диалоге у меня также есть EditBox и для него поставлен тип CString и он отлично инициализируется в конструкторе класса строковым значением, однако если его превратить в контрол то возникает та же история.
Здравствуйте, Wallrunner, Вы писали:
W>Так что хотел бы спросить когда (в обработчике какого события) нужно инициализировать контролы?
Вообще то, это при помощи CWnd::SubclassDlgItem делается, но для диалогов есть свой мещанихм сабклассинга контролов.
При генерации класса диалога визардом создается метод DoDataExchange. Если добавить (опять же визардом) переменную для контрола, то в DoDataExchange сгенерится вызов функции DDX_Control, в которой и производитс сабклассинг.
DoDataExchange вызывается фреймворком при вызове CDialog::OnInitDialog.
Re[2]: Когда нужно инициализовать контрол в диалоге
Здравствуйте, 3V, Вы писали:
3V>Вообще то, это при помощи CWnd::SubclassDlgItem делается, но для диалогов есть свой мещанихм сабклассинга контролов. 3V>При генерации класса диалога визардом создается метод DoDataExchange. Если добавить (опять же визардом) переменную для контрола, то в DoDataExchange сгенерится вызов функции DDX_Control, в которой и производитс сабклассинг. 3V>DoDataExchange вызывается фреймворком при вызове CDialog::OnInitDialog.
Всем спасибо за ответы. На самом деле я делал все средствами студии и вызовы DDX_* у меня тоже есть.
UpdateData(TRUE) кстати в OnInitDialog() не помогает, также выдает assert, а вот вызов CDialog::OnInitDialog()
как раз-таки помог. И надо же было мне не додуматься сделать такую часто используюмую вещь как вызов метода базового класса...
Re[3]: Когда нужно инициализовать контрол в диалоге
Здравствуйте, Wallrunner, Вы писали:
W>Дело в том что я создал в своем проекте диалог и поместил туда ComboBox. Затем создал член класса, типа CComboBox в классе диалога. W>При загрузке диалога мне нужно инициализировать комбо бокс некоторыми значение из БД. Но при попытке сделать это вызовом CComboBox::AddString() в конструкторе диалога или же в методе OnInitDialog() прога выдает assertion failed,
Таки именно в OnInitDialog(), но после вызова CDialog::OnInitDialog();