我正在开发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但没有成功。
答案 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);
};