Visual – Introdução a Janelas Message Loops – Win32 – Windows API – C++

Publicado: 7 de março de 2014 em C/C++

Você pode criar um aplicativo Win32 quando você quer fazer um aplicativo de desktop nativo que tem uma interface de usuário baseada em janelas e pode ser executado em versões do Windows a partir do Windows 95 para o Windows 8.1. Você pode usar qualquer uma das edições do Visual Studio, exceto a versão Express.

Um aplicativo Win32 é o termo convencional para um aplicativo que usa a mensagem de loops para lidar com  as mensagens do Windows diretamente em vez de usar um quadro como o Microsoft Foundation Classes (MFC), o Active Template Library (ATL), ou o .NET Framework..

Conceito Win32

Embora o termo é “Win32“, pode se referir a qualquer aplicativo de 32 bits ou um aplicativo de 64 bits. Um aplicativo Win32 em C ++ pode usar C Runtime (CRT) e Standard Template Library (STL), classes, funções, objetos COM, e qualquer uma das funções públicas do Windows, que coletivamente são conhecidas como a API do Windows.

Usando a API do Windows

Em nosso artigo de introdução ao visual C++ explicamos os conceitos básico da programação para Windows, neste post mostramos como isto é feito na pratica.

Basicamente uma aplicação para Windows onde não se utiliza nenhum método da Microsoft (Framework ou biblioteca de classes), além de suas APIs, podemos afirmar que um programa mínimo para o Windows que pode rodar em qualquer versão do sistema operacional é composto basicamente de duas funções, a primeira WinMain é responsável por criar uma aplicação de janelas e a segunda função chamada WndProc é responsável pelas mensagens do Windows. Existem muitas outras funções mas trabalhar com elas exigem um nível avançado de conhecimento em programação e da arquitetura do sistema operacional, veremos aos poucos os conceitos de arquitetura, tipos de variáveis e  regras básicas para utilizar as APIs do Windows.

 

Visual Studio

Para criar um programa Visual em C++ siga os passos abaixo:

  1. No menu File, clique em New, Project.
  2. Na caixa de dialogo para projetos C++, escolha Win32 Project.
  3. Nomeie o projeto de Hellocpp.
  4. No wizard de boas vindas, clique em Next.
  5. Na janela de parâmetros clique em Empty Project e clique no botão Finish.
  6. No Solution Explorer, clique com o botão direito em cima do nome do seu projeto e escolha: Add, New Item.
  7. Escolha um arquivo .cpp e o nomeie para hello.cpp.

Exemplo:

Neste exemplo criamos uma janela visual em mensagem de loops. Você pode usar o este código como um padrão para criar outros aplicativos baseados em Win32.

C++

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>

// Variaveis globais

// Classe da janela principal.
static TCHAR szWindowClass[] = _T("win32app");

// String que aparece na barra de titulos
static TCHAR szTitle[] = _T("Win32 Guided Tour Application");

HINSTANCE hInst;

// Declarações de funções incluidas neste modulo:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.style = CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc = WndProc;
	wcex.cbClsExtra = 0;
	wcex.cbWndExtra = 0;
	wcex.hInstance = hInstance;
	wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
	wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wcex.lpszMenuName = NULL;
	wcex.lpszClassName = szWindowClass;
	wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

	if (!RegisterClassEx(&wcex))
	{
		MessageBox(NULL,
			_T("Call to RegisterClassEx failed!"),
			_T("Win32 Guided Tour"),
			NULL);

		return 1;
	}

	hInst = hInstance; // Guarda a instancia e manipula a variavel local.

	// Parametros para criar a janela
	// szWindowClass: nome da aplicação
	// szTitle: texto da barra de titulos
	// WS_OVERLAPPEDWINDOW: tipo da janela
	// CW_USEDEFAULT, CW_USEDEFAULT: posição inicial (x, y)
	// 500, 300: tamanho inicial (width, length)
	// NULL: parent desta janela
	// NULL: esta aplicação não tem uma barra de menu
	// hInstance: o primeiro parametro da WinMain
	// NULL: não é usado nesta aplicação

	HWND hWnd = CreateWindow(
		szWindowClass,
		szTitle,
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT,
		500, 300,
		NULL,
		NULL,
		hInstance,
		NULL
		);

	if (!hWnd)
	{
		MessageBox(NULL,
			_T("Call to CreateWindow failed!"),
			_T("Win32 Guided Tour"),
			NULL);

		return 1;
	}

	// Parametros do ShowWindow :
	// hWnd: valor retornado do CreateWindow
	// nCmdShow: o quarto parametro do WinMain

	ShowWindow(hWnd,
		nCmdShow);
	UpdateWindow(hWnd);

	// Menssagem principal do loop:
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return (int)msg.wParam;
}

//
//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processa menssagem para a janela principal
//
//  WM_PAINT    - pinta a janela principal
//  WM_DESTROY  - posta e cancela menssagem e retorna
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	TCHAR greeting[] = _T("Hello, World!");

	switch (message)
	{
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);

		//Aqui sua aplicação é criada.
		// Para esta introdução nos só imprimiremos, "Hello, World!"
		// no canto esquerdo superior da janela.
		TextOut(hdc,
			5, 5,
			greeting, _tcslen(greeting));
		// fim da aplicação de layout.

		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
		break;
	}

	return 0;
}
Publicidade

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s