terça-feira, 24 de maio de 2016

Programa 2.0, C/C++ e Janela com win32

Continuando, esse já é o terceiro post sobre janelas com win32, espero por enquanto me atentar a mais um post, então vou comentar o máximo sobre o  código do programa e começar a meter a mão na massa em relação ao aprendizado da programação em C/C++. Beleza! Vamos ao código.

terça-feira, 1 de dezembro de 2015

C/C++ primeiro programa

Bom, nas minhas pesquisas achei na internet   alguns arquivos sobre janela, utilizando win32 e a GDI do windows, vou postar um, o código.
Para ver o resultado é necessário um copilador para gerar os  executável do nosso programa.
Eu uso o dev-C++ e o codeblock, são gratuitos e bons.

//-------------------
//programa 0.1
// autor Vanderson A de Souza
//Data 13/01/2016
//--------------------

//Bibliotecas
#include <windows.h>

//Definições
#define WINDOW_CLASS "PrimeiraJanela"
#define WINDOW_TITLE  "Prog 01"
#define WINDOW_WIDTH   500
#define WINDOW_HEIGHT  450
// Prototipo da função que trata as mensagens do Windows
LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM );

//Função principal (WinMain)
int WINAPI WinMain

(HINSTANCE hInstance,// indentificador para atual instancia do programa, estado atual do programa
HINSTANCE hPreveInstance,//indentificador para estado anterior do programa(é NULL)
LPSTR lpsCmdLine,//é um ponteiro para linha de comando do programa(carregado como uma imensa string cada linha de codigo)
int nCmdShow//seta como a janela deve aparecer, modo de visualização
)
{
   
    HWND hWnd = NULL;
    MSG msg;
//Classe da janela(struct)
WNDCLASSEX vas;
vas.cbSize          = sizeof (WNDCLASSEX);
vas.style           = CS_HREDRAW|CS_VREDRAW;
vas.lpfnWndProc     = (WNDPROC)WndProc;
vas.cbClsExtra      = 0;
vas.cbWndExtra      = 0;
vas.hInstance       = hInstance;
vas.hIcon           =LoadIcon(NULL, IDI_APPLICATION);
vas.hCursor         =LoadCursor(NULL, IDC_ARROW);
vas.hbrBackground   =(HBRUSH)GetStockObject(BLACK_BRUSH);
vas.lpszMenuName    = NULL;
vas.lpszClassName   = WINDOW_CLASS;
vas.hIconSm         = LoadIcon(NULL, IDI_APPLICATION);

//Resgistrando a classe
if (!RegisterClassEx(&vas))
        return 0;
      
      
//Criando a janela

hWnd = CreateWindowEx(
0,
WINDOW_CLASS,
WINDOW_TITLE,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
WINDOW_WIDTH,
WINDOW_HEIGHT,
HWND_DESKTOP,
NULL,
hInstance,
NULL
);

ShowWindow (hWnd, nCmdShow);

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

 
    return msg.wParam;
}




LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC = NULL;
    PAINTSTRUCT psPaint;
  
    switch (msg)               
    {
        case WM_CREATE:
        {
            return(0);
        } break;
      
        case WM_PAINT:
            {
                hDC = BeginPaint(hWnd, &psPaint);
                EndPaint(hWnd, &psPaint);
                return(0);
            } break;
  
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hWnd, msg, wParam, lParam);
    }


    return 0;
  
}


//--------------------------------------------------------------------------
// WindowProc() -> Processa as mensagens enviadas para o programa
//--------------------------------------------------------------------------
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  // Variáveis para manipulação da parte gráfica do programa
  HDC hDC = NULL;
  PAINTSTRUCT psPaint;

  // Verifica qual foi a mensagem enviada
  switch(uMsg)
  {

    case WM_CREATE: // Janela foi criada
    {
      // Retorna 0, significando que a mensagem foi processada corretamente
      return(0);
    } break;

    case WM_PAINT: // Janela (ou parte dela) precisa ser atualizada
    {
      /* Devemos avisar manualmente ao Windows que a janela já foi atualizada, pois não é um processo automático. Se isso não for feito, o Windows não irá parar de enviar a mensagem WM_PAINT ao programa. */

      // O código abaixo avisa o Windows que a janela já foi atualizada.
      hDC = BeginPaint(hWnd, &psPaint);
      EndPaint(hWnd, &psPaint);

      return(0);
    } break;

    case WM_CLOSE: // Janela foi fechada
    {
      // Destrói a janela
      DestroyWindow(hWnd);

      return(0);
    } break;

    case WM_DESTROY: // Janela foi destruída
    {
      // Envia mensagem WM_QUIT para o loop de mensagens
      PostQuitMessage(0);

      return(0);
    } break;

        default: // Outra mensagem
    {
      /* Deixa o Windows processar as mensagens que não foram verificadas na função */
      return(DefWindowProc(hWnd, uMsg, wParam, lParam));
    }

  }
}

Aqui nesse código  criar uma janela com fundo Preto defenido pelo GetStockObject(BLACK_BRUSH).
 Há sim, não tem como trabalhar com janela sem aprender "C", então vou aprender "C/C++" mais win32.
O próximo  código vou fazer com que apareça os textos, assim quando gerar o código para aprendizagem em C/C++ não vai ser no prompt do DOS e sim na janela.

Então até o próximo post.

Att.:

Vanderson A. de Souza

domingo, 29 de novembro de 2015

O começo

Olá! Estou  começando a  escrever este blog sobre programação em C++, ao mesmo tempo em que aprendo sobre a linguagem C++,  com o objetivo de me estimular e compartilhar minha experiência com a linguagem, tem por alvo criar uma engine em opengl no final, vou tentar adaptar o estudo a uma ambiente  de janela no Windows, serei superficial sobre o ambiente de janela, mas depois irei me aprofundando, vou postar os scripts de pois de testar, tentarei postar fotos e se possível vídeos, não é a primeira linguagem que aprendo.
Então mãos á obra!!!

Att.:

Vanderson A. de Souza