我创建了一个ATL windows less控件,类定义如下:
class ATL_NO_VTABLE CRSPClient :
public IObjectSafetyImpl<CRSPClient, INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA>,
public CComObjectRootEx<CComSingleThreadModel>,
public IDispatchImpl<IRSPClient, &IID_IRSPClient, &LIBID_axBanckleRSPClientLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IPersistStreamInitImpl<CRSPClient>,
public IOleControlImpl<CRSPClient>,
public IOleObjectImpl<CRSPClient>,
public IOleInPlaceActiveObjectImpl<CRSPClient>,
public IQuickActivateImpl<CRSPClient>,
public IViewObjectExImpl<CRSPClient>,
public IOleInPlaceObjectWindowlessImpl<CRSPClient>,
#ifdef _WIN32_WCE // IObjectSafety is required on Windows CE for the control to be loaded correctly
public IObjectSafetyImpl<CRSPClient, INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
#endif
public CComCoClass<CRSPClient, &CLSID_RSPClient>,
public CComControl<CRSPClient>
Run Code Online (Sandbox Code Playgroud)
然后出于某种目的,我需要将消息发布到窗口。我尝试通过多种方式获取窗口句柄,但都失败了:
HWND CRSPClient::GetHwnd()
{
HWND hwndRet = NULL;
// hwndRet = m_hWnd;
//IOleInPlaceActiveObjectImpl<CRSPClient>::GetWindow(&hwndRet);
//IOleWindow<CRSPClient>::GetWindow(&hwndRet);
//this->m_spInPlaceSite->GetWindow(&hwndRet);
//CComQIPtr<IOleInPlaceSite> spSite = this->m_spClientSite;
//spSite->GetWindow(&hwndRet);
//hwndRet = ::WindowFromDC(GetDC());
return hwndRet;
}
Run Code Online (Sandbox Code Playgroud)
有人知道有什么办法可以得到 HWND 吗?
天哪,我对微软伟大的 ATL 框架感到非常沮丧!
无窗口控件的全部要点是它无需窗口句柄即可工作。如果您想使用窗口句柄,以防万一它存在并且控件返回到窗口模式,那么很简单:m_hWndCD。
否则,如果您必须有一个窗口,那么您可以在构造函数中标记m_bWindowOnly并表明您将需要一个HWND:
指示控件应该有窗口的标志,即使容器支持无窗口控件。
如果您仍然希望它无窗口并且有时需要一个窗口,那么在运行时出现的某些条件下,您始终可以选择创建一个仅私有消息的窗口并通过它调度消息。
| 归档时间: |
|
| 查看次数: |
3200 次 |
| 最近记录: |