BOOL CDockManager::Dock(DM_POS nPos) { if (nPos == DMP_UNDOCKED) return UnDock(); // check if no change if (IsDocked() && m_nDockPos == nPos) return TRUE; BOOL bDocked = IsDocked(); m_nDockPos = nPos; CRect rDock; ScGetCWnd()->GetWindowRect(rDock); // save window pos if not currently docked if (!bDocked) m_rUndocked = rDock; // and restore previous width/height if (nPos == DMP_BELOW) { int nHeight = GetDockedHeight(IsMaximized()); if (nHeight != -1) { rDock.bottom = rDock.top + nHeight; CAutoFlag af(m_bResizeUpdate, FALSE); CAutoFlag af2(m_bSizeUpdate, FALSE); MoveWindow(ScGetCWnd(), rDock); } } else { int nWidth = GetDockedWidth(IsMaximized()); if (nWidth != -1) { rDock.right = rDock.left + nWidth; CAutoFlag af(m_bResizeUpdate, FALSE); CAutoFlag af2(m_bSizeUpdate, FALSE); MoveWindow(ScGetCWnd(), rDock); } } // also restore main window pos if maximized if (IsMaximized()) OnMaximize(); else { UpdateDockWindowPos(); FitDockWindowToWorkArea(); // make sure it's visible } return TRUE; }
void Module::OnEvent(const SDL_Event& event) { switch (event.type) { case SDL_WINDOWEVENT: { switch (event.window.event) { case SDL_WINDOWEVENT_ENTER: OnMouseFocus(); break; case SDL_WINDOWEVENT_LEAVE: OnMouseBlur(); break; case SDL_WINDOWEVENT_FOCUS_GAINED: OnInputFocus(); break; case SDL_WINDOWEVENT_FOCUS_LOST: OnInputBlur(); break; case SDL_WINDOWEVENT_RESTORED: OnRestore(); break; case SDL_WINDOWEVENT_MINIMIZED: OnMinimize(); break; case SDL_WINDOWEVENT_MAXIMIZED: OnMaximize(); break; case SDL_WINDOWEVENT_EXPOSED: OnExpose(); break; case SDL_WINDOWEVENT_SIZE_CHANGED: OnResize(event.window.data1, event.window.data2); break; default: break; } break; } case SDL_KEYDOWN: if (event.key.repeat) OnKeyRepeat(event.key.keysym); else OnKeyDown(event.key.keysym); break; case SDL_KEYUP: OnKeyUp(event.key.keysym); break; case SDL_MOUSEMOTION: OnMouseMove(event.motion); break; case SDL_MOUSEWHEEL: OnMouseWheel(event.wheel); break; case SDL_MOUSEBUTTONDOWN: OnMouseButtonDown(event.button); break; case SDL_MOUSEBUTTONUP: OnMouseButtonUp(event.button); break; case SDL_JOYAXISMOTION: OnJoyAxis(event.jaxis); break; case SDL_JOYBALLMOTION: OnJoyBall(event.jball); break; case SDL_JOYHATMOTION: OnJoyHat(event.jhat); break; case SDL_JOYBUTTONDOWN: OnJoyButtonDown(event.jbutton); break; case SDL_JOYBUTTONUP: OnJoyButtonUp(event.jbutton); break; case SDL_QUIT: OnExit(); break; case SDL_SYSWMEVENT: break; default: OnUser(event.user);break; } }
BOOL CDockManager::UnDock() { if (!IsDocked()) return TRUE; m_nLastDockPos = m_nDockPos; m_nDockPos = DMP_UNDOCKED; // restore window pos ScGetCWnd()->MoveWindow(m_rUndocked); // also restore main window pos if maximized if (IsMaximized()) OnMaximize(); else FitDockWindowToWorkArea(); // make sure it's visible return TRUE; }
LRESULT CDockManager::ScWindowProc(HWND hRealWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_MOVE: if (IsDocked()) { LRESULT lr = ScDefault(hRealWnd); if (m_bResizeUpdate) UpdateMainWindowPos(); return lr; } break; case WM_SIZE: if (IsDocked()) { LRESULT lr = ScDefault(hRealWnd); if (m_bResizeUpdate) UpdateMainWindowPos(); // save dock width if (m_bSizeUpdate && ::IsWindowVisible(ScGetHwnd())) { CRect rDock; ::GetWindowRect(ScGetHwnd(), rDock); if (IsMaximized()) { if (m_nDockPos == DMP_BELOW) m_nHeightDockedMax = rDock.Height(); else m_nWidthDockedMax = rDock.Width(); } else { if (m_nDockPos == DMP_BELOW) m_nHeightDocked = rDock.Height(); else m_nWidthDocked = rDock.Width(); } } return lr; } break; case WM_SYSCOMMAND: if (IsDocked()) { switch (wp) { // hide system menu case SC_KEYMENU: case SC_MOUSEMENU: return 0; // don't allow docked window to be minimized or maximized directly // instead, send the message to the main window case SC_MAXIMIZE: case SC_MINIMIZE: return SendMessage(msg, wp, lp); // if the dock window is being closed and the main window is maximized // then readjust the main window rect case SC_CLOSE: if (IsMaximized()) { LRESULT lr = ScDefault(hRealWnd); OnMaximize(); return lr; } break; } } break; case WM_NCRBUTTONDOWN: // if this is in the caption then eat it if (IsDocked() && wp == HTCAPTION) { // activate the window first ScSendMessage(WM_ACTIVATE, WA_CLICKACTIVE, NULL); return 0; } break; case WM_NCLBUTTONDOWN: // if this is in the caption and the main window in maxed // then eat if (IsDocked() && wp == HTCAPTION && IsMaximized()) { // activate the window first ScSendMessage(WM_ACTIVATE, WA_CLICKACTIVE, NULL); return 0; } break; case WM_NCLBUTTONDBLCLK: if (wp == HTCAPTION) { // toggle the docked state if (IsDocked()) UnDock(); else Dock(m_nLastDockPos); // and eat the message return 0; } break; case WM_NCHITTEST: if (IsDocked()) { UINT nHitTest = ScDefault(hRealWnd); // if the main window is _not_ unmaximized then don't let the // docked window be resized on it's docked edge // because its not intuitive and causes no end of trouble :) if (!IsMaximized()) { switch (m_nDockPos) { case DMP_LEFT: if (nHitTest == HTRIGHT || nHitTest == HTTOPRIGHT || nHitTest == HTBOTTOMRIGHT) nHitTest = HTCLIENT; break; case DMP_RIGHT: if (nHitTest == HTLEFT || nHitTest == HTTOPLEFT || nHitTest == HTBOTTOMLEFT) nHitTest = HTCLIENT; break; case DMP_BELOW: if (nHitTest == HTTOP || nHitTest == HTTOPLEFT || nHitTest == HTTOPRIGHT) nHitTest = HTCLIENT; break; default: ASSERT(0); break; } } // else main window is maximized so _only_ let it be resized on its // docked edge and resize the main window afterwards else { switch (m_nDockPos) { case DMP_LEFT: if (nHitTest == HTTOPRIGHT || nHitTest == HTBOTTOMRIGHT || nHitTest == HTLEFT || nHitTest == HTTOPLEFT || nHitTest == HTBOTTOMLEFT || nHitTest == HTTOP || nHitTest == HTBOTTOM) { nHitTest = HTCLIENT; } break; case DMP_RIGHT: if (nHitTest == HTTOPRIGHT || nHitTest == HTBOTTOMRIGHT || nHitTest == HTRIGHT || nHitTest == HTTOPLEFT || nHitTest == HTBOTTOMLEFT || nHitTest == HTTOP || nHitTest == HTBOTTOM) { nHitTest = HTCLIENT; } break; case DMP_BELOW: if (nHitTest == HTTOPRIGHT || nHitTest == HTBOTTOMRIGHT || nHitTest == HTRIGHT || nHitTest == HTTOPLEFT || nHitTest == HTBOTTOMLEFT || nHitTest == HTLEFT || nHitTest == HTBOTTOM) { nHitTest = HTCLIENT; } break; default: ASSERT(0); break; } } return nHitTest; } break; case WM_GETMINMAXINFO: if (IsDocked()) { LRESULT lr = ScDefault(hRealWnd); // save off our last min size LPMINMAXINFO pMMI = (LPMINMAXINFO)lp; m_sizeDockMin = pMMI->ptMinTrackSize; OnMinMaxInfo(pMMI, FALSE); return lr; } case WM_WINDOWPOSCHANGED: // if the dock window is being shown/hidden and the main window is maximized // then adjust the main window rect if (IsDocked() && IsMaximized()) { LPWINDOWPOS lpwp = (LPWINDOWPOS)lp; BOOL bVisible = ::IsWindowVisible(hRealWnd); BOOL bWantHide = (lpwp->flags & SWP_HIDEWINDOW); //BOOL bWantShow = (lpwp->flags & SWP_SHOWWINDOW); if (bVisible && bWantHide) // special case { CAutoFlag af(m_bResizeUpdate, FALSE); LRESULT lr = ScDefault(hRealWnd); CRect rMain = GetWorkArea(); MoveWindow(GetCWnd(), rMain); return lr; } else //if (!bVisible && bWantShow) { LRESULT lr = ScDefault(hRealWnd); OnMaximize(); return lr; } } break; } return ScDefault(hRealWnd); }
LRESULT CDockManager::WindowProc(HWND /*hRealWnd*/, UINT msg, WPARAM wp, LPARAM lp) { if (!IsDocked()) return Default(); switch (msg) { case WM_MOVE: { LRESULT lr = Default(); if (m_bResizeUpdate) UpdateDockWindowPos(); return lr; } break; case WM_SIZE: { LRESULT lr = Default(); if (m_bResizeUpdate) UpdateDockWindowPos(); return lr; } break; case WM_SYSCOMMAND: if (wp == SC_MAXIMIZE || wp == SC_RESTORE) { CAutoFlag af(m_bResizeUpdate, FALSE); LRESULT lr = Default(); if (wp == SC_MAXIMIZE) OnMaximize(); else OnRestore(); return lr; } break; case WM_NCLBUTTONDBLCLK: if (wp == HTCAPTION) { CAutoFlag af(m_bResizeUpdate, FALSE); BOOL bIsZoomed = IsMaximized(); LRESULT lr = Default(); if (!bIsZoomed) OnMaximize(); else OnRestore(); return lr; } break; case WM_NCLBUTTONDOWN: // if this is in the caption and the main window in maxed // then eat if (wp == HTCAPTION && IsMaximized()) { // activate the window first SendMessage(WM_ACTIVATE, WA_CLICKACTIVE, NULL); return 0; } break; case WM_GETMINMAXINFO: { // if the main window is zoomed then don't restrict how far // the docked window can be resized LRESULT lr = Default(); // save off our last min size LPMINMAXINFO pMMI = (LPMINMAXINFO)lp; m_sizeMainMin = pMMI->ptMinTrackSize; OnMinMaxInfo(pMMI, TRUE); return lr; } } return Default(); }