2016-11-12 4 views
0

나는 윈도우 생성과 관리를 위해 자신 만의 상용구 코드/라이브러리를 작성하려고한다. 내가 성취하고자하는 것은, 프로그래머가 람다 파라미터를 가진 함수를 호출 할 수 있다는 것입니다. 그런 다음 윈도우 닫기에서 실행될 것입니다. (방법과 마찬가지로 자바 스크립트 JQuery와 이벤트 핸들러를 추가하는 프로그래머를 수 있습니다.) 내가 만들려고하고 구조는 같은 것입니다 : 나는 특정 창에 대한 정보를 보유하고 내 사용자 지정 Window 클래스의 객체 windowwin32 이벤트 후크로부터의 C++ 콜백

  • .
  • 이 개체는 해당 창의 이벤트 훅을 SetWinEventHook(...)으로 설정합니다.
  • 프로그래머는 창 닫기 이벤트 처리기 목록/vector에 람다 함수를 추가하는 window.close(lambda)을 호출합니다.
  • 닫기 이벤트가 발생하면이 훅은 윈도우의 닫기 이벤트 목록에서 콜백을 호출합니다.

나는 interwebs에서 잠시 동안 검색했지만 마지막 단계를 수행 할 방법을 찾지 못했습니다. 이벤트에 후크를 추가 할 수는 있지만,이 후크는 정적이거나 캡쳐가없는 람다 여야하므로 창 개체와 통신 할 수있는 방법이 없습니다. 나는 이것이 어리석은 아이디어라는 것을 의미한다고 생각하지만, 여전히 일종의 예의 바른 방식으로 이것을 구현하는 방법이 있습니까?

+1

SetWinEventHook()을 한 번만 호출하십시오. 콜백은 창 핸들을 제공합니다. 그래서 Window 객체를 찾기 위해 정적'map '가 필요합니다. –

+0

나는 그것에 대해 완전히 명확하지는 않았지만 실제로 SetWinEventHook을 한 번만 호출합니다. 지도에 관해, 그것은 정말로 훌륭한 생각이다! 그것으로 완전한 답을 해 주시겠습니까? 그러면 나는 그것을 "내 질문에 대답했다"고 표시 할 수 있습니다. ;) –

+0

"완료"하는 방법을 모릅니다. 자신의 게시물에서 수행 한 작업을 표시하고 질문을 종료 할 답변으로 표시하십시오. –

답변

1

한스 (Hans)가 지적했듯이지도를 사용하여 각 창 핸들에 대한 창을 가져 오는 것이 좋습니다.

는 윈도우의 핸들러가 정적 게터를 통해 가져올 수 있습니다
map<HWND, Window *> Window::handlerWindows; 

:

Window *Window::getWindow(HWND handler) { 
    return handlerWindows[handler]; 
} 

창 절차는 창을 얻기 위해이 방법을 사용 나는 윈도우 핸들러와 창문 (정적)지도가 창 핸들를 들어, 이벤트 처리 할 수 ​​있도록 :

:

LRESULT CALLBACK windowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { 
    Window *window = Window::getWindow(hwnd); 
    switch (msg) { 
     case WM_CLOSE: 
      window->handle(msg); 
... 

이 처리기를 추가하려면를, 람다가 같은 일정 이벤트와 함께 제공됩니다

window->bind(WM_CLOSE, [&run](){ 
    run = false; 
    return true; 
}); 

이 이벤트 핸들러 목록에 핸들러를 추가합니다

map<DWORD, vector<function<bool()>>> eventHandlers; 

void Window::bind(DWORD event, function<bool()> handler) { 
    eventHandlers[event].push_back(handler); 
} 

그리고 이벤트가 함께 처리됩니다

을 :

void Window::handle(DWORD event) { 
    vector<function<bool()>> handlers = eventHandlers[event]; 
    for_each(handlers.begin(), handlers.end(), [](function<bool()> handler){ 
     handler(); 
    }); 
} 

이 아주 잘 작동합니다.