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.

Utilizando Forms em Resource


Ryokusei
 Compartilhar

Posts Recomendados

Forms, Formulários, Diálogos, etc.

Todos esses nomes se referem a uma única coisa, uma janela.

 

É bem fácil usar o Delphi pra criar seus Forms porque ele faz todo o trabalho, no entanto você perde em tamanho e talvez até em velocidade.

Vou ensinar como utilizar Forms em resource, essa técnica é válida para toda linguagem e funciona em todas as palataformas Windows (que eu já testei).

 

Nota: Daqui pra frente eu vou falar "Form", mas entenda que o correto segundo tradução literal é "Caixa de Diálogo", mas todo mundo entende Form.

 

Antes de iniciar é necessário entender o que se segue:

 

- Ao utilizar Forms em resource ou mesmo criando janelas (mãe) via API é necessário definir sua WindowProc. WindowProc é uma função que gerencia todas as mensagens lógicas recebidas pelas janelas associadas a ela.

 

Bem, vamos criar um Form simples, apenas 1 Static (para texto), 1 Edit, 1 botão e 1 ícone.

 

Como vamos fazer em resource, precisamos especificar as propriedades de nosso Form, assim como de suas janelas filhas.

 

A sintaxe de declaração de um Form é:

 

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

 

nameID - representa o nome único que identifica o Form;

DIALOG - representa o tipo de Form, seja ele DIALOG ou DIALOGEX;

x - representa a posição "X" (esquerda) do Form em relação à tela;

y - representa a posição "Y" (topo) do Form em relação à tela;

width - representa a largura do Form;

height - representa a altura do Form.

 

A width, height, x, y, e essas coisas não são equivalentes aos que você usa no Delphi, eles são medidos em points (sei lá como converte).

 

Dentre as opções adicionais temos:

 

CAPTION - Título da janela

CHARACTERISTICS - Valor DWORD definido pelo usuário para uso pelas ferramentas de resource (sei lá pra que serve isso, se alguém souber me avise por favor).

CLASS - Um número WORD ou uma string (entre aspas) que identifica a classe da janela do Form.

EXSTYLE - Estilo estendido da janela (só vai entender quem já brincou com CreateWindowEx).

FONT <tamanho da fonte>, <nome da fonte> - Identifica as características da fonte do Form. As janelas filhas assumem a mesma fonte do Form.

LANGUAGE - Identifica o idioma do Form.

MENU <identificador> - Especifica o menu do Form, o identificador pode ser tanto seu nome quanto seu identificador numérico.

STYLE - Estila da janela (só vai entender quem já brincou com criação de janelas via API CreateWindow/CreateWindowEx).

VERSION - Valor DWORD definido pelo usuário para uso pelas ferramentas de resource (sei lá pra que serve isso, se alguém souber me avise por favor).

 

Você não precisa declarar e usar todos esses atributos, somente os que achar necessário ou desejar. Alguns deles podem assumir mais argumentos do que eu disse, pra saber mais divirta-se no MSDN "

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

 

Bem, agora que já sabemos disso, comece a escrever seu arquivo de resource.

 

Vai ser algo mais ou menos assim:

 

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

 

Nota: O operador "|" representa uma operação bit a bit "OU", é equivalente ao operador or do Delphi.

 

Vejamos, o nome do nosso Form no resource será "DLGWINDOW", ele iniciará nas coordenadas 0,0 da tela, tem resolução de 120x52 points.

 

O estilo dele é representado pelas constantes que eu usei após "STYLE", vou explicar cada uma:

 

DS_MODALFRAME - Indica que o Form será modal;

DS_CENTER - Indica que o Form se iniciará no centro da tela (isso ignora o fato de eu ter colocado x e y com valor 0);

WS_MINIMIZEBOX - Indica que o Form terá o botão de minimizar;

WS_VISIBLE - Indica que o Form iniciará visível;

WS_CAPTION - Indica que o Form terá borda;

WS_SYSMENU - Indica que o Form terá o botão de fechar.

 

Você pode usar qualquer constante que quiser pra enfeitar e fazer seus sortilégios de magia com o Form.

 

Agora, vamos criar os nossos objetos, eles são indicados entre um "BEGIN" e "END".

 

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

 

Vamos primeiro criar o ícone, eu vou usar um ícone de sharingan, vou declará-lo no resource.

 

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

 

Agora vamos aos nossos objetos.

 

Primeiro criaremos o ícone no nosso Form, a sintaxe de criação de um controle de ícone é a seguinte:

 

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

 

Bem, no text eu vou usar o número 100 pra identificação do ícone. Width e Height devem ser 0, pois o ícone irá se ajustar ao tamanho dele.

 

Teremos:

 

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

 

Eu coloquei o id como -1 porque não vou usá-lo pra nada.

A propriedade id serve de identificador do controle, é com ele que sabemos com o que estamos operando.

 

Agora criamos o nosso Static (o nome pra isso em resource é LTEXT) para exibir um texto, a sintaxe deste controle é:

 

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

 

Então teremos:

 

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

 

O mesmo vale pro botão e Edit. Vou parar de enrolar, o code final será:

 

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

 

Vou expicar as constantes:

 

ES_LEFT - Indica que o texto será justificado à esquerda no Edit;

ES_AUTOHSCROLL - Indica que o texto rolará automaticamente na direção horizontal;

WS_CHILD - Indica que o controle é uma janela filha;

WS_TABSTOP - Indica que o controle recebe foco com a tecla TAB.

 

Temos que o id do Edit é 1 e o do botão é 2, isso porque vou usá-los e preciso ter controle sobre ambos.

 

Agora compile o arquivo e vamos codar.

 

Inicie um novo projeto de Console Application, remova a diretiva "{APPTYPE CONSOLE}", porque não vamos usar ela. Temos então um projeto nú. Declare somente as units "Windows, Messages".

 

Agora declare o seguinte:

 

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

 

A var Inst vai ser usada pra armazenar o handle do módulo base do nosso processo, pStr vai ser pra armazenar uma string que usaremos mais tarde.

 

Beleza, agora vamos trabalhar. Entre "begin" e "end." use:

 

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

 

A função DialogBoxParam cria a o nosso Form direto do resource, a sintaxe segundo o MSDN é:

 

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

 

Então, nossa função DialogProc será a função de callback do nosso Form, em outras palavras é a WindowProc do nosso Form.

 

Agora na função DialogProc vamos trabalhar. Vai ficar assim:

 

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

 

Sempre que uma janela recebe uma mensagem, a DialogProc é chamada, em hWnd fica o handle da janela pai, no nosso caso é o handle do Form.

Em uMsg vai vir a mensagem recebida. Em wParam vai vir o identificador e lParam algum argumento adicional (nem sempre usado).

 

WM_COMMAND é a mensagem recebida no clique do botão, é ela que estou usando de referência pra saber quando alguém clicou no botão.

Se esta mensagem for recebida eu vou verificar se o identificador foi o identificador do botão, se for então vou usar a API GetDlgItemTextA. Com ela, vou passar o id 1, que é referente ao Edit, pra pegar o texto no Edit, então vou exibir este texto em uma mensagem.

Se a mensagem for WM_CLOSE significa que o usuário clicou no botão de fechar e então vou encerrar meu Form com a função EndDialog.

Sempre em hWnd vai vir o handle da janela do Form, se você quer o handle das janelas filhas se vira pra pegar (um EnumChildWindows já resolve), eu não vejo necessidade pra isso já que tem como controlar pelo id.

 

Bem, agora seu source vai estar assim:

 

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

 

Compile e veja a mágica.

Lembre-se, isso é válido pra qualquer linguagem, se você fizer o mesmo pra C++, ou assembly vai funcionar.

 

Segue um source em Delphi e outro em Assembly (masm32 based) do projeto.

 

[DOWN]

É necessário se cadastrar para acessar o conteúdo.
[/DOWN]

[sENHA]

É necessário se cadastrar para acessar o conteúdo.
[/sENHA]

 

Para referências de estudo:

 

-

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

-

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

-

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

Link para o comentário
Compartilhar em outros sites

Perfect!

Otimamente (??) bem explicado!

Confesso que eu boiei um pouquinho no começo do tópico, mas deu pra entender tudo =)

 

Só uma dúvida, pode alterar propriedades do form enquanto roda o programa?

 

Sim, claro. O handle do Form vem sempre no hWnd então é só você operar com isso pra fazer o que quiser como mudar a cor, mudar os botões da barra de título, mudar o título, mudar o estilo da janela, etc. Mas claro que tudo via API.

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.