Pergunta

Estou desenvolvendo um controle ActiveX que (estes dias) é utilizado principalmente em WinForms apps.

O controle ActiveX tem um diálogo 'página de propriedades', que pode ser demonstrado por meio de programação usando o método ShowPropertyPages na classe AxHost. Esta é a interface do usuário personalizada que pode ser criado em Visual Studio para editar as propriedades de um controle.

Este diálogo página de propriedades contém um controle ListBox que usa um ImageList para exibir ícones ao lado de itens da lista. Estes ícones são 32 bits bitmaps misturou-alfa. Para que estes sejam exibidos corretamente, versão 6,0 ou acima de COMCTL32.DLL deve ser utilizado.

Infelizmente, quando eu executar o meu WinForms aplicativo, ele carrega e utiliza a versão COMCTL32.DLL 5.xxx . Como resultado, quando o diálogo página de propriedades é exibido os ícones parecem ruins (as áreas semi-transparentes são desenhadas em preto sólido).

A minha pergunta é: existe alguma maneira eu posso certifique-se de usar a versão COMCTL32.dll 6.0+ de dentro página de propriedades UI do controle ActiveX, independentemente do que o processo está usando? Ou posso forçar o processo de host para uso a versão 6.0? (Acho que não, porque estou pensando que o processo de host pode já ter carregado COMCTL32.DLL na memória antes de qualquer código no controle ActiveX.

Esta página cobre alguns cenários para usar Comctl32 6.0 , mas não a situação que eu estou dentro.

Foi útil?

Solução

O artigo original MSDN foi me confundindo porque focado em uma série de cenários específicos, nenhum dos quais combinados meu. Na verdade, a tecnologia subjacente que está falando sobre obras em geral.

adicionando um recurso 'manifesto' arquivo xml ao ActiveX DLL, eu posso sinalizar para o sistema side-by-side que eu quero que DLL usar COMCTL32.DLL 6.x. Essa versão é carregado automaticamente. Pretty nice.

Este manifesto precisa ser tipo de recurso RT_MANIFEST , com um ID de recurso de 2 .

Aqui está a evidência de sucesso (duas versões da mesma DLL carregado no mesmo processo!): Captura de tela procexp mostrando dois de Comctl32 carregado no processo

(também, os ícones exibidos corretamente na caixa de listagem ;) )

Outras dicas

Se seu aplicativo chama Application.EnableVisualStyles () (normalmente antes de chamar Application.Run () para iniciar um ciclo de mensagem), em seguida, versão 6+ da biblioteca de controles comuns deve ser usado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top