用ATL做一个控件,放在VB里用。
先设Visible = False, 再通过一个Button Click事件设Visible = True.
完成以后Focus在ATL控件里,和标准控件的行为不一致(Focus留在Button上)。跟踪了一下发现,
IOleObjectImpl<xxx>::DoVerbShow(...)调用
CComControlBase::InPlaceActivate(...)后者代码里执行了:
ShowWindow(m_hWndCD, SW_SHOW);
if (!::IsChild(m_hWndCD, ::GetFocus()))
    ::SetFocus(m_hWndCD);问:如何做到和标准控件行为一致?
再重新把Focus设回去的不算,逻辑上已经不对了。

解决方案 »

  1.   

    在VB中,可以用无窗口的控件来做,这时不知会不会是你说的那各种情况。
    否则可不可在你的控件中重载这个内连函数,把那句删了,inline HRESULT CComControlBase::InPlaceActivate(LONG iVerb, const RECT* /*prcPosRect*/)
    (不知内连函数可否重载,并这样用过。),因为调用时它也是用pT->InPlaceActivate方式调用的啊。
      

  2.   

    在VB中,可以用无窗口的控件来做,这时不知会不会是你说的那各种情况。
    否则可不可在你的控件中重载这个内连函数,把那句删了,inline HRESULT CComControlBase::InPlaceActivate(LONG iVerb, const RECT* /*prcPosRect*/)
    (不知内连函数可否重载,并这样用过。),因为调用时它也是用pT->InPlaceActivate方式调用的啊。=================================================================================
    有道理,我怎么就没想到呢~我试试
      

  3.   

    搞定,谢谢zxyjyzxyjy(星星)! :)