CWindowImpl - Create () возвращает код ошибки 1406

Я просто попытался настроить небольшой проект 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 об этой ошибке говорится следующее:

«Невозможно создать дочернее окно верхнего уровня».

Я попытался найти это в Google, но найти особо нечего.

Если бы мне пришлось предположить, я бы сказал, что проблема вызвана некоторыми деталями имени класса окна, но я действительно не уверен.

Любой совет?


person Sossenbinder    schedule 10.09.2016    source источник
comment
Проверьте атрибуты диалога в ресурсе. Может быть, вы включили туда WS_CHILD. Прямо или косвенно. В любом случае, опубликуйте сценарий ресурса. Если только это не тонны, в этом случае сократите его до минимального, но полного примера и опубликуйте его (вам не нужно включать материал AFX).   -  person Cheers and hth. - Alf    schedule 10.09.2016


Ответы (1)


Вы пытаетесь построить класс окна из неправильных частей.

Ошибка довольно описательная: вы пытаетесь создать окно без родителей с помощью WS_CHILD , и это не сработает.

Вы получаете дочерний стиль из параметра шаблона по умолчанию: CWindowImpl -> CWindowImplBaseT -> TWinTraits -> CControlWinTraits. CControlWinTraits предполагается использовать с дочерними окнами управления.

Если вы собираетесь использовать шаблон диалогового окна (IDD_TTT_DIALOG), то правильный базовый класс - CDialogImpl, который уже подготовлен для использования правильных стилей окон. Кроме того, у него есть все, что нужно для создания как модальных, так и немодальных диалогов. Последние действуют больше как окна и являются неблокирующими, но в то же время используют ресурс шаблона диалога с предопределенными элементами управления.

person Roman R.    schedule 10.09.2016
comment
Спасибо, теперь я понял! - person Sossenbinder; 10.09.2016