Ir para conteúdo
Faça parte da equipe! (2024) ×
Conheça nossa Beta Zone! Novas áreas a caminho! ×
  • Quem está por aqui   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.

Criando aplicação por API


Ryokusei
 Compartilhar

Posts Recomendados

Considerações iniciais:

 

Handle, Janela, Classe de Janela, Mensagem, API.

 

Handle é um número identificador da janela que a diferencia das outras. Toda janela tem um handle diferente da outra não importa que sejam janelas da mesma classe.

A classe janela é um conjunto de atributos que o sistema utiliza como modelo para criar uma janela. Cada janela é um membro de uma classe janela. Todas as classes janela são específicas do processo.

 

Um exemplo é um Button do Delphi e um botão de uma janela do Windows (provavelmente escrito em C++).

A classe do Button do Delphi é "TButton" enquanto a de uma janela escrita em C++ é "Button".

O mesmo acontece com labels, em Delphi a classe é "TLabel" e em C++ "Static".

Você pode sim mudar o nome da classe de uma janela só por estilo ou seja lá qual for o motivo e criar a janela no estilo que quiser, mas para isso você deve criar a classe e registrá-la (vou abordar isso mais a frente).

 

Existem janelas pai (Parent Window) e janelas filho (Child Window).

Janelas pai são as janelas principais como por exemplo um "Form" do Delphi.

Janelas filho são as janelas que foram criadas como Child Window de uma outra janela, por exemplo um botão do Delphi, ele é uma janela Child da janela Parent que é o Form, para verificar isso veja que a propriedade Button1.Parent.Handle é igual a Form1.Handle .

 

Mensagem é uma forma de comunicação utilizada na computação concorrente e paralela, programação orientada a objetos e comunicação entre processos, onde a comunicação é feita através do envio de mensagens aos destinatários.

 

API é um conjunto de rotinas e padrões estabelecidos por um software para a utilização das suas funcionalidades por programas aplicativos que não querem envolver-se em detalhes da implementação do software, mas apenas usar seus serviços. Em sumo, são funções do específicas do sistema operacional.

 

 

Iniciando a programação:

 

Abra o seu Delphi, vá em "File/Close All"

Depois em "File/New/Other" e escolha "Console Application"

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora apague a linha "{$APPTYPE CONSOLE}" ficando assim:

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora declara as units "Windows" e "Messages" (Você pode tirar a "SysUtils" se quiser, se você quiser declare também a unit XPMan pra deixar o aplicativo mais bonito).

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora precisaremos de algumas variáveis globais para gerenciar o nosso aplicativo e os objetos nele.

 

Declare:

 

var

WinClass: TWndClassA; //Record de classe de janela ANSI

Inst, Handle, Btn, Edt, Memo, Lbl: Cardinal; //Variáveis onde serão armazenados o handle dos objetos, em Inst ficará a instância

Msg: TMsg; //Variável onde serão armazenadas as mensagens para processamento

hFont: Integer; //Variável onde será armazenada a fonte dos objetos

 

É necessário se cadastrar para acessar o conteúdo.

 

Entre o "begin" e o "end." coloque este código:

 

Inst:=HInstance; //Define o valor da instância

 

//Aqui começa a criação da classe da janela principal (o form)

with WinClass do

begin

style:=CS_OWNDC or CS_HREDRAW or CS_VREDRAW; //Estilo da janela

lpfnWndProc := @WindowProc; //Ponteiro para a função de processamento das mensagens

hInstance := Inst; //Instância

hbrBackground := color_btnface + 1; //Cor de fundo

lpszClassname := 'Minha classe feliz'; //Nome da classe a ser criada

hCursor := LoadCursor(0, IDC_ARROW); //Tipo de cursor

end;

RegisterClassA(WinClass); //Registra a classe da janela para poder utilizá-la

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora vamos criar o nosso form, abaixo deste código que acabou de inserir, insira este:

 

Handle:=CreateWindowExA(

WS_EX_WINDOWEDGE, //ExStyle,

'Minha classe feliz', //Classe da janela, estou usando a classe que criei

'Eu sou o caption', //Caption da janela

WS_VISIBLE or WS_SIZEBOX or WS_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX, //Estilo da janela. Aqui eu estou dizendo que é visível, bsSizeable, com caption, com botão de fechar e com botão de minimizar

446, //Left

248, //Top

590, //Largura

475, //Altura

0, //Handle do parent, como o nosso form será o parent o parent handle dele é 0

0, //Handle do menu

Inst, //Instância

nil

);

 

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora vamos criar um botão.

 

Btn:=CreateWindowA(

'Button', //Nome da classe

'Botão Feliz', //Caption

WS_VISIBLE or WS_CHILD or WS_BORDER, //Estilo da janela, aqui estou dizendo que o botão é o padrão com borda e uma janela filho

63, //Left

136, //Top

80, //Width

25, //Height

Handle, //Parent handle. Aqui eu digo que a janela pai é o nosso form

0, //Menu handle

Inst, //Instância

nil

);

 

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora vamos criar um label.

 

Lbl:=CreatewindowA(

'Static', //Nome da classe

'Meu aplicativo criado por API', //Caption

WS_VISIBLE or WS_CHILD or SS_LEFT, //Estilo da janela, aqui eu crio um label padrão, com alihamento de texto à esquerda e como janela filho

31, //Left

168, //Top

142, //Width

13, //Height

Handle, //Parent handle

0, //Menu handle

Inst, //Instância

nil

);

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora vamos criar um edit.

 

Edt:=CreatewindowA(

'Edit', //Nome da classe

'Eu sou um Edit (:', //Caption

WS_VISIBLE or WS_CHILD or ES_LEFT, //Estilo da janela, aqui eu crio um edit padrão, com alihamento de texto à esquerda e como janela filho

8, //Left

104, //Top

185, //Width

21, //Height

Handle, //Parent handle

0, //Menu handle

Inst, //Instância

nil

);

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora vamos criar um memo. O memo é um edit setado como multilinha.

 

Memo:=CreatewindowA(

'Edit', //Nome da classe

'Eu sou um Memo (:'#13#10'Eu te amo :*', //Caption

WS_VISIBLE or WS_CHILD or ES_MULTILINE or ES_AUTOHSCROLL or ES_AUTOVSCROLL or ES_LEFT or WS_VSCROLL or WS_HSCROLL, //Estilo da janela, aqui eu crio um edit padrão, com alihamento de texto à esquerda, barras de rolagem horizontal e vertical, rolagem automática horizontal e vertical e como janela filho

8, //Left

8, //Top

185, //Width

89, //Height

Handle, //Parent handle

0, //Menu handle

Inst, //Instância

nil

);

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora vamos definir a fonte de nossos objetos.

 

hFont:=CreateFontA(-11, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET,

OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,

DEFAULT_PITCH or FF_DONTCARE, 'Tahoma'); //Criamos a fonte de face "Tahoma", cor preta e estilo de texto parão

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora vamos aplicar a fonte aos objetos.

 

if hFont <> 0 then //Se a fonte foi criada corretamente seu valor será diferente de zero

begin

SendMessage(Handle, WM_SETFONT, hFont, 0); //Envia uma mensagem para o form para mudar a fonte com a nossa fonte como parâmetro

SendMessage(Btn, WM_SETFONT, hFont, 0); //Envia uma mensagem para o botão para mudar a fonte com a nossa fonte como parâmetro

SendMessage(Lbl, WM_SETFONT, hFont, 0); //Envia uma mensagem para o label para mudar a fonte com a nossa fonte como parâmetro

SendMessage(Edt, WM_SETFONT, hFont, 0); //Envia uma mensagem para o edit para mudar a fonte com a nossa fonte como parâmetro

SendMessage(Memo, WM_SETFONT, hFont, 0); //Envia uma mensagem para o memo para mudar a fonte com a nossa fonte como parâmetro

end;

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora temos q atualizar nosso form pra ficar tudo em seu lugar bonitinho e fazer o processamento das mensagens.

 

UpdateWindow(Handle);

 

while(GetMessage(Msg, Handle, 0, 0)) do //Enquanto o handle existe e recebe mensagens então

begin

TranslateMessage(msg); //Lê e traduz a mensagem para o aplicativo

DispatchMessage(msg); //Descarta a mensagen lida

end;

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora temos que fazer o a nossa WinProc que será a função que vai ler e fazer os eventos dos objetos conforme a mensagem recebida.

 

Declare esta função acima do "begin" e "end." principais e abaixo das variáveis globais.

 

function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;

begin

Result:=DefWindowProc(hWnd, uMsg, wParam, lParam);

 

if (lParam=Btn) and (uMsg=WM_COMMAND) then //se o botão receber a mensagem WM_COMMAND então... Em uMsg fica armazenada a mensagem e em lParam o handle que a recebeu

MessageBoxA(Handle, 'Oii eu sou o botão feliz!'#13#10'Me dá um abraço?', '', MB_OK);

 

if uMsg=WM_DESTROY then Halt; //Se a mensagem recebida for a de destruir uma janela então o aplicativo se encerra

 

end;

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora é só rodar seu aplicativo e ver como ficou o resultado.

 

É necessário se cadastrar para acessar o conteúdo.

 

Download do código fonte:

É necessário se cadastrar para acessar o conteúdo.

 

Scan:

É necessário se cadastrar para acessar o conteúdo.

Link para o comentário
Compartilhar em outros sites

Este tópico está impedido de receber novos posts.
 Compartilhar

×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.