Ir ao conteúdo
  • Cadastre-se
Gabriel Grechuk

Janela Simples Win32 Compila mas não Executa

Recommended Posts

Olá!!

 

Venho estudando a api Win32 a algum tempo, porém, quando eu finamente consigo criar uma mísera janelinha... O compilador deixa passar,

porém, retorna a mensagem de error de criação da janela na função CreateWindowEx().

 

Código:

main.cpp

////////////////////////////////////////////////////////////////////////////////
//                                                                            //
//  Arquivo: main.cpp                                                         //
//  Data: 27-12-2016  19:18                                                   //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////

/**
 *  Arquivos para incusão.
 */
#include "main.h"

/**
 * Namespaces utilizados.
 */
using namespace std;

/**
 *  Função principal da Win32.
 */
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR     lpCmdLine,
                   int       nCmdShow)
{
    // Variáveis da função.
    WNDCLASSEX wnd;       // Classe da janela.
    HWND       hWnd;      // Controlador da janela.
    MSG        msg;       // Estrtura de mensagens.

    // Iniciando a classe da janela.
    wnd.lpszClassName    = WND_CLASS_NAME;
    wnd.lpszMenuName     = WND_WINDOW_NAME;
    wnd.style            = WS_OVERLAPPEDWINDOW;
    wnd.cbSize           = sizeof(WNDCLASSEX);
    wnd.cbClsExtra       = 0;
    wnd.cbWndExtra       = 0;
    wnd.hInstance        = hInstance;
    wnd.lpfnWndProc      = WndProc;
    wnd.hIcon            = LoadIcon(NULL, IDI_APPLICATION);
    wnd.hIconSm          = LoadIcon(NULL, IDI_APPLICATION);
    wnd.hCursor          = LoadCursor(NULL, IDC_ARROW);
    wnd.hbrBackground    = (HBRUSH)(COLOR_WINDOW + 1);

    // Registrando a Classe.
    if(RegisterClassEx(&wnd))
    {
        MessageBox(NULL, "Error ao Registrar Classe da janela Principal", "Fatal Error", MB_ICONERROR | MB_OK);
        return 1;
    }

    // Criando a Janela.
    hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
                          WND_CLASS_NAME,
                          WND_WINDOW_NAME,
                          WS_OVERLAPPEDWINDOW,
                          (GetSystemMetrics(SM_CXSCREEN) - WND_LARG) / 2,
                          (GetSystemMetrics(SM_CYSCREEN) - WND_ALTU) / 2,
                          WND_LARG,
                          WND_ALTU,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);
    // Verificando a criação da janela.
    if(!hWnd)
    {
      MessageBox(NULL, "Error ao criar a janela.", "Fatal Error", MB_ICONERROR | MB_OK);
      return 1;
    }

    // Mostrando a janela.
    ShowWindow(hWnd, nCmdShow);

    // Atualizando a janela.
    UpdateWindow(hWnd);

    // Loop de Processamento de janela.
    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

//============================================================================//
/**
 *  Função WndProc(); Para processamento de mensagens;
 */
 LRESULT CALLBACK WndProc(HWND hWnd,
                          UINT uMsg,
                          WPARAM wParam,
                          LPARAM lParam)
 {
    // Variáveis Locais.
    PAINTSTRUCT ps;
    HDC hDc;

    // Loop de processamento de mensagens.
    switch(uMsg)
    {
        /**
         *  Caso a Janela seja criada.
         */
        case WM_CREATE:
            MessageBox(NULL, "Olá Mundo!!!", "", MB_ICONINFORMATION | MB_OK);

            return 0;
        break;

        /**
         *  Caso a janela precise ser re-desenhada.
         */
        case WM_PAINT:
            BeginPaint(hWnd, &ps);
            EndPaint(hWnd, &ps);

            return 0;
        break;

        /**
         *  Caso cliquem em fechar.
         */
        case WM_CLOSE:
            DestroyWindow(hWnd);

            return 0;
        break;

        /**
         *  Acabando de vez com todo o pograma.
         */
        case WM_DESTROY:
            PostQuitMessage(WM_QUIT);

            return 0;
        break;

        default:
            return (DefWindowProc(hWnd, uMsg, wParam, lParam));
        break;
    }
 }

 

main.h:

////////////////////////////////////////////////////////////////////////////////
//                                                                            //
//  Arquivo: main.h                                                           //
//  Data: 27-12-2016  19:18                                                   //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////

/**
 *  Arquivos para Inclusão.
 */
#include <windows.h>
#include <string>

/**
 *  Protótipos de funções.
 */
// Função para processamento de mensagens enviadas pelo windows.
 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

/**
 * Definições.
 */
#define WND_CLASS_NAME  "Janelinha"    // Nome da Classe.
#define WND_WINDOW_NAME "Janelinha"    // Nome da janela.

#define WND_LARG        640               // Largura da janela.
#define WND_ALTU        420               // Altua da janela.

 

Por favor, quem manjar da Win32, me ajude!

 

desde já, agradeço! :D 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro acontece na sua verificação de CreateWindow, via MessageBox?

 

Tente usar CS_HREDRAW | CS_VREDRAW no wnd.style

 

E só para testar, no CreateWindow, atribua os valores default (CW_USEDEFAULT) nas dimensões/posições da janela.

Compartilhar este post


Link para o post
Compartilhar em outros sites
////////////////////////////////////////////////////////////////////////////////
//                                                                            //
//  Arquivo: main.cpp                                                         //
//  Data: 27-12-2016  19:18                                                   //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////

/**
 *  Arquivos para incusão.
 */
#include "main.h"

/**
 * Namespaces utilizados.
 */
using namespace std;

/**
 *  Função principal da Win32.
 */
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR     lpCmdLine,
                   int       nCmdShow)
{
    // Variáveis da função.
    WNDCLASSEX wnd;       // Classe da janela.
    HWND       hWnd;      // Controlador da janela.
    MSG        msg;       // Estrtura de mensagens.

    // Iniciando a classe da janela.
    wnd.lpszClassName    = WND_CLASS_NAME;
    wnd.lpszMenuName     = WND_WINDOW_NAME;
    wnd.style            = CS_HREDRAW | CS_VREDRAW;
    wnd.cbSize           = sizeof(WNDCLASSEX);
    wnd.cbClsExtra       = 0;
    wnd.cbWndExtra       = 0;
    wnd.hInstance        = hInstance;
    wnd.lpfnWndProc      = WndProc;
    wnd.hIcon            = LoadIcon(NULL, IDI_APPLICATION);
    wnd.hIconSm          = LoadIcon(NULL, IDI_APPLICATION);
    wnd.hCursor          = LoadCursor(NULL, IDC_ARROW);
    wnd.hbrBackground    = (HBRUSH)(COLOR_WINDOW + 1);

    // Registrando a Classe.
    if(!RegisterClassEx(&wnd))
    {
        MessageBox(NULL, "Error ao Registrar Classe da janela Principal", "Fatal Error", MB_ICONERROR | MB_OK);
        return 1;
    }

    // Criando a Janela.
    hWnd = CreateWindowEx(0,
                          WND_CLASS_NAME,
                          WND_WINDOW_NAME,
                          WS_EX_OVERLAPPEDWINDOW,
                          (GetSystemMetrics(SM_CXSCREEN) - WND_LARG) / 2,
                          (GetSystemMetrics(SM_CYSCREEN) - WND_ALTU) / 2,
                          WND_LARG,
                          WND_ALTU,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);
    // Verificando a criação da janela.
    if(!hWnd)
    {
      MessageBox(NULL, "Error ao criar a janela.", "Fatal Error", MB_ICONERROR | MB_OK);
      return 1;
    }

    // Mostrando a janela.
    ShowWindow(hWnd, nCmdShow);

    // Atualizando a janela.
    UpdateWindow(hWnd);

    // Loop de Processamento de janela.
    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

//============================================================================//
/**
 *  Função WndProc(); Para processamento de mensagens;
 */
 LRESULT CALLBACK WndProc(HWND hWnd,
                          UINT uMsg,
                          WPARAM wParam,
                          LPARAM lParam)
 {
    // Variáveis Locais.
    PAINTSTRUCT ps;
    HDC hDc;

    // Loop de processamento de mensagens.
    switch(uMsg)
    {
        /**
         *  Caso a Janela seja criada.
         */
        case WM_CREATE:
            MessageBox(NULL, "Olá Mundo!!!", "", MB_ICONINFORMATION | MB_OK);

            return 0;
        break;

        /**
         *  Caso a janela precise ser re-desenhada.
         */
        case WM_PAINT:
            BeginPaint(hWnd, &ps);
            EndPaint(hWnd, &ps);

            return 0;
        break;

        /**
         *  Caso cliquem em fechar.
         */
        case WM_CLOSE:
            DestroyWindow(hWnd);

            return 0;
        break;

        /**
         *  Acabando de vez com todo o pograma.
         */
        case WM_DESTROY:
            PostQuitMessage(WM_QUIT);

            return 0;
        break;

        default:
            return (DefWindowProc(hWnd, uMsg, wParam, lParam));
        break;
    }
 }

Agradeça a @olliver.soul

Compartilhar este post


Link para o post
Compartilhar em outros sites

hehe.... Realmente funcionou!

 

Muito obrigado pessoal... e... só precisava daquele 0 ali na CreateWindowEx() que parava de da erro mesmo :v

 

Vou me atentar mais a essas coisas.

 

Ps: Desculpe a demora para responder. Eu estava muito enrolado com meu emprego nesses ultimos dias :v

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×