none
问一个ATL窗口的问题。 RRS feed

  • 问题

  •     是这么回事。ATL创建窗口先是一个主窗口

    class CMainFrame :public CWindowImpl<CMainFrame,CWindow,CFrameWinTraits>
    {
    public:
        DECLARE_WND_CLASS(_T("MainWindow"))
        BEGIN_MSG_MAP(CMainFrame)
        END_MSG_MAP()
    };

    类似这样。。

    我在主窗口中响应一个事件什么的。再用类似的方法去创建一个子窗口。

    没有用对话框什么的。。但是会出错。GetLastError的错误代码是1401

    跟踪了下源码发现这个地方是这样的。

    template <class TBase, class TWinTraits>
    HWND CWindowImplBaseT< TBase, TWinTraits >::Create(HWND hWndParent, _U_RECT rect, LPCTSTR szWindowName,
    												   DWORD dwStyle, DWORD dwExStyle, _U_MENUorID MenuOrID, ATOM atom, LPVOID lpCreateParam)
    {
    	BOOL result;
    	ATLASSUME(m_hWnd == NULL);
    
    	// Allocate the thunk structure here, where we can fail gracefully.
    	result = m_thunk.Init(NULL,NULL);
    	if (result == FALSE) {
    		SetLastError(ERROR_OUTOFMEMORY);
    		return NULL;
    	}
    
    	if(atom == 0)
    		return NULL;
    
    	_AtlWinModule.AddCreateWndData(&m_thunk.cd, this);
    
    	if(MenuOrID.m_hMenu == NULL && (dwStyle & WS_CHILD))
    		MenuOrID.m_hMenu = (HMENU)(UINT_PTR)this;
    	if(rect.m_lpRect == NULL)
    		rect.m_lpRect = &TBase::rcDefault;
    
    	HWND hWnd = ::CreateWindowEx(dwExStyle, MAKEINTATOM(atom), szWindowName,
    		dwStyle, rect.m_lpRect->left, rect.m_lpRect->top, rect.m_lpRect->right - rect.m_lpRect->left,
    		rect.m_lpRect->bottom - rect.m_lpRect->top, hWndParent, MenuOrID.m_hMenu,
    		_AtlBaseModule.GetModuleInstance(), lpCreateParam);
    
    	ATLASSUME(m_hWnd == hWnd);
    
    	return hWnd;
    }

    这个地方 会把传递个this到MenuID 。

    请问下这个什么情况 。。

    怎么解决。

    2014年2月23日 9:58

答案

  • 不要意思  我仔细的看了下。。是因为我指定了。WS_POPUP的原因

    WS_POPUP 和 WS_CHILD 不能同时 存在 。

    我本意是想创建一个 弹出式的 子窗口。。

    看来既然是弹出式的 就没必要是一个子窗口了。。

    实在对不起。

    2014年2月24日 2:38

全部回复

  • if(MenuOrID.m_hMenu == NULL && (dwStyle & WS_CHILD))
       MenuOrID.m_hMenu = (HMENU)(UINT_PTR)this;

    注意判断条件:dwStyle &WS_CHILD

    你创建子窗体时指定了 WS_CHILD 样式了吗?

    2014年2月24日 1:30
  • 大哥  我当然指定了。。。我上面就说我要创建一个子窗口。。

    但是错误是1401 查了下。是无效的菜单句柄。

    所以我想 是不是这个地方的问题。

    2014年2月24日 1:49
  • 你能说下你的错误出现在哪条语句吗?因为我实在是没法从你的文字中去推断出你的错误出现在哪条语句。

    2014年2月24日 2:25
  • 不要意思  我仔细的看了下。。是因为我指定了。WS_POPUP的原因

    WS_POPUP 和 WS_CHILD 不能同时 存在 。

    我本意是想创建一个 弹出式的 子窗口。。

    看来既然是弹出式的 就没必要是一个子窗口了。。

    实在对不起。

    2014年2月24日 2:38
  • 不要意思  我仔细的看了下。。是因为我指定了。WS_POPUP的原因

    WS_POPUP 和 WS_CHILD 不能同时 存在 。

    我本意是想创建一个 弹出式的 子窗口。。

    看来既然是弹出式的 就没必要是一个子窗口了。。

    实在对不起。


    没关系,像这样提问题的人很多,我都是一边猜,一边引导性的问出问题发生的场景。
    2014年2月24日 2:53