diff options
Diffstat (limited to 'Editor/GUI/ContainnerWindow.cpp')
-rw-r--r-- | Editor/GUI/ContainnerWindow.cpp | 151 |
1 files changed, 143 insertions, 8 deletions
diff --git a/Editor/GUI/ContainnerWindow.cpp b/Editor/GUI/ContainnerWindow.cpp index 5e6c356..3778485 100644 --- a/Editor/GUI/ContainnerWindow.cpp +++ b/Editor/GUI/ContainnerWindow.cpp @@ -8,11 +8,14 @@ using namespace std; +static bool s_IsMainWindowMaximized; + +extern bool ProcessMainWindowMessages(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT& result); + static PAINTSTRUCT ps; LRESULT CALLBACK ContainnerWindow::ContainerWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { - log_info("WndProc", "ContainnerWindow::ContainerWndProc()"); - + ContainnerWindow *self = (ContainnerWindow*)GetWindowLongPtr(hWnd, GWLP_USERDATA); if (!self) { @@ -20,6 +23,8 @@ LRESULT CALLBACK ContainnerWindow::ContainerWndProc(HWND hWnd, UINT message, WPA return DefWindowProcW(hWnd, message, wParam, lParam); } + //log_info("WndProc", "ContainnerWindow::ContainerWndProc(), ContainnerWindow name is " + self->GetName()); + switch (message) { case WM_MENUSELECT: @@ -48,6 +53,123 @@ LRESULT CALLBACK ContainnerWindow::ContainerWndProc(HWND hWnd, UINT message, WPA UpdateWindow(self->m_Window); return 0; } + case WM_ENTERMENULOOP: // 点击菜单 + + return 0; + case WM_EXITMENULOOP: // 松开菜单 + return 0; + + case WM_KEYDOWN: // key down + case WM_KEYUP: // key up + case WM_SYSKEYDOWN: // 和 WM_KEYDOWN 的区别是可以捕获快捷键或系统命令按键,比如alt键, Ctrl和shift不属于WM_SYSKEYDOWN + case WM_SYSKEYUP: // 和 WM_KEYUP 的区别是可以捕获快捷键或系统命令按键,比如alt键 + if (message == WM_KEYDOWN && wParam == VK_ESCAPE) { + // Escape should close utility container windows + // 如果本窗口是 utility 窗口,关闭它 + if (self->m_ShowMode == ShowMode::kShowUtility) { + self->Close(); + return 0; + } + } + return 0; + + case WM_ERASEBKGND:// WM_ERASEBKGND是在当窗口*背景*必须被擦除时 (例如,窗口的移动,窗口的大小的改变)发送。 + { + // unity的窗口背景色要么是灰色(免费版) ,要么是深黑色(专业版) + // 对于透明窗口 + if (GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_LAYERED) { // WS_EX_LAYERED是extendedStyle透明窗口 + // 填充用户区 + RECT rc; + GetClientRect(hWnd, &rc); + FillRect((HDC)wParam, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); + } + // do not erase background + // 如果不是透明窗口不要清除背景,跳过DefWindowProc函数 + return 1; + } + + case WM_WINDOWPOSCHANGED: // 窗口大小、位置、z层级改变,即窗口区域改变 + { + if (!self->m_IsClosing && !IsIconic(hWnd)) //IsIconic 窗口是否是最小化(图标化) + { + // OnRectChanged()回调 + self->OnRectChanged(); + } + // WM_WINDOWPOSCHANGED 消息触发后且调用了DefWindowProc会接着发送WM_SIZE和WM_MOVE消息。在WM_WINDOWPOSCHANGED + // 中一起处理大小和位置改变更高效 + /* + By default, the DefWindowProc function sends the WM_SIZE and WM_MOVE messages to the window. + The WM_SIZE and WM_MOVE messages are not sent if an application handles the WM_WINDOWPOSCHANGED + message without calling DefWindowProc. It is more efficient to perform any move or size change + processing during the WM_WINDOWPOSCHANGED message without calling DefWindowProc. + */ + break; + } + + case WM_SIZE: // 窗口大小改变 + if (self->m_ShowMode == ShowMode::kShowMainWindow) + { + if (IsWindowVisible(hWnd)) + { + bool nowMaximized = wParam == SIZE_MAXIMIZED; + if (s_IsMainWindowMaximized != nowMaximized)//更新s_IsMainWindowMaximized变量 + s_IsMainWindowMaximized = nowMaximized; + } + } + break; + + case WM_SETFOCUS: // 窗口获得焦点 + return 0; + + case WM_ACTIVATEAPP: // 编辑器的激活状态改变,所有的窗口都会获得这个消息,和WM_ACTIVATE不同,WM_ACTIVATE只是单个窗口被激活 + // 发送一个 OnActivateApplication 消息 + self->OnActivateApplication(wParam != FALSE); + break; // fall through to main window processing + + + case WM_NCACTIVATE: // non-client active 即非用户区被激活,用这个消息来刷新编辑器 + + break; + + case WM_ACTIVATE: // 单个窗口的激活状态改变 + + return 0; + + case WM_CLOSE: // 窗口关闭消息 + { + bool isMainAndShouldExit = (self->m_ShowMode == kShowMainWindow && !self->m_CloseFromScriptDontShutdown); + if (isMainAndShouldExit) + { + //退出编辑器 + } + else + { + // 关闭此窗口 + ::SetMenu(hWnd, NULL); // 给窗口分配一个菜单,如果是NULL,这个窗口的菜单被删除 + ::DestroyWindow(hWnd); + } + return 0; + } + + case WM_DESTROY: // 窗口被销毁 + + return 0; + + case WM_INITMENUPOPUP: //下拉菜单或子菜单将要被激活的时候 + + return 0; + + case WM_ENTERSIZEMOVE: // 在大小、位置改变前,即当用户点击标题栏、边框 + + return 0; + } + + if (self->m_ShowMode == ShowMode::kShowMainWindow) + { + LRESULT result; + if (ProcessMainWindowMessages(hWnd, message, wParam, lParam, result)) { + return result; + } } long flag = DefWindowProcW(hWnd, message, wParam, lParam); @@ -140,18 +262,14 @@ bool ContainnerWindow::SetRenderContext() } -HWND ContainnerWindow::GetWindowHandle() -{ - return m_Window; -} - // 初始化,创建窗口 -void ContainnerWindow::Init(Rectf pixelRect, int showMode, const Vector2f& minSize, const Vector2f& maxSize) +void ContainnerWindow::Init(Rectf pixelRect, int showMode, const Vector2f& minSize, const Vector2f& maxSize, std::string name) { // Aux windows are mac only. on windows they look just like normal utility windows. if (showMode == kShowAuxWindow) showMode = kShowUtility; + m_Name = name; m_ShowMode = static_cast<ShowMode>(showMode); m_IsClosing = false; m_InMenuLoop = false; @@ -289,3 +407,20 @@ void ContainnerWindow::SetIcon(LPCSTR iconName) if (SendMessage(m_Window, WM_SETICON, ICON_SMALL, (LPARAM)hWindowIcon) != WM_SETICON) log_error("icon error: " + to_string(GetLastError())); } + +void ContainnerWindow::Close() +{ + log_info("Close window " + m_Name); + + SendMessage(m_Window, WM_CLOSE, 0, 0); +} + +void ContainnerWindow::OnRectChanged() +{ + +} + +void ContainnerWindow::OnActivateApplication(bool active) +{ + +} |