BOOL CMapToolView::PreTranslateMessage(MSG* pMsg) { // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다. switch (pMsg->message) { case WM_KEYDOWN: if( LOWORD(pMsg->lParam) == 1 ) OnKeyPress(LOWORD(pMsg->wParam)); break; case WM_KEYUP: OnKeyRelease(LOWORD(pMsg->wParam)); break; case WM_LBUTTONDOWN: OnMouseClick(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam), 0, LOWORD(pMsg->wParam)); break; case WM_RBUTTONDOWN: OnMouseClick(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam), 1, LOWORD(pMsg->wParam)); break; case WM_MBUTTONDOWN: OnMouseClick(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam), 2, LOWORD(pMsg->wParam)); break; case WM_LBUTTONUP: OnMouseRelease(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam), 0, LOWORD(pMsg->wParam)); break; case WM_RBUTTONUP: OnMouseRelease(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam), 1, LOWORD(pMsg->wParam)); break; case WM_MBUTTONUP: OnMouseRelease(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam), 2, LOWORD(pMsg->wParam)); break; case WM_LBUTTONDBLCLK: OnMouseDoubleClick(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam), 0, LOWORD(pMsg->wParam)); break; case WM_RBUTTONDBLCLK: OnMouseDoubleClick(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam), 1, LOWORD(pMsg->wParam)); break; case WM_MBUTTONDBLCLK: OnMouseDoubleClick(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam), 2, LOWORD(pMsg->wParam)); break; case WM_MOUSEMOVE: OnMouseMove(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam)); break; case WM_MOUSEWHEEL: OnMouseWheel((short)HIWORD(pMsg->wParam), LOWORD(pMsg->wParam)); break; } return CView::PreTranslateMessage(pMsg); }
bool iWidget::ProcessMessage(eGuiMessage aMessage, cGuiMessageData &aData) { if(IsEnabled()==false) return false; aData.mMessage = aMessage; bool bRet = false; bRet = OnMessage(aMessage,aData); //This can override any message. ///////////////////////////////////////// //Call the correct virtual function if(bRet==false) { switch(aMessage) { case eGuiMessage_MouseMove: bRet = OnMouseMove(aData); break; case eGuiMessage_MouseDown: bRet = OnMouseDown(aData); break; case eGuiMessage_MouseUp: bRet = OnMouseUp(aData); break; case eGuiMessage_MouseDoubleClick: bRet = OnMouseDoubleClick(aData); break; case eGuiMessage_MouseEnter: bRet = OnMouseEnter(aData); break; case eGuiMessage_MouseLeave: bRet = OnMouseLeave(aData); break; case eGuiMessage_KeyPress: bRet = OnKeyPress(aData); break; case eGuiMessage_GotFocus: bRet = OnGotFocus(aData); break; case eGuiMessage_LostFocus: bRet = OnLostFocus(aData); break; } } ///////////////////////////////////////// //Process user callbacks for the event. if(ProcessCallbacks(aMessage,aData)) bRet = true; return bRet; }
bool iWidget::ProcessMessage(eGuiMessage a_Message, cGuiMessageData &a_Data) { if (IsEnabled()==false) return false; a_Data.m_Message = a_Message; bool bRet = false; bRet = OnMessage(a_Message, a_Data); if (bRet==false) { switch(a_Message) { case eGuiMessage_MouseMove: bRet = OnMouseMove(a_Data);break; case eGuiMessage_MouseDown: bRet = OnMouseDown(a_Data);break; case eGuiMessage_MouseUp: bRet = OnMouseUp(a_Data);break; case eGuiMessage_MouseDoubleClick: bRet = OnMouseDoubleClick(a_Data);break; case eGuiMessage_MouseEnter: bRet = OnMouseEnter(a_Data);break; case eGuiMessage_MouseLeave: bRet = OnMouseLeave(a_Data);break; case eGuiMessage_GotFocus: bRet = OnGotFocus(a_Data);break; case eGuiMessage_LostFocus: bRet = OnLostFocus(a_Data);break; case eGuiMessage_KeyPress: bRet = OnKeyPress(a_Data);break; } } if (ProcessCallbacks(a_Message, a_Data)) bRet = true; return bRet; }
LRESULT CALLBACK Widget::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { MsgProcResult result; switch(msg) { case WM_PAINT: { PAINTSTRUCT ps; HDC hDC; if(wParam == 0) hDC = BeginPaint(hWnd, &ps); else hDC = (HDC)wParam; Gdiplus::Graphics g(hDC); OnPaint(&g, ps.rcPaint); if(wParam == 0) EndPaint(hWnd, &ps); } break; case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: { mIsMouseDown = true; SetCapture(hWnd); mMouseLastPos = POINT{GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)}; MouseEvent ev(this, mMouseLastPos, 1, wParam, msg == WM_LBUTTONDOWN ? MouseButton::Left : msg == WM_RBUTTONDOWN ? MouseButton::Right : msg == WM_MBUTTONDOWN ? MouseButton::Middle : MouseButton::None); SignalMouseDown.emit(ev); OnMouseDown(ev); } break; case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: { mIsMouseDown = false; ReleaseCapture(); mMouseLastPos = POINT{GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)}; MouseEvent ev(this, mMouseLastPos, 1, wParam, msg == WM_LBUTTONUP ? MouseButton::Left : msg == WM_RBUTTONUP ? MouseButton::Right : msg == WM_MBUTTONUP ? MouseButton::Middle : MouseButton::None); SignalMouseUp.emit(ev); OnMouseUp(ev); if(!mHasDragged) { SignalMouseClick.emit(ev); OnMouseClick(ev); } else mHasDragged = false; } break; case WM_LBUTTONDBLCLK: case WM_MBUTTONDBLCLK: case WM_RBUTTONDBLCLK: { MouseEvent ev(this, POINT{GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)}, 2, wParam, msg == WM_LBUTTONDBLCLK ? MouseButton::Left : msg == WM_MBUTTONDBLCLK ? MouseButton::Right : msg == WM_RBUTTONDBLCLK ? MouseButton::Middle : MouseButton::None); SignalMouseDoubleClick.emit(ev); OnMouseDoubleClick(ev); } break; case WM_MOUSEMOVE: { POINT mouseNewPos = POINT{GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)}; MouseEvent ev(this, mouseNewPos, 0, wParam, MouseButton::None, mMouseLastPos); mMouseLastPos = mouseNewPos; if(mIsMouseDown) { mHasDragged = true; SignalMouseDrag.emit(ev); OnMouseDrag(ev); } else { SignalMouseMove.emit(ev); OnMouseMove(ev); } } break; case WM_MOUSEWHEEL: { POINT pt = POINT{GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)}; ScreenToClient(mhWnd, &pt); MouseEvent ev(this, pt, 0, GET_KEYSTATE_WPARAM(wParam), MouseButton::None, mMouseLastPos, GET_WHEEL_DELTA_WPARAM(wParam)/WHEEL_DELTA); SignalMouseWheel.emit(ev); OnMouseWheel(ev); } break; case WM_SIZE: { int width = LOWORD(lParam); int height = HIWORD(lParam); SignalResize.emit(width, height); if(mLayout) mLayout->Apply(this); OnResize(width, height); } break; case WM_COMMAND: { HWND hCtrl = reinterpret_cast<HWND>(lParam); if(hCtrl != nullptr) { Widget* child = Widget::FromHandle(hCtrl); if(child != nullptr) child->OnCommand(HIWORD(wParam)); } } break; case WM_NOTIFY: { LPNMHDR lpnmhdr = reinterpret_cast<LPNMHDR>(lParam); Widget* child = Widget::FromHandle(lpnmhdr->hwndFrom); if(child != nullptr) result = child->OnNotify(lpnmhdr); } break; } if(result.ReturnDefault()) return CallDefaultProc(hWnd, msg, wParam, lParam); else return result.Value(); }