Blame view

3rdparty/opencv-4.5.4/samples/directx/winapp.hpp 3.46 KB
f4334277   Hu Chunming   提交3rdparty
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
  /*
  // Sample demonstrating interoperability of OpenCV UMat with Direct X surface
  // Base class for Windows application
  */
  #define WIN32_LEAN_AND_MEAN
  #include <windows.h>
  #include <string>
  
  
  #define WINCLASS "WinAppWnd"
  
  class WinApp
  {
  public:
      WinApp(int width, int height, std::string& window_name)
      {
          m_width       = width;
          m_height      = height;
          m_window_name = window_name;
          m_hInstance   = ::GetModuleHandle(NULL);
          m_hWnd        = 0;
      }
  
      virtual ~WinApp() {}
  
  
      virtual int create()
      {
          WNDCLASSEX wcex;
  
          wcex.cbSize        = sizeof(WNDCLASSEX);
          wcex.style         = CS_HREDRAW | CS_VREDRAW;
          wcex.lpfnWndProc   = &WinApp::StaticWndProc;
          wcex.cbClsExtra    = 0;
          wcex.cbWndExtra    = 0;
          wcex.hInstance     = m_hInstance;
          wcex.hIcon         = LoadIcon(0, IDI_APPLICATION);
          wcex.hCursor       = LoadCursor(0, IDC_ARROW);
          wcex.hbrBackground = 0;
          wcex.lpszMenuName  = 0L;
          wcex.lpszClassName = WINCLASS;
          wcex.hIconSm       = 0;
  
          ATOM wc = ::RegisterClassEx(&wcex);
          if (!wc)
              return -1;
  
          RECT rc = { 0, 0, m_width, m_height };
          if(!::AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, false))
              return -1;
  
          m_hWnd = ::CreateWindow(
                       (LPCTSTR)wc, m_window_name.c_str(),
                       WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
                       rc.right - rc.left, rc.bottom - rc.top,
                       NULL, NULL, m_hInstance, (void*)this);
  
          if (!m_hWnd)
              return -1;
  
          ::ShowWindow(m_hWnd, SW_SHOW);
          ::UpdateWindow(m_hWnd);
          ::SetFocus(m_hWnd);
  
          return 0;
      } // create()
  
  
      int run()
      {
          MSG msg;
  
          ::ZeroMemory(&msg, sizeof(msg));
  
          while (msg.message != WM_QUIT)
          {
              if (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
              {
                  ::TranslateMessage(&msg);
                  ::DispatchMessage(&msg);
              }
              else
              {
                  idle();
              }
          }
  
          return static_cast<int>(msg.wParam);
      } // run()
  
  
      virtual int cleanup()
      {
          ::DestroyWindow(m_hWnd);
          ::UnregisterClass(WINCLASS, m_hInstance);
          return 0;
      } // cleanup()
  
  protected:
      // dispatch message handling to method of class
      static LRESULT CALLBACK StaticWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
      {
          WinApp* pWnd;
  
          if (message == WM_NCCREATE)
          {
              LPCREATESTRUCT pCreateStruct = reinterpret_cast<LPCREATESTRUCT>(lParam);
              pWnd = static_cast<WinApp*>(pCreateStruct->lpCreateParams);
              ::SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pWnd));
          }
  
          pWnd = GetObjectFromWindow(hWnd);
  
          if (pWnd)
              return pWnd->WndProc(hWnd, message, wParam, lParam);
          else
              return ::DefWindowProc(hWnd, message, wParam, lParam);
      } // StaticWndProc()
  
      inline static WinApp* GetObjectFromWindow(HWND hWnd) { return (WinApp*)::GetWindowLongPtr(hWnd, GWLP_USERDATA); }
  
      // actual wnd message handling
      virtual LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) = 0;
      // idle processing
      virtual int idle() = 0;
  
      HINSTANCE   m_hInstance;
      HWND        m_hWnd;
      int         m_width;
      int         m_height;
      std::string m_window_name;
  };