Linguagem C - Programa que alterna a cor de fundo da Janela - Código revisado em 27/08/2022

main.html
/* Código revisado em 27/08/2022 */

#include <windows.h>

#define ID_TIMER 1
#define TITULO "Alterna a cor de fundo da Janela"

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

VOID CALLBACK tProc(HWND, UINT, UINT, DWORD);

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hPI, PSTR szCL, int iCS) {
   static char szAppName[] = "Alternar_a_cor_de_fundo_da_Janela";
   HWND hwnd;
   MSG msg;

   WNDCLASS wndclass;
   wndclass.style       = CS_HREDRAW | CS_VREDRAW;
   wndclass.lpfnWndProc = WndProc;
   wndclass.cbClsExtra  = 0;
   wndclass.cbWndExtra  = 0;
   wndclass.hInstance   = hI;
   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("Program requires Windows NT!"),
         szAppName,
         MB_ICONERROR
      );
      return 0;
   }
   hwnd = CreateWindow(
      szAppName, TITULO, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
      NULL, NULL, hI, NULL
   );
   ShowWindow(hwnd, iCS);
   UpdateWindow(hwnd);

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

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wP, LPARAM lP) {
   switch(msg) {
      case WM_CREATE:
         SetTimer(//Executa a função tProc a cada 5 milisegundos..
            hwnd,//Identificador da janela.. 
            ID_TIMER,//Identificador do temporizador.. 
            5000,
            tProc//A função tProc alterna a cor de fundo da janela
         );
         return 0;
      case WM_DESTROY:
         KillTimer(hwnd, ID_TIMER);//Destrói o temporizador
         PostQuitMessage(0);
         return 0;
   }
   return DefWindowProc(hwnd, msg, wP, lP);
}

VOID CALLBACK tProc(HWND hwnd, UINT msg, UINT iTimerID, DWORD dwTime) {
   static BOOL fFlipFlop = FALSE;
   HBRUSH hBrush;
   HDC hdc;
   RECT rc;
   MessageBeep(-1);
   fFlipFlop = !fFlipFlop;
   GetClientRect(hwnd, &rc);
   hdc = GetDC(hwnd);//Recupera o identificador do contexto do dispositivo
   hBrush = CreateSolidBrush(fFlipFlop ? RGB(255,0,0) : RGB(0,0,255));
   FillRect(hdc, &rc, hBrush);//Preenche o retângulo(rc) usando hBrush
   ReleaseDC(hwnd, hdc);//Libera o contexto do dispositivo(hdc)
   DeleteObject(hBrush);
}


Comentários