Usando a API Janela, como posso garantir controles manter uma aparência nativa?
-
02-07-2019 - |
Pergunta
Alguns dos controles eu criei parecem padrão para o velho tema do Windows 95, como posso impedir isso? Aqui está um exemplo de um botão que não retenha aparência nativa do sistema operacional (estou usando o Vista como meu ambiente de desenvolvimento):
HWND button = CreateWindowEx(NULL, L"BUTTON", L"OK", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
170, 340, 80, 25, hwnd, NULL, GetModuleHandle(NULL), NULL);
Eu estou usando C ++ nativo com o Windows API, código não gerenciado.
Solução
Eu acredito que não tem nada a ver com o seu código, mas você precisa configurar uma adequada manifesto arquivo para obter os controles temáticos.
Algumas informações aqui: @ msdn.com e aqui: @ blogs.msdn.com
Você pode ver a diferença entre a aplicação com e sem manifesto aqui: heaventools.com
Outras dicas
Para adicionar um manifesto para o aplicativo que você precisa criar um arquivo MyApp.manifest e adicioná-lo ao arquivo de recurso do aplicativo:
//-- This define is normally part of the SDK but define it if this
//-- is an older version of the SDK.
#ifndef RT_MANIFEST
#define RT_MANIFEST 24
#endif
//-- Add the MyApp XP Manifest file
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "MyApp.manifest"
Com as versões mais recentes do Visual Studio há um Manifest ferramenta ??em> guia encontrados nas configurações do projeto e do Arquivos Adicionais Manifest campo encontrado neste guia também pode ser usado para definir o arquivo de manifesto.
Aqui está um arquivo MyApp.manifest simples para uma aplicação Win32:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.1"
processorArchitecture="X86"
name="Microsoft.Windows.MyApp"
type="win32"
/>
<description>MyApp</description>
</assembly>
Se você aplicação depende das outras DLLs esses detalhes também pode ser adicionado ao manifesto e Windows irá usar esta informação para se certificar que seu aplicativo usa sempre as versões corretas dessas DLLs dependentes.
Por exemplo, aqui estão as manifestas detalhes de dependência para o controle comum e versão bibliotecas de execução 8.0 C:
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.VC80.CRT"
version="8.0.50608.0"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b" />
</dependentAssembly>