Как передать данные между двумя диалогами в MFC - PullRequest
2 голосов
/ 09 ноября 2011

У меня есть диалог в MFC и мой основной вид.Представление начинает новый диалог, который принимает два значения типа int, и я хочу вернуть эти значения моему представлению.Я знаю, что должен что-то сделать с dodataexchange, и вот код из моего диалога:

void MapCreator::DoDataExchange(CDataExchange* pDX){    

    CDialogEx::DoDataExchange(pDX);

    CString stringColumn; 
    CString stringRow; 

    CWnd* dialog = GetDlgItem(columns);
    dialog->GetWindowText(stringColumn);

    dialog = GetDlgItem(rows);
    dialog->GetWindowText(stringRow);

    int numColumn = _wtoi(stringColumn);
    int numRow = _wtoi(stringRow);

    DDX_Text(pDX, columns, numColumn);
    DDV_MinMaxInt(pDX, numColumn, 1, 50); 
    DDX_Text(pDX, rows, numRow);
    DDV_MinMaxInt(pDX, numRow, 1, 50); 

}

Теперь, как я могу получить доступ к тезисным значениям в представлении?

1 Ответ

5 голосов
/ 09 ноября 2011

Способ синхронизации данных и просмотра в MFC выглядит примерно так:

Предположим, у вас есть поле для редактирования с идентификатором ресурса IDC_MY_EDITBOX и вы хотите связать его с объектом CString.Изменения в CString должны отражаться в поле редактирования, а изменения в вашем строковом объекте должны обновлять ваш пользовательский интерфейс.Для этого примера давайте назовем ваш объект CString переменной-членом mEditBoxString

class MapCreator : public CDialog
{
//Everything else omitted for brevity
CString mEditBoxString; 
};

Ваш DoDataExchange должен выглядеть примерно так:

void MapCreator ::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_MY_EDITBOX, mEditBoxString);
}

Это установило двустороннюю связь междупеременная и представление ( Поле редактирования )

Если вы измените mEditBoxString в коде и хотите, чтобы он отображался в пользовательском интерфейсе.Каким-то образом DoDataExchange должен быть вызван.Вы делаете это, вызывая CWnd :: UpdateData , который в вашем случае будет методом базового класса.

Если вы передаете FALSE вUpdateData означает, что пользовательский интерфейс будет обновляться с любыми изменениями, которые вы сделали с mEditBoxString.

Если вы передаете TRUE в UpdateData, это означает, что переменная mEditBoxString будет обновлена ​​из пользовательского интерфейса.Поэтому, если пользователь действительно отредактировал поле, новое значение будет сохранено в mEditBoxString

Допустим, у вас также есть кнопка (скажем, LOAD ) в вашем диалоге, котораяподключен к этой функции

void CMapCreatorDlg::OnLoadClicked()
{
    //Do you heavy loading stuff here
    mEditBoxString = "Load Complete";
    UpdateData(FALSE);
}

После этого в вашем диалоговом окне отобразится Загрузка завершена в окне редактирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...