Como faço para obter o HWND para um controle ActiveX após o controle foi inicializado / ativado?
Pergunta
Estou criando um ATL 8.0 controlo ActiveX baseada em C ++ usando Visual Studio 2008. Eu preciso para criar uma sub-janela e anexá-lo para o controle ActiveX.
Como posso ter acesso ao HWND que é de propriedade do controle ActiveX?
função que ATL posso substituir, a fim de usar o HWND após a janela do controle foi criado?
Solução 2
Depois de alguma tentativa e erro e eu encontrei a resposta que eu estava procurando.
No construtor do seu ActiveX ATL controlar você adicione a seguinte linha de código:
m_bWindowOnly = true;
Isso faz com que a janela para o controle a ser criado (em vez de apenas reutilizando o HWND da janela pai). Depois disso, o membro m_hWnd da classe de controle pode ser usado para acessar o HWND para a janela do controle.
Outras dicas
ActiveX permitem que você definir seus próprios métodos em sua própria interface (para o endereço Brians suposição), mas que provavelmente não vai ajudar aqui. O controle ActiveX pode muito bem ser criado por outro componente. ATL também é irrelevante -. É uma biblioteca C ++ modelo que wraps COM interfaces de
A função que você precisa aqui é IOleWindow :: GetWindow. Eu não tenho certeza que você entende por "substituir uma função ATL usar o HWMD". Depois de ter recuperado o HWND, você pode passá-lo para qualquer função que usa um HWND. Por exemplo, como o pai em SetParent (filho, pai)
[Full Disclosure]: Eu não sou tão familiarizado com ActiveX ou ATL, mas eu espero que este seja pelo menos um pouco útil
. Se ActiveX permite que você defina métodos arbitrários em seu objeto, tentar expor uma função que você pode chamar que irá simplesmente devolver o valor do HWND para você (o controle quase certamente conhece a sua própria HWND). Dessa forma, você pode chamar GetActiveXHwnd()
para obter o identificador necessário, o que você usaria então para posterior manipulação.