我在一个项目中编写了一个超级简单的 ATL 对话框。即使我注意到网络上的每个示例都内联实现了 CDialogImpl 类(即,类定义及其在定义本身中的实现),我还是照常编写它,将我的定义分隔在 .h 文件中,将实现分隔在 .cpp 中文件。这个类总结如下:
CMainDialog.hpp
class CMainDialog: public CDialogImpl<CMainDialog>
{
public:
enum { IDD = IDD_MYDIALOGS_DIALOG};
BEGIN_MSG_MAP(CMainDialog)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
END_MSG_MAP()
CMainDialog();
~CMainDialog();
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam,
BOOL& bHandled);
LRESULT OnCancel(UINT uMsg, WORD wID, HWND hWndCtl, BOOL& bHandled);
}
CMainDialog.cpp
CMainDialog::CMainDialog()
{
}
CMainDialog::~CMainDialog()
{
}
LRESULT CMainDialog::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam,
BOOL& bHandled)
{
}
LRESULT CMainDialog::OnCancel(UINT uMsg, WORD wID, HWND hWndCtl,
BOOL& bHandled)
{
}
如果我从同一个项目中调用这个类,一切都会好起来的。对话框显示。例子:
调用 DoModal
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
CMainDialog dialog;
dialog.DoModal();
return 0;
}
所以我将这个项目从_tWinMain转换.exe
为并删除。static library
因此,如果我创建一个新的 ATL 项目,请引用我新创建的库并调用 CMainDialog.DoModal ...好吧,什么也没有发生。构造函数确实被调用,但消息永远不会开始调度,程序会立即结束。也许我错过了什么?
我对 Win32 编程完全陌生(尽管对 c++ 绝对不是新手),所以任何帮助都将不胜感激。