Fazer um aplicativo seja qual destino ele terá com seus menus, telas e etc até que não é bicho de sete cabeças.
Mas ai chega a hora de rodar o mesmo naquele XP com tema modificado e seu aplicativo continua parecendo estar na era do Windows 95.
Para tanto podemos sacar o uso de temas em nossos aplicativos sem muito trabalho.
Basta ter em mãos um arquivo MANifest qualquer, exemplo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly
xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
processorArchitecture="x86"
version="1.0.0.0"
type="win32"
name="log.exe"/>
<description>DBFViewer 2000</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="x86"/>
</dependentAssembly>
</dependency>
</assembly>
Neste exemplo estou visualizando o MANifest do DBViewer 2000.
Para que seu aplicativo for Windows possa pegar carona no tema do Windows basta fazer assim:
SISTEMA.EXE
SISTEMA.EXE.MANIFEST
Onde SISTEMA.EXE é o seu aplicativo e SISTEMA.EXE.MANIFEST é um arquivo texto com o conteúdo acima.
Pronto seu aplicativo começa a ficar mais compativel com a interface.
Mas se eu não quizer usar um MANifest externo, posso incorporar isto diretamente em meu executável?
Sim.
Para isto introduziremos o arquivo dentro do .RC que será ligado ao seu aplicativo, assim:
1 24 "sistema.exe.manifest"
1 ICON SISTEMA.ICO
Então utilizaremos os comandos necessários para gerar o arquivo .RES que posteriormente será integrado ao .EXE. Supondo que criei o arquivo MANIFEST.RC, então:
brc32 -r MANIFEST -foMANIFEST
Será criado o arquivo MANIFEST.RES.
Como o trabalho geralmente é gerenciado por arquivo de lotes o BUILDH.BAT que acompanha o Fivewin gera um arquivo com extensão .BC que contém todas as informações necessárias para gerar o executável, exemplo:
C:\BCC55\LIB\c0w32.obj +
Sistema.obj +
Outro.obj +
MaisOutro.obj +
Ultimo.obj, +
Sistema.exe, +
Sistema.map, +
C:\FIVEWIN\LIB\FiveH.lib +
C:\FIVEWIN\LIB\FiveHC.lib +
C:\HARBOUR\LIB\hbSix.lib +
C:\HARBOUR\LIB\hbzip.lib +
C:\BCC55\LIB\import32.lib,, +
Manifest.res
No trecho reduzido acima deixei apenas algumas linhas para se ter noção do conteúdo do arquivo, mas a estrutura deve ser idêntica e a hierarquia de arquivos deve ser mantida, sem esquecer das divisões entre os conjuntos feitas pelas virgulas.
Desta forma seu sistema terá incorporada a estrutura de temas. Caso queira acrescentar icones e bitmaps, basta incorporá-los a um .RC, compilar e acrescentar o .RES correspondente, assim:
Manifest.res + bitmaps.res + icones.res + telas.res
Mas o tópico dis algo sobre .DLL de recursos, num to entendendo onde o Rochinha quer chegar...
Calma.
A partir do que foi apresentado acima podemos dar partida no módulo avançado do tópico.
Para isto precisaremos de mais recursos: um arquivo de lote chamada RC2DLL32.BAT e um arquivo C chamado SCREEN32.C.
O RC2DLL32.BAT irá compilar o SCREEN32.C que juntamente com algumas bibliotecas e sua .RES de telas, icones e bitmaps gerará sua .DLL.
RC2DLL32.BAT
@ECHO OFF
@rem RC file to 32 bits resources DLL
@rem syntax: rc2dll32.bat Your_rc_file !!! without the .RC extension
@ECHO #include "WinApi.ch" > SISTEMA.RC
@ECHO #include "telas.rc" >> SISTEMA.RC
@SET FWDIR=c:\fivewin
@SET BCDIR=c:\bcc55
@IF EXIST NFWH29.DLL DEL NFWH29.DLL
copy %FWDIR%\dll\SCREEN32.C
copy %BCDIR%\lib\uuid.lib
%BCDIR%\bin\bcc32 -c -I%BCDIR%\include SCREEN32.C
%BCDIR%\bin\brc32 -r NFWH29.rc
%BCDIR%\bin\ilink32 /Tpd /v %BCDIR%\lib\c0d32.obj SCREEN32.OBJ, SISTEMA.DLL,,%BCDIR%\lib\cw32.lib %BCDIR%\lib\import32.lib,, SISTEMA.RES
@IF EXIST SISTEMA.res DEL SISTEMA.res > NULL
@IF EXIST SISTEMA.ils DEL SISTEMA.ils > NULL
@IF EXIST SISTEMA.ilf DEL SISTEMA.ilf > NULL
@IF EXIST SISTEMA.ilc DEL SISTEMA.ilc > NULL
@IF EXIST SISTEMA.ild DEL SISTEMA.ild > NULL
@IF EXIST SISTEMA.tds DEL SISTEMA.tds > NULL
@IF EXIST SISTEMA.map DEL SISTEMA.map > NULL
@IF EXIST NULL. DEL NULL.
SCREENS.C
#include <windows.h>
#pragma argsused
//------------------------------------------------------------------------//
int WINAPI _export DllEntryPoint( HINSTANCE hinst, DWORD fdwReason,
PVOID pvReserved )
{
return TRUE;
}
//------------------------------------------------------------------------//
Se tudo que foi explicado for seguido a risca e se sua .DLL for gerada, bastará então acioná-la dentro de seu sistema.
Para tanto bastará usar uma chamada assim:
...
SET RESOURCES TO "SISTEMA.DLL"
...
Porque gerar .DLL ao invés de incorporar os recursos diretamente no executável?
Dependendo do total de recursos como telas, imagens, etc a incorporação não é efetivada ocorrendo estouro no momento da linkagem.
Qual o tamanho de uma .DLL ou quantidade de recursos que ela pode conter?
Não sei, mas se for o caso é possivel criar várias .DLL para serem chamadas pelo sistema.
O que foi apresentado aqui serve também para outras GUIs e não se aplica somente a Fivewin, os métodos e recursos podem ser os mesmos mas o resultado será o mesmo.
Caso queiram, utilizem no lugar do Borland RC o compilador de recursos do Pelles, por ser mais recente pode ser livre de limitações que o Borland possa ter.