2016-09-10 2 views
2

ちょうど小さなwin32プロジェクトをセットアップしようとしましたが、ウィンドウを作成しようとしていました。CWindowImpl - エラーコード1406を返します

私は、リソースデザイナでダイアログを作成し、私の窓のために、このクラスを設定します。

#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しようとしましたが、見つけることはあまりありません。

私が推測しなければならない問題は、いくつかのウィンドウクラス名の詳細が原因であると言えますが、実際はわかりません。

アドバイスはありますか?

+0

リソースでダイアログの属性を確認してください。おそらくあなたはそこに 'WS_CHILD'を含んでいます。直接的または間接的に。とにかく、リソーススクリプトを投稿してください。トンの場合は、最小限の完全な例に減らし、投稿してください(あなたはAFXのものを含める必要はありません)。 –

答えて

5

間違った部分からウィンドウクラスを作成しようとしています。

エラーは非常に説明的です。WS_CHILDスタイルの親なしウィンドウを作成しようとしていますが、これはうまくいかない。

デフォルトテンプレートパラメータ:CWindowImpl - > CWindowImplBaseT - > TWinTraits - > CControlWinTraitsの子スタイルを取得します。 CControlWinTraitsは、子コントロールウィンドウで使用することが想定されています。

ダイアログテンプレート(IDD_TTT_DIALOG)を使用する場合、適切な基本クラスはCDialogImplです。これは既に適切なウィンドウスタイルを使用するように準備されています。また、モーダルダイアログとモードレスダイアログの両方を作成するのに必要なものがあります。後者はウィンドウのように機能し、非ブロック化ですが、同時に定義済みのコントロールでダイアログテンプレートリソースを取得します。

+0

ありがとう、今私は理解する! – Sossenbinder

関連する問題