использование CFileDialog :: AddCheckButton завершается неудачно - PullRequest
2 голосов
/ 22 марта 2019

ОК, я пытаюсь использовать CFileDialog::AddCheckButton.Вызов функции выполнен успешно, и я вижу новый флажок.Я не вижу никаких событий, и хотя я могу переопределить OnInitDialog, переопределение OnOK игнорируется.Я не уверен, что я делаю неправильно:

// header

class CTPSaveDialog : public CFileDialog
{
    DECLARE_DYNAMIC(CTPSaveDialog)
    static const CString CTPSaveDialog::m_cstrFilter;
public:
    BOOL m_bForce;
    CTPSaveDialog(
        LPCTSTR lpszDefExt = NULL,
        LPCTSTR lpszFileName = NULL,
        DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
        CWnd* pParentWnd = NULL,
        DWORD dwSize = 0);
    ~CTPSaveDialog();
    virtual BOOL OnInitDialog();
    DECLARE_MESSAGE_MAP()
    afx_msg void OnBnClickedCheckForce();
    virtual void OnOK();
};

// реализация

const CString CTPSaveDialog::m_cstrFilter = "JPEG images (*.jpg)|*.jpg|TIFF Format (*.tif)|*.tif|Windows Bitmap (*.bmp)|*.bmp|Portable Network Graphics (*.png)|*.png|GIF (*.gif)|*.gif||";

IMPLEMENT_DYNAMIC(CTPSaveDialog, CFileDialog)

CTPSaveDialog::CTPSaveDialog(LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags, CWnd * pParentWnd, DWORD dwSize) :
    CFileDialog(FALSE, lpszDefExt, lpszFileName, dwFlags, m_cstrFilter, pParentWnd, dwSize, TRUE)
{
    AddCheckButton(IDC_CHK_FORCE, "Force", FALSE);
    m_bForce = FALSE;
    m_ofn.lpstrTitle = "Write Simulation To File";
}

CTPSaveDialog::~CTPSaveDialog()
{
}


BOOL CTPSaveDialog::OnInitDialog()
{
    CFileDialog::OnInitDialog();

    if (GetDlgItem(IDC_CHK_FORCE))
        SendDlgItemMessage(IDC_CHK_FORCE, BM_SETCHECK, m_bForce ? BST_CHECKED : BST_UNCHECKED);
    // TODO:  Add extra initialization here
    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

BEGIN_MESSAGE_MAP(CTPSaveDialog, CFileDialog)
    ON_BN_CLICKED(IDC_CHK_FORCE, &CTPSaveDialog::OnBnClickedCheckForce)
END_MESSAGE_MAP()

void CTPSaveDialog::CTPSaveDialog()
{
    m_bForce = !m_bForce;
}

void CTPSaveDialog::OnOK()
{
    // TODO: Add your specialized code here and/or call the base class

    CFileDialog::OnOK();
}

1 Ответ

4 голосов
/ 22 марта 2019

В CFileDialog в стиле Vista, сообщения Windows не обрабатываются на карте сообщений. Вместо этого CFileDialog использует определенные виртуальные функции. Вам нужно только объявить и определить эти функции.

Используйте OnCheckButtonToggled, чтобы определить, установлен ли флажок.

Используйте OnFileNameOK, чтобы определить, когда выбран файл и нажата кнопка Open/Save.

Используйте SetCheckButtonState для установки / отмены кнопки проверки (не SendDlgItemMessage)

См. CFileDialog для всех доступных методов.

Как указано в документации, OnInitDialog также не поддерживается:

Некоторые CFileDialog методы не поддерживаются в Windows Vista или потом. Проверьте отдельную тему метода для получения информации о том, метод поддерживается. Кроме того, следующие унаследованы функции не поддерживаются в Windows Vista или более поздней версии:

CDialog::OnInitDialog
...

Просто выполните инициализацию в конструкторе или перед вызовом DoModal() и переопределите эти функции:

class CTPSaveDialog : public CFileDialog
{
    ...
    virtual void OnCheckButtonToggled(DWORD dwIDCtl, BOOL bChecked);
    virtual BOOL OnFileNameOK();
};

void CTPSaveDialog::OnCheckButtonToggled(DWORD dwIDCtl, BOOL bChecked)
{
    if (dwIDCtl == IDC_CHK_FORCE)
        TRACE("Is checked? %d\n", bChecked);
}

BOOL CTPSaveDialog::OnFileNameOK()
{
    TRACE("Clicked Open/Save button\n");

    //return FALSE to close the dialog
    return FALSE;
}
...