File: ./info.txt
   1 now
   2 
   3 This app shows a live digital-style clock, with the current date and time.

     File: ./main.c
   1 // gcc -Os -o now.exe -mwindows *.c
   2 
   3 #include <stdio.h>
   4 #include <time.h>
   5 #include <windows.h>
   6 
   7 const char* week_days[] = {
   8   "Sunday",
   9   "Monday",
  10   "Tuesday",
  11   "Wednesday",
  12   "Thursday",
  13   "Friday",
  14   "Saturday"
  15 };
  16 
  17 void now(HWND h) {
  18     const size_t message_cap = 64;
  19     char message[message_cap];
  20     memset(message, 0, message_cap);
  21 
  22     time_t t = time(NULL);
  23     struct tm* dt = localtime(&t);
  24     snprintf(message, message_cap,
  25         "%s%d/%02d/%02d %02d:%02d:%02d",
  26         week_days[dt->tm_wday],
  27         1900 + dt->tm_year, dt->tm_mon, dt->tm_mday,
  28         dt->tm_hour, dt->tm_min, dt->tm_sec
  29     );
  30     SetWindowTextA(h, message);
  31 }
  32 
  33 LRESULT CALLBACK window_proc(HWND h, UINT event, WPARAM wpar, LPARAM lpar) {
  34     switch (event) {
  35     case WM_KEYDOWN:
  36         if (wpar == VK_ESCAPE) {
  37             PostQuitMessage(0);
  38         }
  39         return 0;
  40 
  41     case WM_DESTROY:
  42         PostQuitMessage(0);
  43         return 0;
  44 
  45     case WM_CREATE:
  46     case WM_TIMER:
  47         now(h);
  48         return 0;
  49 
  50     default:
  51         return DefWindowProc(h, event, wpar, lpar);
  52     }
  53 }
  54 
  55 int WINAPI WinMain(HINSTANCE cur, HINSTANCE prev, LPSTR cmd_line, int show_cmd) {
  56     const char* class_name = "Main Window";
  57     const char* window_title = "Current Date and Time";
  58 
  59     WNDCLASSEXA wc;
  60     wc.cbClsExtra = 0;
  61     wc.cbSize = sizeof(WNDCLASSEXA);
  62     wc.cbWndExtra = 0;
  63     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  64     wc.hCursor = 0;
  65     wc.hIcon = 0;
  66     wc.hIconSm = 0;
  67     wc.hInstance = cur;
  68     wc.lpfnWndProc = window_proc;
  69     wc.lpszClassName = class_name;
  70     wc.lpszMenuName = "";
  71     wc.style = 0;
  72     if (!RegisterClassExA(&wc)) {
  73         return 1;
  74     }
  75 
  76     HWND win = CreateWindowExA(
  77         0,
  78         class_name,
  79         window_title,
  80         WS_OVERLAPPEDWINDOW,
  81         CW_USEDEFAULT, CW_USEDEFAULT, 480, 0,
  82         NULL, NULL, cur, NULL
  83     );
  84     if (win == NULL) {
  85         return 1;
  86     }
  87 
  88     // disable maximize button on the title bar
  89     LONG style = GetWindowLongA(win, GWL_STYLE) & ~WS_MAXIMIZEBOX;
  90     SetWindowLongA(win, GWL_STYLE, style);
  91 
  92     // start timer to update what's shown on the window
  93     UINT_PTR timer = (UINT_PTR)NULL;
  94     SetTimer(win, timer, 500, NULL);
  95 
  96     ShowWindow(win, show_cmd);
  97 
  98     MSG msg;
  99     while (GetMessage(&msg, NULL, 0, 0) > 0) {
 100         TranslateMessage(&msg);
 101         DispatchMessage(&msg);
 102     }
 103     return 0;
 104 }