Há muito tempo que há discussões na Internet sobre a implementação do estilo XP por meio de programação, mas não existe uma solução perfeita para implementar o estilo XP por meio de programação VB. O autor finalmente revelou o segredo através de N dias e noites de árduo estudo. O seguinte está dividido em três aspectos para compartilhar com vocês.
Clique para baixar o arquivo do código-fonte
um. Usando arquivos de manifesto para alcançar o estilo XP
Em circunstâncias normais, em sistemas Windows XP, apenas a barra de título da janela de um aplicativo desenvolvido em VB6 possui o estilo XP, e os botões, caixas de texto e outros controles no formulário ainda exibem o estilo tradicional do Windows. Conforme mostrado na Figura 1:
Consultando o capítulo Estilo Visual no MSDN, sabemos que o Windows XP usa Comctl32.dll (versão 6) para carregar componentes com estilo XP, e o aplicativo notifica o sistema para fazer isso através de um arquivo de recursos XML. O conteúdo do arquivo XML é o seguinte:
<?xml versão=1.0 codificação=UTF-8 autônomo=sim?>
<assembly xmlns=urn:schemas-microsoft-com:asm.v1 manifestVersion=1.0>
<assemblyIdentidade
name=manifesto estilo XP
arquitetura do processador = x86
versão=1.0.0.0
tipo=win32/>
<dependência>
<dependenteMontagem>
<assemblyIdentidade
tipo=win32
nome=Microsoft.Windows.Common-Controls
versão=6.0.0.0
arquitetura do processador = x86
publicKeyToken=6595b64144ccf1df
idioma=*
/>
</dependentAssembly>
</dependência>
</montagem>
Suponha que o nome do seu programa compilado final seja abc.exe e o diretório de trabalho seja d:/vbxp. Copie o conteúdo XML acima e salve-o como um arquivo de texto. Em seguida, renomeie o arquivo abc.exe.manifest (observe que a extensão .txt deve ser removida). No programa VB, precisamos chamar a função InitCommonControlsEx para inicializar a classe do componente de comctl32.dll (versão 6) antes que todos os formulários sejam carregados. A função API InitCommonControlsEx e constantes e tipos de dados relacionados são declarados da seguinte forma:
Função de declaração privada InitCommonControlsEx Lib comctl32.dll _
(iccex As tagInitCommonControlsEx) Como Booleano
Tipo privado tagInitCommonControlsEx
TamanhoLng tão longo
lngICC enquanto
Tipo final
Const privada ICC_USEREX_CLASSES = &H200
Aqui escrevemos uma função para encapsular a operação de inicialização:
Função pública InitCommonControlsVB() como booleano
Em caso de erro, retomar o próximo
Dim iccex As tagInitCommonControlsEx
Com gelo
.lngSize = LenB(iccex)
.lngICC = ICC_USEREX_CLASSES
Terminar com
InitCommonControlsEx iccex
InitCommonControlsVB = (Err.Number = 0)
Em caso de erro, vá para 0
Função final
Observe que a ação de inicialização deve ser concluída antes de todos os formulários serem carregados, portanto, as instruções relevantes devem ser colocadas em Sub Main() e o projeto deve ser iniciado em Sub Main(). O código é o seguinte:
Subprincipal()
InitCommonControlsVB
Formulário1.Mostrar
Finalizar sub
Neste ponto, seu abc.exe compilado terá o estilo XP, conforme mostrado na Figura 2: