/tutorial-win32

Tutorial de como compilar uma aplicação Win32 com janelas

Creative Commons Zero v1.0 UniversalCC0-1.0

Tutorial para compilar aplicações Win32 no Windows

Por Emerson Lima em 08/08/2020

A Win32 é uma API C da Microsoft para programação de sistemas Windows. Ela possui diversãs funções e tipos para trabalhar com janelas, desenhos, multimídia, dentre outras, além do acesso à serviços básicos do sistema como gerenciamento de processos, memória, etc.

Nesse tutorial vamos compilar uma aplicação que faz uso da api Win32 utilizando o MinGW-W64.

Caixa de Mensagem

Uma aplicação que faz uso de caixas de mensagens pode ser escrita como:

#include <windows.h>

int main() {
  MessageBox(nullptr, TEXT("Uma cadeia de caracteres", TEXT("Exemplo"), 0);  
  return 0;
}

Para compilar precisamos, na linha de comando, entrar com o comando:

g++ main.cpp -o main.exe

Janela com multimídia e desenho

/*------------------------------------------------------------
   HELLOWIN.C -- Displays "Hello, Windows 98!" in client area
                 (c) Charles Petzold, 1998
  ------------------------------------------------------------*/
#include <windows.h>

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow) {

     static TCHAR szAppName[] = TEXT("HelloWin");
     HWND         hwnd;
     MSG          msg;
     WNDCLASS     wndclass;
     
     wndclass.style         = CS_HREDRAW | CS_VREDRAW;
     wndclass.lpfnWndProc   = WndProc;
     wndclass.cbClsExtra    = 0;
     wndclass.cbWndExtra    = 0;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
     wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
     wndclass.lpszMenuName  = NULL;
     wndclass.lpszClassName = szAppName;
     
     if (!RegisterClass(&wndclass)) {
          MessageBox(NULL, TEXT ("This program requires Windows NT!"), 
                      szAppName, MB_ICONERROR);
          return 0 ;
     }
     
     hwnd = CreateWindow(szAppName,                  // window class name
                         TEXT ("The Hello Program"), // window caption
                         WS_OVERLAPPEDWINDOW,        // window style
                         CW_USEDEFAULT,              // initial x position
                         CW_USEDEFAULT,              // initial y position
                         CW_USEDEFAULT,              // initial x size
                         CW_USEDEFAULT,              // initial y size
                         NULL,                       // parent window handle
                         NULL,                       // window menu handle
                         hInstance,                  // program instance handle
                         NULL);                      // creation parameters
     
     ShowWindow(hwnd, iCmdShow);
     UpdateWindow(hwnd);
     
     while (GetMessage (&msg, NULL, 0, 0)) {
          TranslateMessage (&msg);
          DispatchMessage (&msg);
     }
     return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
     HDC         hdc;
     PAINTSTRUCT ps;
     RECT        rect;
     
     switch (message) {
		 case WM_CREATE:
		      PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC);
		      return 0;
		      
		 case WM_PAINT:
		      hdc = BeginPaint(hwnd, &ps);
		      
		      GetClientRect(hwnd, &rect);
		      
		      DrawText(hdc, TEXT("Hello, Windows 98!"), -1, &rect,
		                DT_SINGLELINE | DT_CENTER | DT_VCENTER);
		      EndPaint(hwnd, &ps);
		      return 0;
		      
		 case WM_DESTROY:
		      PostQuitMessage(0);
		      return 0;
     }
     
     return DefWindowProc(hwnd, message, wParam, lParam);
}

Dependencias

  • gdi32.dll - Funções GDI
  • winmm.dll - Funções Multimídia

Compilando

g++ olawin.cpp -lgdi32 -lwinmm -o olawin.exe