WTL - DDX & ComboBox
От: Janis Baumanis Латвия  
Дата: 20.11.01 13:21
Оценка:
Есть WTL программа и в ней находится диалог. В этом диалоге имеется 7 контролей типа ComboBox. Захотелось этих ComboBox'ов подсоединить к переменным класса диалога, чтобы потом каждый раз при обращении к этим элементам не надо было их подсоединить отдельно с API'шным GetDlgItem(). В MFC это делается так (на примере одного ComboBox):

// MainDlg.h
class CXDlg : public CDialog
{
public:
.....
    CComboBox    m_cboName;
.....
}

// MainDlg.cpp
.....
void CMainDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CMainDlg)
    DDX_Control(pDX, IDC_COMBO_NAME, m_cboName);
.....
    //}}AFX_DATA_MAP
}
.....


В WTL варианте я пробовал делать то же самое, ибо в WTL тоже присутствует CComboBox и DDX_CONTROL.

.....
    CComboBox    m_cboName;
.....
    BEGIN_DDX_MAP(CMainDlg)
        DDX_CONTROL(IDC_COMBO_NAME, m_cboName)
.....
    END_DDX_MAP()
.....


Но при компиляции вся хорошая затея полетела с сообщением:

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. Только непонятно, как это всё обединить вместе. Есть идеи?
Re: WTL - DDX & ComboBox
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 21.11.01 05:04
Оценка:
Здравствуйте Janis Baumanis, Вы писали:

JB>Есть WTL программа и в ней находится диалог. В этом диалоге имеется 7 контролей типа ComboBox. Захотелось этих ComboBox'ов подсоединить к переменным класса диалога, чтобы потом каждый раз при обращении к этим элементам не надо было их подсоединить отдельно с API'шным GetDlgItem().


дык вроде-ж вот здесь http://www.rsdn.ru/?article/?wtl/wtl-2.xml
Автор(ы): Александр Шаргин
Дата: 03.11.2001

Вторая часть статьи содержит подробное описание классов WTL, предназначенных для работы с диалоговыми окнами и элементами управления. Рассмотрены классы:
CDialogImplBaseT<>, CDialogImpl<>, CAxDialogImpl<>, CSimpleDialog<>, CWinDataExchange<>, CUpdateUI<>, CDialogResize<>, COwnerDraw<>, CCustomDraw<>,
CBitmapButton, CCheckListViewCtrl, CHyperLink, CMultiPaneStatusBarCtrlImpl, CWaitCursor.
с примерами расписано использование контролов в WTL ?
Re: WTL - DDX & ComboBox
От: Андрей Россия  
Дата: 21.11.01 05:07
Оценка:
Здравствуйте Janis Baumanis, Вы писали:
Есть идеи?

class CMyComboBox : public CWindowImpl<CMyComboBox, CComboBox>
{
public:
  BEGIN_MSG_MAP(CMyComboBox)
    // put your message handler entries here
  END_MSG_MAP()
}


А потом используй DDX_CONTROL.
Re: WTL - DDX & ComboBox
От: Ilya81  
Дата: 16.03.07 16:57
Оценка:
У меня похожий вопрос, но я не нашёл ответа нигде. В общем (если моё сообщение попало по адресу, в интерфейсе я запутался) доделываю я программу на C++, где всё написано практически на системном уровне, диалоговое окно сделано в виде ресурса. Обмен происходит DDX-функциями в DoDataExchange. Там есть поля ввода и флажки (checkbox), нужно добавить раскрывающийся список (combobox). И для него я не могу подобрать DDX-функцию. Во-первых поле Data в конструкторе ничего не таёт, хоть по кнопке TestDialog я в списке элементы вижу, при выполнении их нет. Я пробовал
DDX_CBString(pDX, IDC_COMBO1, cmbx);
DDX_CBIndex(pDX, IDC_COMBO1, m_ColorFormat);


тогда он cmbx вписывает только в само поле, а раскрывающийся список заполнить никак не удаётся, ни с точками с запятыми, ни с разрывами строки. Вторая функция считывает непонятно что. Есть ещё DDX_FieldCBString, но тут нужен CRecordset, что заполнить просто набором строк я тоже не нашёл как.
В общем, сейчас применяю обходной вариант
CListBox* pList = (CListBox*)GetDlgItem(IDC_LIST2);
    pList->AddString("15 бит");

и т. п., к тому же именно listbox, ибо для combobox и это не работает. Но хотелось б сделать интерфейс с combobox и делать нормально через DDX, а не такими обходными путями.
Re[2]: WTL - DDX & ComboBox
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 17.03.07 10:06
Оценка: 2 (1)
Здравствуйте, Ilya81, Вы писали:

I>Но хотелось б сделать интерфейс с combobox и делать нормально через DDX, а не такими обходными путями.


#include <atlddx.h>

class CMainDlg : public CDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>,
    public CMessageFilter, public CIdleHandler,
    public CWinDataExchange<CMainDlg>
{
    CComboBox m_wndCombo1;
public:
  ...
    
    BEGIN_DDX_MAP(CMainDlg)
        DDX_CONTROL_HANDLE(IDC_COMBO1, m_wndCombo1)
    END_DDX_MAP()


LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
  DoDataExchange(DDX_LOAD);

  ....
    
  m_wndCombo1.AddString("bla-bla-bla");

  return TRUE;
}
... << RSDN@Home 1.2.0 alpha rev. 675>>
Re[3]: WTL - DDX & ComboBox
От: Ilya81  
Дата: 17.03.07 15:06
Оценка:
А называется именно atlddx.h? А то у меня заявляет, нет такого файла, или я Add Reference какой-то не поставил. Соответственно DDX_CONTROL_HANDLE не признаёт.

А кроме того, мне в событии DoDataExchange желательно (если не применять обходных путей) осуществлять связь index текущего элемента раскрывающегося списка с соотвествующей перменной — тут какую DDX-функцию нужно использовать?
Re[4]: WTL - DDX & ComboBox
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 17.03.07 15:42
Оценка:
Здравствуйте, Ilya81, Вы писали:

I>А называется именно atlddx.h?


да

I>А то у меня заявляет, нет такого файла,


это WTL

I>А кроме того, мне в событии DoDataExchange желательно (если не применять обходных путей) осуществлять связь index текущего элемента раскрывающегося списка с соотвествующей перменной — тут какую DDX-функцию нужно использовать?


нет такой DDX-функции, можно связать CString с текущей строкой, а индекс только через m_wndCombo1.GetCurSel();
... << RSDN@Home 1.2.0 alpha rev. 675>>
Re[5]: WTL - DDX & ComboBox
От: Ilya81  
Дата: 18.03.07 12:41
Оценка:
Всё равно я не нахожу, как этот WTL подключить. Однако, раз уж всё равно нужен обходной вариант, тогда может и способ с
CComboBox* pcmb = (CComboBox*)GetDlgItem(IDC_COMBO1);

может работать, только вот нужно разгадать загадку, почему
pcmb->AddString("15 бит");

не добавляет никаких элементов, в то время, как для ListBox, такой фокус срабатывает.
Re[6]: WTL - DDX & ComboBox
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 18.03.07 13:57
Оценка:
Здравствуйте, Ilya81, Вы писали:

I>Всё равно я не нахожу, как этот WTL подключить


скачать
Автор: Splin
Дата: 12.03.07
и прописать путь в настройках студии
... << RSDN@Home 1.2.0 alpha rev. 675>>
Re[6]: WTL - DDX & ComboBox
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 18.03.07 14:02
Оценка:
Здравствуйте, Ilya81, Вы писали:

I>
I>CComboBox* pcmb = (CComboBox*)GetDlgItem(IDC_COMBO1);
I>


меня терзают смутные сомнения... Откуда тогда этот CComboBox если WTL не используется? уж не из MFC -ли?
... << RSDN@Home 1.2.0 alpha rev. 675>>
Re[7]: WTL - DDX & ComboBox
От: Ilya81  
Дата: 18.03.07 15:19
Оценка:
Я не знаю, но эта сторка выполняется без ошибки, а если там CListBox, то AddString вполне успешно наполняет список. Остаётся только решить вопрос, как столь ж успешно добавлять его в combobox, поскольку он здесь гораздо уместнее.
Re[8]: WTL - DDX & ComboBox
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 18.03.07 17:37
Оценка:
Здравствуйте, Ilya81, Вы писали:

I>Остаётся только решить вопрос


не, для начала все таки надо определиться WTL или MFC
... << RSDN@Home 1.2.0 alpha rev. 675>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.