Есть WTL программа и в ней находится диалог. В этом диалоге имеется 7 контролей типа ComboBox. Захотелось этих ComboBox'ов подсоединить к переменным класса диалога, чтобы потом каждый раз при обращении к этим элементам не надо было их подсоединить отдельно с API'шным GetDlgItem(). В MFC это делается так (на примере одного ComboBox):
Но при компиляции вся хорошая затея полетела с сообщением:
c:\program files\microsoft visual studio\vc98\wtl\include\atlddx.h(477) : error C2039: 'SubclassWindow' : is not a member of 'CComboBoxT<class ATL::CWindow>'
d:\work\utils\operaadr\maindlg.h(65) : see reference to function template instantiation 'void __thiscall WTL::CWinDataExchange<class CMainDlg>::DDX_Control(unsigned int,class WTL::CComboBoxT<class ATL::CWindow> &,int)' being compiled
Покопаясь в ATL и WTL исходниках, нашёл, что WTL-ишный CComboBox наследуется от CWindow, у кого метод "SubclassWindow" точно не присутствует. Но тот есть у темплейта CWindowImpl, которому в основе стоит этот самый CWindow. Наверно придётся делать свой ComboBox-ный класс на основе CWindowImpl. Только непонятно, как это всё обединить вместе. Есть идеи?
Здравствуйте Janis Baumanis, Вы писали:
JB>Есть WTL программа и в ней находится диалог. В этом диалоге имеется 7 контролей типа ComboBox. Захотелось этих ComboBox'ов подсоединить к переменным класса диалога, чтобы потом каждый раз при обращении к этим элементам не надо было их подсоединить отдельно с API'шным GetDlgItem().
Здравствуйте Janis Baumanis, Вы писали:
Есть идеи?
class CMyComboBox : public CWindowImpl<CMyComboBox, CComboBox>
{
public:
BEGIN_MSG_MAP(CMyComboBox)
// put your message handler entries here
END_MSG_MAP()
}
У меня похожий вопрос, но я не нашёл ответа нигде. В общем (если моё сообщение попало по адресу, в интерфейсе я запутался) доделываю я программу на C++, где всё написано практически на системном уровне, диалоговое окно сделано в виде ресурса. Обмен происходит DDX-функциями в DoDataExchange. Там есть поля ввода и флажки (checkbox), нужно добавить раскрывающийся список (combobox). И для него я не могу подобрать DDX-функцию. Во-первых поле Data в конструкторе ничего не таёт, хоть по кнопке TestDialog я в списке элементы вижу, при выполнении их нет. Я пробовал
тогда он cmbx вписывает только в само поле, а раскрывающийся список заполнить никак не удаётся, ни с точками с запятыми, ни с разрывами строки. Вторая функция считывает непонятно что. Есть ещё DDX_FieldCBString, но тут нужен CRecordset, что заполнить просто набором строк я тоже не нашёл как.
В общем, сейчас применяю обходной вариант
и т. п., к тому же именно listbox, ибо для combobox и это не работает. Но хотелось б сделать интерфейс с combobox и делать нормально через DDX, а не такими обходными путями.
Здравствуйте, Ilya81, Вы писали:
I>Но хотелось б сделать интерфейс с combobox и делать нормально через DDX, а не такими обходными путями.
#include <atlddx.h>
class CMainDlg : public CDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>,
public CMessageFilter, public CIdleHandler,
publicCWinDataExchange<CMainDlg>
{
CComboBox m_wndCombo1;
public:
...
BEGIN_DDX_MAP(CMainDlg)
DDX_CONTROL_HANDLE(IDC_COMBO1, m_wndCombo1)
END_DDX_MAP()
А называется именно atlddx.h? А то у меня заявляет, нет такого файла, или я Add Reference какой-то не поставил. Соответственно DDX_CONTROL_HANDLE не признаёт.
А кроме того, мне в событии DoDataExchange желательно (если не применять обходных путей) осуществлять связь index текущего элемента раскрывающегося списка с соотвествующей перменной — тут какую DDX-функцию нужно использовать?
Здравствуйте, Ilya81, Вы писали:
I>А называется именно atlddx.h?
да
I>А то у меня заявляет, нет такого файла,
это WTL
I>А кроме того, мне в событии DoDataExchange желательно (если не применять обходных путей) осуществлять связь index текущего элемента раскрывающегося списка с соотвествующей перменной — тут какую DDX-функцию нужно использовать?
нет такой DDX-функции, можно связать CString с текущей строкой, а индекс только через m_wndCombo1.GetCurSel();
Я не знаю, но эта сторка выполняется без ошибки, а если там CListBox, то AddString вполне успешно наполняет список. Остаётся только решить вопрос, как столь ж успешно добавлять его в combobox, поскольку он здесь гораздо уместнее.