Window Wrapper Class C ++ (G ++) - PullRequest
       25

Window Wrapper Class C ++ (G ++)

2 голосов
/ 29 мая 2010

Я пытаюсь узнать о создании окон в c ++, я посмотрел статью о создании класса-оболочки, но я не совсем понимаю. Пока я знаю, что у вас не может быть метода класса WndProc (я не знаю почему), но, честно говоря, это все. Может ли кто-нибудь дать объяснение, также объясняющее reinterpret_cast? Здесь - статья.

LRESULT CALLBACK Window::MsgRouter(HWND hwnd, UINT message,
                                   WPARAM wparam, LPARAM lparam)
{
  Window *wnd = 0;

  if(message == WM_NCCREATE)
  {
    // retrieve Window instance from window creation data and associate
    wnd = reinterpret_cast<Window *>((LPCREATESTRUCT)lparam)->lpCreateParams;
    ::SetWindowLong(hwnd, GWL_USERDATA, reinterpret_cast<long>(wnd));

    // save window handle
    wnd->SetHWND(hwnd);
  }
  else
    // retrieve associated Window instance
    wnd = reinterpret_cast<Window *>(::GetWindowLong(hwnd, GWL_USERDATA));

  // call the windows message handler
  wnd->WndProc(message, wparam, lparam);
}

Заранее спасибо, эл.

1 Ответ

4 голосов
/ 29 мая 2010

Процедура MsgRouter() действует как прокси между системой обработки сообщений Windows для экземпляра Window, связанного с HWND. Он направляет сообщения Windows в объекты C ++.

Указатель на экземпляр Window передается в процедуру MsgRouter() через последний параметр функции CreateWindow(). Когда вы впервые создаете HWND через CreateWindow() (или CreateWindowEx()), некоторые сообщения отправляются - одним из них является WM_NCCREATE. Когда процедура получает сообщение WM_NCCREATE, параметр LPARAM содержит указатель на CREATESTRUCT, который содержит аргументы, переданные в функцию CreateWindow(). Процедура извлекает указатель экземпляра Window из CREATESTRUCT и сохраняет его в HWND, устанавливая его как атрибут HWND (GWL_USERDATA через SetWindowLong()).

Теперь, когда указатель сохранен, оконная процедура теперь может получать указатель на исходный экземпляр Window из HWND через GetWindowLong(), когда она получает сообщение. Наконец, оконная процедура вызывает WndProc() для извлеченного указателя Window, передавая точное сообщение и параметры, чтобы экземпляр Window мог обработать сообщение.

...