Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 06 de Outubro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
104 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Programando na API do Windows.
Publicado por rodrigolebre : Terça, Abril 25, 2006 - 09:16 GMT-3 (10049 leituras)
Comentários 2 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Rodrigo Lebre 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.



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: an.der.son (anderson.ol@gmail.com) : Abr 27, 2006 - 09:51
(Informações sobre o membro | Enviar uma mensagem)
Ae, fiquei boquiaberto com o artigo.....
Meu executavel ficou com 15 kb....

Soh achei q poderia se indicado um novo Console Application (File->New->Other->Console Application) ao de um projeto normal...

Ah, acho q a senha nunca irá conferir caso naum seja modificado a linha 19:

"if TextLength = 9 then"

Pois "develsoft" tem 9 caracteres e naum 8...

Fora isto o artigo eh sensacional!!!


por: Ismajr : Mai 21, 2006 - 11:14
(Informações sobre o membro | Enviar uma mensagem)
Rodrigo.
Muito interessante seu artigo. Parabéns!
Como posso conhecer melhor as APIs? Existe um livro ou algum lugar onde eu possa pesquisar?
Obrigado.
Ismael
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados