Open a CDialogImpl from a CPropertyPageImpl

Open a CDialogImpl from a CPropertyPageImpl

本文关键字:CPropertyPageImpl from CDialogImpl Open      更新时间:2023-10-16

我正在开发ATL/WTL软件。这是一个DLL库,作为外壳扩展,在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);
};

媒体选项卡Dlg.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.D:我尝试过CSimpleDialog,效果很好,但显然这对我来说还不够,因为我需要在对话框中放入一些代码。然而,这可能是一条线索:MediaTabDlg代码一定是好的,我认为。。。

p.D2:我试过WTL 9.0、8.1和8.0,都没有成功。

我自己解决了这个问题。

我认为对话框自动生成的代码和ATL框架之间存在某种冲突,因为问题与ID资源名称有关。我不知道为什么,但我把标准按钮的ID改成了其他东西(IDOK->IDC_OK,IDCANCEL->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);
};
相关文章:
  • 没有找到相关文章