Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DAVIFN

Como criar janelas em GUI Passo a passo!

Recommended Posts

Muito bem pessoal, aqui vou-lhes ensinar a criar janelas em C++ com a GUI do Windows.

 

Primeiramente declararemos um HWND, que é nada mais nada menos do que o coração da janela.

 

Para isto, utilizaremos:

 

HWND hwnd

 

HWND (Nome do HWND) é a função para isto.

 

Já declaramos, então vamos para as mensagens.

 

A mensagem é quando, alguém utiliza a janela, retorna uma mensagem para a verificação no CALLBACK, portanto:

 

MSG messages;

 

Agora, criaremos uma classe para alojar a janela.

 

WNDCLASSEX wincl;

 

Vamos registrar esta classe.

 

    wincl.hInstance = hThisInstance;
   wincl.lpszClassName = "a";
   wincl.lpfnWndProc = WindowProcedure;
   wincl.style = CS_DBLCLKS;
   wincl.cbSize = sizeof (WNDCLASSEX);
   wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
   wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
   wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
   wincl.lpszMenuName = NULL;
   wincl.cbClsExtra = 0;
   wincl.cbWndExtra = 0;
   wincl.hbrBackground = (HBRUSH) COLOR_WINDOW;
   if (!RegisterClassEx (&wincl))
       return 0; // Caso não seja possivel registrar, encerra-se o programa.

 

Agora, criaremos a janela utilizando o HWND.

 

hwnd=CreateWindowEx (
          0,
          "a",
          "Windows App",
          WS_OVERLAPPEDWINDOW|WS_VISIBLE,
          CW_USEDEFAULT,
          CW_USEDEFAULT,
          544,
          375,
          HWND_DESKTOP,
          NULL,
          hThisInstance,
          NULL
          );

 

Janela criada, agora, para mantê-la ativa, vamos precisar desta função:

 

while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}

 

Agora, precisaremos de um CALLBACK para receber as mensagens. declararemos um CALLBACK como variável global, antes do início do programa.

 

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

 

Nosso código, está assim:

 

#include <windows.h>
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hThisInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpszArgument,
                   int nFunsterStil)

{
   HWND hwnd;
   MSG messages;
   WNDCLASSEX wincl;
   wincl.hInstance = hThisInstance;
   wincl.lpszClassName = "a";
   wincl.lpfnWndProc = WindowProcedure;
   wincl.style = CS_DBLCLKS;
   wincl.cbSize = sizeof (WNDCLASSEX);
   wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
   wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
   wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
   wincl.lpszMenuName = NULL;
   wincl.cbClsExtra = 0;
   wincl.cbWndExtra = 0;
   wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
   if (!RegisterClassEx (&wincl))
       return 0;
   hwnd = CreateWindowEx (
          0,
          "a",
          "Título",
          WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT,
          CW_USEDEFAULT,
          544,
          375,
          HWND_DESKTOP,
          NULL,
          hThisInstance,
          NULL
          );
   while (GetMessage (&messages, NULL, 0, 0))
   {
       TranslateMessage(&messages);
       DispatchMessage(&messages);
   }
}

 

Criaremos agora o CALLBACK, colocando isto no fim do código.

 

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   switch (message)
   {
       case WM_CREATE:
           return 0;
       case WM_DESTROY:
           return 0;
       default:
           return DefWindowProc (hwnd, message, wParam, lParam);
   }
   return 0;
}

 

Agora, caso compilarmos, veremos uma janela sem nada, branca.

 

Vamos criar agora, um botão para ela.

 

Basta trocar nosso CALLBACK por:

 

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   switch (message)
   {
       case WM_COMMAND:
switch(wParam)
{
case 1:
MessageBox(NULL,"O botão foi clicado com sucesso! Criado por DAVIFN!","Mensagem!",MB_OK);
}
       return 0;
       case WM_CREATE:
           HWND Botao=Minimizar=CreateWindow("BUTTON","Botão",WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,96,100,100,54,hwnd,HMENU(1),NULL, NULL);
           return 0;
       case WM_DESTROY:
           return 0;
       default:
           return DefWindowProc (hwnd, message, wParam, lParam);
   }
   return 0;
}

 

Caso compilarmos, aparecerá um botão na janela, e, caso clicarmos neste botão aparecerá uma mensagem.

 

Espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parabéns por compartilhar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom o tutorial, apesar de não ser muito bem detalhado como o nome da classe ou sua função.

Há muito tempo abandonei o desenvolvimento exclusivo para Windows, mas reconheço que em parte sinto falta das API's, por serem mais intuitivas a primeira vista, mas por motivos de portabilidade do código não as uso mais.

Tenho em vista frameworks como: wxWidgets, GTK, Qt, etc.

 

Não querendo abusar deixo uma dica: Use GetSysColorBrush para a janela se adequar ao tema do sistema.

Exemplo:

//...
wincl.hbrBackground = GetSysColorBrush(COLOR_BTNFACE); // Cor de fundo de caixas de dialogo
//...

 

Visite para mais detalhes:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd144927%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633577%28v=vs.85%29.aspx

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.