summaryrefslogtreecommitdiff
path: root/Editor/GUI/ContainnerWindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Editor/GUI/ContainnerWindow.cpp')
-rw-r--r--Editor/GUI/ContainnerWindow.cpp151
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)
+{
+
+}