Val_Kir

Лекция 1

Apr 21st, 2021 (edited)
458
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.10 KB | None | 0 0
  1. Lec1pg12
  2. Source.cpp
  3. #ifndef UNICODE
  4. #define UNICODE
  5. #endif
  6. #include <windows.h>
  7. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  8. int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
  9. {
  10.  // Регистрация класса окна.
  11.  const wchar_t CLASS_NAME[] = L"Sample Window Class";
  12.  WNDCLASS wc = {};
  13.  wc.lpfnWndProc = WindowProc;
  14.  wc.hInstance = hInstance;
  15.  wc.lpszClassName = CLASS_NAME;
  16.  RegisterClass(&wc);
  17.  // Создание окна.
  18.  HWND hwnd = CreateWindowEx(
  19.   0,                              // Дополнительные стили окна.
  20.   CLASS_NAME,                     // Класс окна
  21.   L"Learn to Program Windows",    // Заголовок окна
  22.   WS_OVERLAPPEDWINDOW,            // Стиль окна
  23.           // Размер и позиция
  24.   CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  25.   NULL,       // Родительское окно  
  26.   NULL,       // Меню
  27.   hInstance,  // Дескриптор экземпляра
  28.   NULL        // Дополнительные данные приложения
  29.  );
  30.  if (hwnd == NULL)
  31.  {
  32.   return 0;
  33.  }
  34.  ShowWindow(hwnd, nCmdShow);
  35.  // Запуск цикла обработки сообщений.
  36.  MSG msg = {};
  37.  while (GetMessage(&msg, NULL, 0, 0))
  38.  {
  39.   TranslateMessage(&msg);
  40.   DispatchMessage(&msg);
  41.  }
  42.  return 0;
  43. }
  44. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  45. {
  46.  switch (uMsg)
  47.  {
  48.  case WM_DESTROY:
  49.   PostQuitMessage(0);
  50.   return 0;
  51.  case WM_PAINT:
  52.  {
  53.   PAINTSTRUCT ps;
  54.   HDC hdc = BeginPaint(hwnd, &ps);
  55.   FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
  56.   EndPaint(hwnd, &ps);
  57.  }
  58.  return 0;
  59.  }
  60.  return DefWindowProc(hwnd, uMsg, wParam, lParam);
  61. }
  62. Lec1pg25
  63. Source.cpp
  64. #ifndef UNICODE
  65. #define UNICODE
  66. #endif
  67. #include <windows.h>
  68. #include <new>
  69. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  70. struct StateInfo {
  71.  // ... (члены структуры не показаны)
  72. };
  73. int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
  74. {
  75.  // Регистрация класса окна.
  76.  const wchar_t CLASS_NAME[] = L"Sample Window Class";
  77.  WNDCLASS wc = {};
  78.  wc.lpfnWndProc = WindowProc;
  79.  wc.hInstance = hInstance;
  80.  wc.lpszClassName = CLASS_NAME;
  81.  RegisterClass(&wc);
  82.  // Создание окна.
  83.  // Определение структуры для хранения информации о состоянии.
  84.  
  85.  StateInfo *pState = new (std::nothrow) StateInfo;
  86.  if (pState == NULL)
  87.  {
  88.   return 0;
  89.  }
  90.  // Инициализация членов структуры (не показана).
  91.  HWND hwnd = CreateWindowEx(
  92.   0,                              // Дополнительные стили окна.
  93.   CLASS_NAME,                     // Класс окна
  94.   L"Learn to Program Windows",    // Заголовок окна
  95.   WS_OVERLAPPEDWINDOW,            // Стиль окна
  96.           // Размер и позиция
  97.   CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  98.   NULL,       // Родительское окно  
  99.   NULL,       // Меню
  100.   hInstance,  // Дескриптор экземпляра
  101.   pState      // Дополнительные данные приложения
  102.  );
  103.  if (hwnd == NULL)
  104.  {
  105.   return 0;
  106.  }
  107.  ShowWindow(hwnd, nCmdShow);
  108.  // Запуск цикла обработки сообщений.
  109.  MSG msg = {};
  110.  while (GetMessage(&msg, NULL, 0, 0))
  111.  {
  112.   TranslateMessage(&msg);
  113.   DispatchMessage(&msg);
  114.  }
  115.  return 0;
  116. }
  117. inline StateInfo* GetAppState(HWND hwnd)
  118. {
  119.  LONG_PTR ptr = GetWindowLongPtr(hwnd, GWLP_USERDATA);
  120.  StateInfo *pState = reinterpret_cast<StateInfo*>(ptr);
  121.  return pState;
  122. }
  123. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  124. {
  125.  StateInfo *pState;
  126.  if (uMsg == WM_CREATE)
  127.  {
  128.   CREATESTRUCT *pCreate = reinterpret_cast<CREATESTRUCT*>(lParam);
  129.   pState = reinterpret_cast<StateInfo*>(pCreate->lpCreateParams);
  130.   SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pState);
  131.  }
  132.  else
  133.  {
  134.   pState = GetAppState(hwnd);
  135.  }
  136.  switch (uMsg)
  137.  {
  138.  case WM_DESTROY:
  139.   PostQuitMessage(0);
  140.   return 0;
  141.  case WM_PAINT:
  142.  {
  143.   PAINTSTRUCT ps;
  144.   HDC hdc = BeginPaint(hwnd, &ps);
  145.   FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
  146.   EndPaint(hwnd, &ps);
  147.  }
  148.  return 0;
  149.  }
  150.  return DefWindowProc(hwnd, uMsg, wParam, lParam);
  151. }
  152. Lec1pg27
  153. Source.cpp
  154.  
  155. /*#ifndef UNICODE
  156. #define UNICODE
  157. #endif */
  158.  
  159. #include <windows.h>
  160. #include  "MainWindow.h"
  161.  
  162. int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
  163. {
  164.  MainWindow win;
  165.  
  166.  if (!win.Create(L"Learn to Program Windows", WS_OVERLAPPEDWINDOW))
  167.  {
  168.   return 0;
  169.  }
  170.  
  171.  ShowWindow(win.Window(), nCmdShow);
  172.  
  173.  // Запуск цикла обработки сообщений.
  174.  
  175.  MSG msg = {};
  176.  while (GetMessage(&msg, NULL, 0, 0))
  177.  {
  178.   TranslateMessage(&msg);
  179.   DispatchMessage(&msg);
  180.  }
  181.  
  182.  return 0;
  183. }
  184.  
  185. BaseWindow.h
  186.  
  187. #pragma once
  188. template <class DERIVED_TYPE>
  189. class BaseWindow
  190. {
  191. public:
  192.  static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  193.  {
  194.   DERIVED_TYPE *pThis = NULL;
  195.   if (uMsg == WM_NCCREATE)
  196.   {
  197.    CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam;
  198.    pThis = (DERIVED_TYPE*)pCreate->lpCreateParams;
  199.    SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pThis);
  200.    pThis->m_hwnd = hwnd;
  201.   }
  202.   else
  203.   {
  204.    pThis = (DERIVED_TYPE*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
  205.   }
  206.   if (pThis)
  207.   {
  208.    return pThis->HandleMessage(uMsg, wParam, lParam);
  209.   }
  210.   else
  211.   {
  212.    return DefWindowProc(hwnd, uMsg, wParam, lParam);
  213.   }
  214.  }
  215.  BaseWindow() : m_hwnd(NULL) { }
  216.  BOOL Create(
  217.   PCWSTR lpWindowName,
  218.   DWORD dwStyle,
  219.   DWORD dwExStyle = 0,
  220.   int x = CW_USEDEFAULT,
  221.   int y = CW_USEDEFAULT,
  222.   int nWidth = CW_USEDEFAULT,
  223.   int nHeight = CW_USEDEFAULT,
  224.   HWND hWndParent = 0,
  225.   HMENU hMenu = 0
  226.  )
  227.  {
  228.   WNDCLASS wc = { 0 };
  229.   wc.lpfnWndProc = DERIVED_TYPE::WindowProc;
  230.   wc.hInstance = GetModuleHandle(NULL);
  231.   wc.lpszClassName = ClassName();
  232.   RegisterClass(&wc);
  233.   m_hwnd = CreateWindowEx(
  234.    dwExStyle, ClassName(), lpWindowName, dwStyle, x, y,
  235.    nWidth, nHeight, hWndParent, hMenu, GetModuleHandle(NULL), this
  236.   );
  237.   return (m_hwnd ? TRUE : FALSE);
  238.  }
  239.  HWND Window() const { return m_hwnd; }
  240. protected:
  241.  virtual PCWSTR  ClassName() const = 0;
  242.  HWND m_hwnd;
  243. };
  244. MainWindow.h
  245. #pragma once
  246. #include "BaseWindow.h"
  247. class MainWindow : public BaseWindow<MainWindow>
  248. {
  249. public:
  250.  PCWSTR  ClassName() const { return L"Sample Window Class"; }
  251.  LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
  252. };
  253. MainWindow.cpp
  254. #include <Windows.h>
  255. #include "MainWindow.h"
  256. LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  257. {
  258.  switch (uMsg)
  259.  {
  260.  case WM_DESTROY:
  261.   PostQuitMessage(0);
  262.   return 0;
  263.  case WM_PAINT:
  264.  {
  265.   PAINTSTRUCT ps;
  266.   HDC hdc = BeginPaint(m_hwnd, &ps);
  267.   FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
  268.   EndPaint(m_hwnd, &ps);
  269.  }
  270.  return 0;
  271.  default:
  272.   return DefWindowProc(m_hwnd, uMsg, wParam, lParam);
  273.  }
  274.  return TRUE;
  275. }
Advertisement
Add Comment
Please, Sign In to add comment