В прошлом шаге мы все делали ручками. То есть нашу пользовательскую функцию DDX не удавалось вставлять используя ClassWizard. Сейчас мы это дело исправим. Итак, нужно сначала описать ее проекте в доступном месте. Вариантов очень много, добавим cpp файл в проект.
Внимательно посмотрите на картинку. Функция подправлена, так как теперь она не является членом класса CDialog, а нам все равно нужно получить идентификатор элемента. Кроме того, она универсальная. В смысле к любому элементу. Все она готова. Теперь вопрос, как сделать так, чтобы ее видел ClassWizard. Для этого нужно отредактировать файл clw проекта.
Мы добавляем две строки. Несмотря на ужасный вид, она довольно простая.
P – ProgressCtrl.
Вообще-то в MSDN P как таковое не описано. Там вот что. Я прямо картинку приведу для примера, что я не вру.
Но я попробовал p и получилось с ProgressCtrl. С этим понятно. Второй параметр пропускаем. Дальше идет имя категории.
Дальше тип переменной, которая будет описана. Конечно он должен совпадать с возвращаемым значением и самой DDX функцией.
class CTestMemoDDXDlg : public CDialog { // Construction public: CTestMemoDDXDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CTestMemoDDXDlg) enum { IDD = IDD_TESTMEMODDX_DIALOG }; CString m_MyPr; //}}AFX_DATA
Дальше значение начальной инициализации, это значение будет в конструкторе.
CTestMemoDDXDlg::CTestMemoDDXDlg(CWnd* pParent /*=NULL*/) : CDialog(CTestMemoDDXDlg::IDD, pParent) { //{{AFX_DATA_INIT(CTestMemoDDXDlg) m_MyPr = "5"; //}}AFX_DATA_INIT // Note that LoadIcon does not require a // subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }
Ну и имя функции без приставки DDX (DDX_ будет добавлено автоматически).
void CTestMemoDDXDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTestMemoDDXDlg) DDX_MyText(pDX, IDC_PROGRESS1, m_MyPr); //}}AFX_DATA_MAP }
И подсказка: