2016-09-10 108 views
2

我只是試圖設置一個小型的win32項目,並且正要創建一個窗口。CWindowImpl - Create()返回錯誤代碼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); 

然而,創建方法並返回NULL所有的時間。我用GetLastError()檢查了錯誤代碼,結果我得到了錯誤代碼1406或「ERROR_TLW_WITH_WSCHILD」。

MSDN文檔指出以下有關此錯誤:「無法創建頂層子窗口」

我試圖谷歌了這一點,但沒有多少發現。

如果我不得不猜測,我會說這個問題是由一些窗口類名稱的細節引起的,但我真的不確定。

有什麼建議嗎?

+0

檢查對話框的屬性中的資源。也許你在那裏包含了'WS_CHILD'。直接或間接。無論如何,發佈資源腳本。除非它噸,在這種情況下,減少到一個最小的,但完整的例子,並張貼它(你不需要包括AFX的東西)。 –

回答

5

您正試圖從錯誤的部分構建窗口類。

該錯誤是非常具有描述性的:您正試圖創建一個WS_CHILD風格的無母版窗口,這不起作用。

您從默認模板參數CWindowImpl - > CWindowImplBaseT - > TWinTraits - > CControlWinTraits獲取子樣式。 CControlWinTraits應該用於兒童控制窗口。

如果您打算使用對話框模板(IDD_TTT_DIALOG),那麼正確的基類是CDialogImpl,它已經準備好使用正確的窗口樣式。此外,它具有創建模態和非模態對話所需的功能。後者的行爲更像Windows,並且是非阻塞的,但同時需要使用預定義控件的對話框模板資源。

+0

謝謝,現在我明白了! – Sossenbinder