Можем ли мы сопоставить флажок с логической переменной в MFC вместо BOOL?

Возьмите это сопоставление переменных в CDialog:

      DDX_Check(pDX, IDC_CHECK_PREVIEW_CURRENT_WEEK, m_bPreviewCurrentWeek);

По дизайну в IDE он должен отображаться в BOOLпеременная вместо переменной.

Я знаю, что при нормальных обстоятельствах вы можете просто использовать переменную везде, где TRUEили же FALSEиспользуется. Но когда я пытаюсь изменить свою переменную-член на a, она не компилируется на DDX_Checkрутина.

Можем ли мы использовать boolс флажком?

1 ответ

Комментарий @Jabberwocky напомнил мне, что я уже реализовал некоторые пользовательские процедуры DDX:

Поэтому я углубился в исходный код MFC и изменил копию в своем собственном файле cpp:

      void AFXAPI DDX_CheckBool(CDataExchange* pDX, int nIDC, bool& value)
{
    pDX->PrepareCtrl(nIDC);
    HWND hWndCtrl;
    pDX->m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);
    if (pDX->m_bSaveAndValidate)
    {
        value = static_cast<bool>(::SendMessage(hWndCtrl, BM_GETCHECK, 0, 0L));
        //ASSERT(value >= 0 && value <= 2);
    }
    else
    {
        //if (value < 0 || value > 2)
        //{
        //  TRACE(traceAppMsg, 0, "Warning: dialog data checkbox value (%d) out of range.\n",
        //      value);
        //  value = 0;  // default to off
        //}
        ::SendMessage(hWndCtrl, BM_SETCHECK, static_cast<WPARAM>(value), 0L);
    }
}

Я закомментировал проверки проверки, так какboolв любом случае имеет только одно из двух значений. Кричи, если считаешь, что это было ошибкой.

Итак, теперь я могу сделать это:

      DDX_CheckBool(pDX, IDC_CHECK_SELECT_NAMES, m_bSelectStartingNames);

Это работает нормально.

Другие вопросы по тегам