从CPropertyPageImpl打开CDialogImpl

时间:2014-02-16 16:19:15

标签: c++ atl wtl

我正在开发ATL / WTL软件。它是一个DLL库,作为shell扩展,为Windows中的多媒体文件创建一个属性页(该软件称为MediaTab,你可以搜索它以便更好地理解我),

主对话框在MediaTabDlg类中管理(继承自CPropertyPageImpl)。在这个对话框中,我有一个按钮,用于打开一个新对话框(模态)以配置高级设置。此模式对话框在FileExtDlg类中管理(继承自CDialogImpl)。

问题来了。我可以单击按钮打开模式对话框,但该对话框上没有任何事件正在处理。也没有确定按钮,取消按钮或角落里的X正在工作,所以我无法关闭对话框!

这里有相关代码:

MediaTabDlg.h

class MediaTabDlg : public CPropertyPageImpl<MediaTabDlg>
{
public:
MediaTabDlg(TCHAR file[MAX_PATH],int nfiles);
~MediaTabDlg(void);

enum { IDD = IDD_MEDIATAB_PROPPAGE };

BEGIN_MSG_MAP(MediaTabDlg)
    MESSAGE_HANDLER( WM_INITDIALOG,   OnInitDialog )
    COMMAND_HANDLER( IDC_EDITFILEEXT,   BN_CLICKED, OnEditFileExt )
    ...
    CHAIN_MSG_MAP( WTL::CPropertyPageImpl<MediaTabDlg> )
END_MSG_MAP()

    ...
LRESULT OnEditFileExt(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
};

MediaTabDlg.cpp

...
LRESULT MediaTabDlg::OnEditFileExt(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
    FileExtDlg dlg;
    dlg.DoModal();
    return S_OK;
}
...

FileExtDlg.h

class FileExtDlg :  public CDialogImpl<FileExtDlg>
{
public:
FileExtDlg();
~FileExtDlg(void);

enum { IDD = IDD_FILEEXTDLG };

BEGIN_MSG_MAP(FileExtDlg)
    MESSAGE_HANDLER( WM_INITDIALOG,   OnInitDialog )
    COMMAND_HANDLER( IDOK, BN_CLICKED, OnOK)
    COMMAND_HANDLER( IDCANCEL, BN_CLICKED, OnCancel )
END_MSG_MAP()

// manejadores de eventos
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
LRESULT OnOK(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/);
LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
};

FileExtDlg.cpp

FileExtDlg::FileExtDlg() {}

FileExtDlg::~FileExtDlg(void) {}

LRESULT FileExtDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    SetDlgItemText ( IDCANCEL, _T("blablabla") );
    GetDlgItem(IDCANCEL).ShowWindow(false);
    return S_OK;
}

LRESULT FileExtDlg::OnOK(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    MessageBox(_T("Helloooo!"));
    EndDialog(1);
    return 0;
}

LRESULT FileExtDlg::OnCancel(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    MessageBox(_T("Hello!"));
    EndDialog(0);
    return 0;
}

就是这样。没有执行任何事件处理程序(没有显示MessageBox,OnInitDialog中的代码不运行......并且EndDialog永远不会运行),但是对话框显示出来。

您怎么看?

谢谢

P.P:我已经尝试过CSimpleDialog并且工作正常,但显然这对我来说还不够,因为我需要在对话框中添加一些代码。但是,它可以是一个线索:MediaTabDlg代码必须正常,我认为......

P.D2:我尝试过WTL 9.0,8.1和8.0但没有成功。

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。

我认为与对话框自动生成的代码和ATL框架存在某种冲突,因为该问题与ID资源名称有关。我不确切知道为什么,但我将标准按钮的ID更改为其他内容(IDOK - &gt; IDC_OK,IDCANCEL - &gt; IDC_CANCEL),现在所有工作:按钮,消息地图等。

我修改了代码(FileExtDlg.h)

class FileExtDlg : public ATL::CDialogImpl<FileExtDlg>
{
public:
    FileExtDlg();
    ~FileExtDlg(void);

    enum { IDD = IDD_FILEEXTDLG };

    BEGIN_MSG_MAP(FileExtDlg)
        MESSAGE_HANDLER( WM_INITDIALOG,   OnInitDialog )
        MESSAGE_HANDLER( WM_CLOSE, OnClose )
        COMMAND_HANDLER( IDC_OK, BN_CLICKED, OnOK)
        COMMAND_HANDLER( IDC_CANCEL, BN_CLICKED, OnCancel)
        COMMAND_HANDLER( IDC_PRUEBA, BN_CLICKED, OnPrueba)
    END_MSG_MAP()

    // event handlers
    LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
    LRESULT OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
    LRESULT OnOK(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/);
    LRESULT OnPrueba(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/);
    LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);

    // own functions
    LRESULT Cerrar(void);
};