Tkap1

Untitled

Oct 7th, 2021
578
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2.  
  3. #pragma once
  4.  
  5.  
  6. typedef void (*TKW_WINDOW_RESIZE_CALLBACK)(int, int);
  7. typedef void (*TKW_WINDOW_KEY_CALLBACK)(int, int);
  8. typedef void (*TKW_WINDOW_MOUSE_CALLBACK)(int, int);
  9. typedef void (*TKW_WINDOW_ACTIVATE_CALLBACK)();
  10.  
  11.  
  12.  
  13. typedef struct
  14. {
  15.     int width;
  16.     int height;
  17.     HWND handle;
  18.     TKW_WINDOW_RESIZE_CALLBACK on_window_resize_callback;
  19.     TKW_WINDOW_KEY_CALLBACK on_window_key_callback;
  20.     TKW_WINDOW_MOUSE_CALLBACK on_window_mouse_callback;
  21.     TKW_WINDOW_ACTIVATE_CALLBACK on_window_activate_callback;
  22. } TKW_WINDOW;
  23.  
  24.  
  25.  
  26.  
  27. static TKW_WINDOW tkw_window = {0};
  28.  
  29.  
  30.  
  31. static void tkw_load_gl_extensions();
  32. static void tkw_display_window();
  33.  
  34.  
  35.  
  36. static void tkw_display_window()
  37. {
  38.     HDC dc = GetDC(tkw_window.handle);
  39.     SwapBuffers(dc);
  40.     ReleaseDC(tkw_window.handle, dc);
  41. }
  42.  
  43.  
  44. static LRESULT CALLBACK tkw_window_proc(HWND window, UINT message, WPARAM w_param, LPARAM l_param)
  45. {
  46.  
  47.     LRESULT result = 0;
  48.  
  49.     switch(message)
  50.     {
  51.  
  52.         case WM_SIZE:
  53.         {
  54.             RECT client_rect;
  55.             GetClientRect(window, &client_rect);
  56.             int width = client_rect.right - client_rect.left;
  57.             int height = client_rect.bottom - client_rect.top;
  58.             tkw_window.width = width;
  59.             tkw_window.height = height;
  60.  
  61.             if(tkw_window.on_window_resize_callback)
  62.             {
  63.                 tkw_window.on_window_resize_callback(width, height);
  64.             }
  65.         } break;
  66.  
  67.         case WM_DESTROY:
  68.         {
  69.             PostQuitMessage(0);
  70.         } break;
  71.  
  72.         case WM_CLOSE:
  73.         {
  74.             PostQuitMessage(0);
  75.         } break;
  76.  
  77.         case WM_ACTIVATEAPP:
  78.         {
  79.             if(tkw_window.on_window_activate_callback)
  80.             {
  81.                 tkw_window.on_window_activate_callback();
  82.             }
  83.         } break;
  84.  
  85.         case WM_KEYDOWN:
  86.         {
  87.             if(tkw_window.on_window_key_callback)
  88.             {
  89.                 tkw_window.on_window_key_callback((int)w_param, 1);
  90.             }
  91.         } break;
  92.  
  93.         case WM_KEYUP:
  94.         {
  95.             if(tkw_window.on_window_key_callback)
  96.             {
  97.                 tkw_window.on_window_key_callback((int)w_param, 0);
  98.             }
  99.         } break;
  100.  
  101.         case WM_LBUTTONDOWN:
  102.         {
  103.             if(tkw_window.on_window_mouse_callback)
  104.             {
  105.                 tkw_window.on_window_mouse_callback(0, 1);
  106.             }
  107.         } break;
  108.  
  109.         case WM_LBUTTONUP:
  110.         {
  111.             if(tkw_window.on_window_mouse_callback)
  112.             {
  113.                 tkw_window.on_window_mouse_callback(0, 0);
  114.             }
  115.         } break;
  116.  
  117.         case WM_RBUTTONDOWN:
  118.         {
  119.             if(tkw_window.on_window_mouse_callback)
  120.             {
  121.                 tkw_window.on_window_mouse_callback(1, 1);
  122.             }
  123.         } break;
  124.  
  125.         case WM_RBUTTONUP:
  126.         {
  127.             if(tkw_window.on_window_mouse_callback)
  128.             {
  129.                 tkw_window.on_window_mouse_callback(1, 0);
  130.             }
  131.         } break;
  132.  
  133.         // case WM_PAINT:
  134.         // {
  135.         //  PAINTSTRUCT ps;
  136.         //  HDC dc = BeginPaint(window, &ps);
  137.  
  138.         //  tkw_display_window(dc);
  139.  
  140.         //  EndPaint(window, &ps);
  141.  
  142.         // } break;
  143.  
  144.         default:
  145.         {
  146.             result = DefWindowProc(window, message, w_param, l_param);
  147.         } break;
  148.     }
  149.  
  150.     return result;
  151. }
  152.  
  153. static int tkw_create_window(
  154.     int width,
  155.     int height,
  156.     TKW_WINDOW_RESIZE_CALLBACK on_window_resize_callback,
  157.     TKW_WINDOW_KEY_CALLBACK on_window_key_callback,
  158.     TKW_WINDOW_MOUSE_CALLBACK on_window_mouse_callback,
  159.     TKW_WINDOW_ACTIVATE_CALLBACK on_window_activate_callback
  160. )
  161. {
  162.  
  163.     int result = 0;
  164.  
  165.     WNDCLASS window_class = {0};
  166.  
  167.     HINSTANCE hInstance = GetModuleHandle(0);
  168.  
  169.     window_class.style          = CS_HREDRAW|CS_VREDRAW;
  170.     window_class.lpfnWndProc   = tkw_window_proc;
  171.     window_class.hInstance     = hInstance;
  172.     window_class.lpszClassName = "some_window_class";
  173.  
  174.     RegisterClass(&window_class);
  175.  
  176.     HWND window = CreateWindowEx(
  177.         0,
  178.         window_class.lpszClassName,
  179.         "Learn",
  180.         WS_OVERLAPPEDWINDOW | WS_VISIBLE,
  181.         CW_USEDEFAULT, CW_USEDEFAULT, width, height,
  182.         NULL,
  183.         NULL,
  184.         hInstance,
  185.         NULL
  186.         );
  187.  
  188.     if(window)
  189.     {
  190.         tkw_window.handle = window;
  191.         tkw_window.on_window_resize_callback = on_window_resize_callback;
  192.         tkw_window.on_window_key_callback = on_window_key_callback;
  193.         tkw_window.on_window_mouse_callback = on_window_mouse_callback;
  194.         tkw_window.on_window_activate_callback = on_window_activate_callback;
  195.  
  196.     }
  197.     else
  198.     {
  199.         result = 0;
  200.     }
  201.  
  202.     return result;
  203. }
  204.  
  205. static int tkw_handle_messages()
  206. {
  207.     MSG msg;
  208.     while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
  209.     {
  210.         if(msg.message == WM_QUIT)
  211.         {
  212.             return 0;
  213.         }
  214.         TranslateMessage(&msg);
  215.         DispatchMessage(&msg);
  216.     }
  217.     return 1;
  218. }
RAW Paste Data