A seguir você verá um exemplo de como programar diretamente na API do Windows e obter programas com o menor tamanho possível.
No exemplo, você cria uma aplicação de 16kb e a mesma aplicação desenvolvida por vias normais teria em torno de 215kb.
Tenha em mente que para desenvolver uma aplicação inteira vc precisará
estudar a fundo toda a api de componentes e mensagens do windows.
A primeira coisa a fazer é criar a janela principal:
1) Registramos a classe de janela alternativa.
2) Criamos a janela utilizando CreateWindowEx
Depois devemos criar todos os componentes que serão utilizados:
1) Utilizaremos o CreateWindowEx para criar os botões, as Labels e os edits. É
importante que você crie-os como child da aplicação.
Precisamos também mudar o tamanho da fonte, pois a padrão é muito grande:
1) Criar um handle da font utilizando CreateFont
2) Dispare uma mensagem WM_SETFONT para todos os componentes.
A função UpdateWindow atualiza todos os componentes ao mesmo tempo. Tome cuidado
ao fazer ligação entre eles durante a inicialização da Aplicação.
O Loop de Mensagens assegura que a aplicação não ira terminar. Ele é responsável
por todo o funcionamento da aplicação, pois através dele, a aplicação irá
interagir com o windows e vice-versa.
A Função WindowProc:
É responsável por todo disparo das mensagens que faz a aplicação rodar.
Agora, vamos ver na pratica.
Crie uma nova aplicação no Delphi e copie o código abaixo dentro do DPR. (Fonte
do Projeto)
program testwindow;
uses
Windows,Messages;
var
WinClass: TWndClassA;
Inst, Handle, Button1, Label1, Edit1: Integer;
Msg: TMsg;
hFont: Integer;
{ Verifica se a senha digitada é 'develsoft' e mostra uma mensagem }
procedure CheckPassword;
var
Textlength: Integer;
Text: PChar;
begin
TextLength := GetWindowTextLength(Edit1);
if TextLength = 8 then
begin
GetMem(Text, TextLength + 1);
GetWindowText(Edit1, Text, TextLength + 1);
if Text = 'develsoft' then
begin
MessageBoxA(Handle, 'A senha está
correta.', 'Verifica a senha', MB_OK);
FreeMem(Text, TextLength + 1);
Exit;
end;
end;
MessageBoxA(Handle, 'Senha incorreta.', 'Verifica senha',
MB_OK);
end;
{ Função WindowProc alternativa }
function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer;
stdcall;
begin
Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
{ Ve se tem mensagens }
if (lParam = Button1) and (uMsg = WM_COMMAND) then
CheckPassword;
if uMsg = WM_DESTROY then
Halt;
end;
begin
{ ** Registra um classe de janela alternativa ** }
Inst := hInstance;
with WinClass do
begin
style := CS_CLASSDC or CS_PARENTDC;
lpfnWndProc := @WindowProc;
hInstance := Inst;
hbrBackground := color_btnface + 1;
lpszClassname := 'AG_TESTWINDOW';
hCursor := LoadCursor(0, IDC_ARROW);
end; { with }
RegisterClass(WinClass);
{ ** Cria a janela principal ** }
Handle := CreateWindowEx(WS_EX_WINDOWEDGE, 'AG_TESTWINDOW', 'Amigreen
TestWindow 1.00',
WS_VISIBLE or WS_SIZEBOX or WS_CAPTION or WS_SYSMENU,
363, 278, 305, 65, 0, 0, Inst, nil);
{ ** Cria um botao ** }
Button1 := CreateWindow('Button', 'OK', WS_VISIBLE or WS_CHILD or
BS_PUSHLIKE or BS_TEXT,
216, 8, 75, 25, handle, 0, Inst, nil);
{ ** Cria um label estatico ** }
Label1 := Createwindow('Static', '', WS_VISIBLE or WS_CHILD or
SS_LEFT,
8, 12, 76, 13, Handle, 0, Inst, nil);
{ ** Cria um Edit ** }
Edit1 := CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', '', WS_CHILD or
WS_VISIBLE or
WS_BORDER or ES_PASSWORD, 88, 8, 121, 21, Handle, 0, Inst, nil);
{ ** Cria a fonte padrao ** }
hFont := CreateFont(-11, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH or FF_DONTCARE, 'MS Sans Serif');
{ Muda a fonte }
if hFont <> 0 then
begin
SendMessage(Button1, WM_SETFONT, hFont, 0);
SendMessage(Label1, WM_SETFONT, hFont, 0);
SendMessage(Edit1, WM_SETFONT, hFont, 0);
end;
{ Muda o texto do label }
SetWindowText(Label1, 'Informe a senha:');
{ Poe o focu no Edit }
SetFocus(Edit1);
UpdateWindow(Handle);
{ ** Loop de Mensagens ** }
while(GetMessage(Msg, Handle, 0, 0)) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end; { with }
end.
|