C++ 如何使用CWindowImpl类创建新窗口

C++ 如何使用CWindowImpl类创建新窗口,c++,winapi,atl,C++,Winapi,Atl,我正在尝试使用下面的类构建一个新窗口。 但是,在尝试使用CWindow::m_hwnd变量获取新生成的窗口名时,我遇到了一些严重的问题。我的猜测是,我应该将一个变量传递给CWindowImpl::Create()函数,该函数保存父级的HWND,但我不知道如何获取它 STDMETHODIMP CVMNExporter::SetSite(IUnknown *pUnkSite) { HRESULT hr; if(FAILED(hr = ATL::IObjectWithSiteImpl&

我正在尝试使用下面的类构建一个新窗口。 但是,在尝试使用CWindow::m_hwnd变量获取新生成的窗口名时,我遇到了一些严重的问题。我的猜测是,我应该将一个变量传递给CWindowImpl::Create()函数,该函数保存父级的HWND,但我不知道如何获取它

STDMETHODIMP CVMNExporter::SetSite(IUnknown *pUnkSite) {
    HRESULT hr;
    if(FAILED(hr = ATL::IObjectWithSiteImpl<CVMNExporter>::SetSite(pUnkSite)))
        return hr;
    // We are rnning from a web browser
    CONNECTION_CALLBACK = JSCRIPT_DISPID;
    EXPORTING_CALLBACK  = JSCRIPT_DISPID;
    MERGING_CALLBACK    = JSCRIPT_DISPID;
    ABORTING_CALLBACK   = JSCRIPT_DISPID;

    AddRef();
    if(NULL == Create(0)) {// Creates the hidden window
        Release();
        return HRESULT_FROM_WIN32(GetLastError());
    }
    ATLTRACE("TEST - SetSite(): this: %d, window: %d", this, m_hWnd);
    m_dwApartmentMode = HWND_APARTMENT;
    SendMessage(WM_EXPORTER_APARTMENT_SETUP, 0, 0);
    return S_OK;  }
STDMETHODIMP CVMNExporter::SetSite(IUnknown*朋克站点){
HRESULT-hr;
if(失败(hr=ATL::IObjectWithSiteImpl::SetSite(pUnkSite)))
返回人力资源;
//我们正在从网络浏览器中搜索
CONNECTION\u CALLBACK=JSCRIPT\u DISPID;
导出_CALLBACK=JSCRIPT_DISPID;
合并回调=JSCRIPT\u DISPID;
中止_CALLBACK=JSCRIPT_DISPID;
AddRef();
如果(NULL==Create(0)){//创建隐藏窗口
释放();
从_WIN32返回HRESULT_(GetLastError());
}
ATLTRACE(“TEST-SetSite():此:%d,窗口:%d”,此,m\u hWnd);
m_dwApartmentMode=HWND_公寓;
SendMessage(WM\u导出器\u公寓\u设置,0,0);
返回S_OK;}
CVMNExporter实现以下接口:

        public ATL::IObjectSafetyImpl<CVMNExporter, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>,
        public ATL::IObjectWithSiteImpl<CVMNExporter>,
        public ATL::CWindowImpl<CVMNExporter, ATL::CWindow, ATL::CFrameWinTraits>,
公共ATL::IObjectSafetyImpl, 公共ATL::IObjectWithSiteImpl, 公共ATL::CWindowImpl,
谢谢

我花了一些时间,但通过使用GetActiveWindow()解决了这个问题。

我花了一些时间,但通过使用GetActiveWindow()解决了这个问题。

CWindowImpl::Create
创建了这个窗口,从那时起,您的
HWND
就可以使用了。如果要提供父窗口句柄,首先需要从站点获取它。您需要使用
IOleWindow::GetWindow
或类似的方法来查询它。
CWindowImpl::Create
将创建该窗口,您将拥有可用的
HWND
。如果要提供父窗口句柄,首先需要从站点获取它。您需要使用
IOleWindow::GetWindow
或类似方法查询它。