有一点发现:
条件:ATL-》FULL Control中选择InVisible at Runtime,在ATL中产生的工程文件中这一个这样的宏:
BEGIN_MSG_MAP(CXTimer)
CHAIN_MSG_MAP(CComControl<CXTimer>)
DEFAULT_REFLECTION_HANDLER()//就是这里!!!!!!!!
MESSAGE_HANDLER(WM_CREATE, OnCreate)
END_MSG_MAP()
在ATLWIN.h中发现如下定义:
#define DEFAULT_REFLECTION_HANDLER()  if(DefaultReflectionHandler(hWnd, uMsg, wParam, lParam, lResult))  return TRUE;再往下发现:
template <class TBase>
BOOL CWindowImplRoot< TBase >::DefaultReflectionHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult)
{
switch(uMsg)
{
case OCM_COMMAND:
case OCM_NOTIFY:
case OCM_PARENTNOTIFY:
case OCM_DRAWITEM:
case OCM_MEASUREITEM:
case OCM_COMPAREITEM:
case OCM_DELETEITEM:
case OCM_VKEYTOITEM:
case OCM_CHARTOITEM:
case OCM_HSCROLL:
case OCM_VSCROLL:
case OCM_CTLCOLORBTN:
case OCM_CTLCOLORDLG:
case OCM_CTLCOLOREDIT:
case OCM_CTLCOLORLISTBOX:
case OCM_CTLCOLORMSGBOX:
case OCM_CTLCOLORSCROLLBAR:
case OCM_CTLCOLORSTATIC:
lResult = ::DefWindowProc(hWnd, uMsg - OCM__BASE, wParam, lParam);
return TRUE;
default:
break;
}
return FALSE;
}
从以上的可以看出,WM_CREATE初忽略,我想只有定制自已的这个函数,这是方法之一,你先试一下,至于你的第一种方法,我在帮你找一下????对了,你是如何取得容器的HWND,能告诉我吗???,我的mail:[email protected]我有个想法,等我试一下再给你答案????

解决方案 »

  1.   

    我找到了取得容器的HWND:IOleWindow::GetWindow()可以取得容器HWND。
      

  2.   

    谢谢楼上的,又可以回复了。以下是我在ATLCTL.h中发现的一些代码:
    inline HRESULT CComControlBase::InPlaceActivate(LONG iVerb, const RECT* /*prcPosRect*/)
    {
    ...........省略一把
    OLEINPLACEFRAMEINFO frameInfo;
    RECT rcPos, rcClip;
    CComPtr<IOleInPlaceFrame> spInPlaceFrame;
    CComPtr<IOleInPlaceUIWindow> spInPlaceUIWindow;
    frameInfo.cb = sizeof(OLEINPLACEFRAMEINFO);
    HWND hwndParent;
    if (m_spInPlaceSite->GetWindow(&hwndParent) == S_OK)
    {
    m_spInPlaceSite->GetWindowContext(&spInPlaceFrame,
    &spInPlaceUIWindow, &rcPos, &rcClip, &frameInfo); if (!m_bWndLess)
    {
    if (m_hWndCD)
    {
    ShowWindow(m_hWndCD, SW_SHOW);
    if (!::IsChild(m_hWndCD, ::GetFocus()))
    ::SetFocus(m_hWndCD);
    }
    else
    {
    HWND h = CreateControlWindow(hwndParent, rcPos);
    ATLASSERT(h != NULL); // will assert if creation failed
    ATLASSERT(h == m_hWndCD);
    h; // avoid unused warning
    }
    } pIPO->SetObjectRects(&rcPos, &rcClip);
    }
    这个对于你的第一种应该有帮助吧!,行不行我不知道,我想做事了,有空再来帮你一把。
    我也菜死了............................
      

  3.   

    谢谢啦,呵呵
    当我采用Winodw Only的时候,在WM_CREATE响应函数中使用GetParent()就可以了,很简单。此时,控件的m_hWnd != NULL。
    我还试过这个办法:不选择Window Only,这样的话,无法响应WM_CREATE消息,我找到一个也许可以的进行初始化的地方,是InPlaceActive,在这里,使用下面的代码
        HDC hDC;
        // Get the HDC from the client
        m_spInPlaceSite->GetDC(NULL, OLEDC_NODRAW, &hDC);
        hTheWnd = WindowFromDC(hDC);
    这样得到的句柄就是容器的句柄。但是,InPlaceActive,在WindowLess的时候,相应两次,而且,我也不很清楚是否在某些情况下还会被调用,所以,我感觉这个函数不是一个好地方。我想解决的问题是当我在Window Only时,我可以将该控件隐藏起来,不知道该怎么做了,:(
      

  4.   

    我上面代码中有一段可参考:
    ;
        if (m_spInPlaceSite->GetWindow(&hwndParent) == S_OK)
        {
            m_spInPlaceSite->GetWindowContext(&spInPlaceFrame,
                &spInPlaceUIWindow, &rcPos, &rcClip, &frameInfo);        if (!m_bWndLess)//你是Window Only,
            {
                if (m_hWndCD)//我想这个也不为空
                {
                    ShowWindow(m_hWndCD, SW_SHOW);//我想这行是关键????
                    if (!::IsChild(m_hWndCD, ::GetFocus()))
                        ::SetFocus(m_hWndCD);
                }
                else
                {
                    HWND h = CreateControlWindow(hwndParent, rcPos);
                    ATLASSERT(h != NULL);    // will assert if creation failed
                    ATLASSERT(h == m_hWndCD);
                    h;    // avoid unused warning
                }
            }我在ATL的源程序中发现,在为Window Only的时候,h_hWndCD到处都在使用,
      

  5.   

    是啊,这样就比较奇怪了,难道Window Only的就不能Hide吗?不应该阿
    我跟踪后,发现,在OnCreate中调用ShowWindow(SW_HIDE)返回false,跟踪进入SetModify,发现,其中并不含有WS_VISIBLE属性,可是,建立完之后,用spy看,有这个属性,7456,这好像和ShowWindow(SW_HIDE)的返回值对应上了,msdn中说,如果ShowWindow(SW_HIDE)返回false,说明窗口已经隐藏了,:(另外,你贴的这段代码,我看了,可能是这个原因,可是,他既然可以SW_SHOW,就应该可以SW_HIDE吧,呵呵。而且我在InPlaceActive和OnCreate中调用时,采用了ATLTRACE,发现,InPlaceActive在OnCreate之前执行,奇怪。