用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设回去的不算,逻辑上已经不对了。
先设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设回去的不算,逻辑上已经不对了。
否则可不可在你的控件中重载这个内连函数,把那句删了,inline HRESULT CComControlBase::InPlaceActivate(LONG iVerb, const RECT* /*prcPosRect*/)
(不知内连函数可否重载,并这样用过。),因为调用时它也是用pT->InPlaceActivate方式调用的啊。
否则可不可在你的控件中重载这个内连函数,把那句删了,inline HRESULT CComControlBase::InPlaceActivate(LONG iVerb, const RECT* /*prcPosRect*/)
(不知内连函数可否重载,并这样用过。),因为调用时它也是用pT->InPlaceActivate方式调用的啊。=================================================================================
有道理,我怎么就没想到呢~我试试