c++ - CWindowImpl - Create() 返回错误代码 1406

标签 c++ winapi atl wtl

我刚刚尝试设置一个小型 win32 项目,并且正要创建一个窗口。

我在资源设计器中创建了一个对话框并为我的窗口设置了这个类:

#pragma once
#include "stdafx.h"

class TTTMainDialog : public CWindowImpl<TTTMainDialog>
{
public:

    DECLARE_WND_CLASS(_T("TTTDlg"))

    enum { IDD = IDD_TTT_DIALOG };

    BEGIN_MSG_MAP_EX(MusicPlayerDialog)
        MSG_WM_INITDIALOG(OnInitDialog);
        MSG_WM_CLOSE(OnClose);
        MSG_WM_DESTROY(OnDestroy);
    END_MSG_MAP()

    TTTMainDialog();
    ~TTTMainDialog();

private:

    const BOOL OnInitDialog(const CWindow wndFocus, const LPARAM lInitParam);
    void OnClose();
    void OnDestroy();
};

如你所见,我添加了窗口类声明,我继承了CWindowImpl,我注册了对话框。我不认为我在这里忘记了什么。

在应该创建对话框的类中,我尝试这样创建它:

TTTMainDialog myDialog;
HWND handle = myDialog.Create(NULL);
myDialog.ShowWindow(nCmdShow);

但是,Create 方法始终返回 NULL。我用 GetLastError() 检查了错误代码,结果我得到了错误代码 1406,或“ERROR_TLW_WITH_WSCHILD”。

msdn 文档对这个错误的描述如下:

“无法创建顶级子窗口。”

我试图用谷歌搜索这个,但没有太多可找到的。

如果我不得不猜测,我会说问题是由一些窗口类名称细节引起的,但我真的不确定。

有什么建议吗?

最佳答案

您正在尝试从错误的部分构建窗口类。

该错误非常具有描述性:您正在尝试创建一个带有 WS_CHILD 的无父窗口风格,这行不通。

您从默认模板参数获取子样式:CWindowImpl -> CWindowImplBaseT -> TWinTraits -> CControlWinTraits。 CControlWinTraits应该与子控制窗口一起使用。

如果您要使用对话框模板 (IDD_TTT_DIALOG),那么正确的基类是 CDialogImpl ,它已经准备好使用适当的窗口样式。此外,它还具有创建模态和非模态对话框所需的功能。后者的行为更像窗口并且是非阻塞的,但同时使用带有预定义控件的对话框模板资源。

关于c++ - CWindowImpl - Create() 返回错误代码 1406,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39423719/

相关文章:

c++ - 轻松地将许多重要的 "static library projects"重构为 "dll projects"

c++ - Win32 更改为二进制模式子标准输出(管道)

c++ - 如何创建加密的挂载文件夹

windows - 具有 Virtualprotect 问题的自修改算法

c++ - 我应该如何在 ATL 项目中创建类?

c++ - 如何使用 CAtlComModule 实现 COM 事件接收器?

c++ - CreateProcess() lpCurrentDirectory 无效

c++ - C2084 - 函数已经有主体

C++ vector 随机洗牌它的一部分

c++ - 如何解密 MAPI IMessage