📄 gdkwindow-win32.c
字号:
/* If asked to show (but not raise) a window that is already * visible, do nothing. */ if (!deiconify && !raise && IsWindowVisible (GDK_WINDOW_HWND (window))) return; /* Other cases */ if (!GDK_WINDOW_IS_MAPPED (window)) { gdk_synthesize_window_state (window, GDK_WINDOW_STATE_WITHDRAWN, 0); focus_on_map = private->focus_on_map; } /* Use SetWindowPos to show transparent windows so automatic redraws * in other windows can be suppressed. */ if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT) { UINT flags = SWP_SHOWWINDOW | SWP_NOREDRAW | SWP_NOMOVE | SWP_NOSIZE; if (!raise) flags |= SWP_NOZORDER; if (!raise || GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map) flags |= SWP_NOACTIVATE; SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOP, 0, 0, 0, 0, flags); return; } old_active_window = GetActiveWindow (); if (private->state & (GDK_WINDOW_STATE_BELOW | GDK_WINDOW_STATE_ABOVE)) { DWORD exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE); if (private->state & GDK_WINDOW_STATE_BELOW) exstyle &= (~WS_EX_TOPMOST); if (private->state & GDK_WINDOW_STATE_ABOVE) exstyle |= WS_EX_TOPMOST; if (!SetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE, exstyle)) WIN32_API_FAILED ("SetWindowLong"); } if (private->state & GDK_WINDOW_STATE_FULLSCREEN) gdk_window_fullscreen (window); else if (private->state & GDK_WINDOW_STATE_MAXIMIZED) ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE); else if (private->state & GDK_WINDOW_STATE_ICONIFIED) ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE); else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map) ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNOACTIVATE); else ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL); if (raise) { if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP) SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL || GDK_WINDOW_TYPE (window) == GDK_WINDOW_DIALOG) SetForegroundWindow (GDK_WINDOW_HWND (window)); else BringWindowToTop (GDK_WINDOW_HWND (window)); } else if (old_active_window != GDK_WINDOW_HWND (window)) SetActiveWindow (old_active_window);}voidgdk_window_show_unraised (GdkWindow *window){ g_return_if_fail (GDK_IS_WINDOW (window)); show_window_internal (window, FALSE, FALSE);}voidgdk_window_show (GdkWindow *window){ g_return_if_fail (GDK_IS_WINDOW (window)); show_window_internal (window, TRUE, FALSE);}voidgdk_window_hide (GdkWindow *window){ GdkWindowObject *private; g_return_if_fail (window != NULL); private = (GdkWindowObject*) window; if (private->destroyed) return; GDK_NOTE (MISC, g_print ("gdk_window_hide: %p: %s\n", GDK_WINDOW_HWND (window), _gdk_win32_window_state_to_string (private->state))); if (GDK_WINDOW_IS_MAPPED (window)) gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_WITHDRAWN); _gdk_window_clear_update_area (window); if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL) ShowOwnedPopups (GDK_WINDOW_HWND (window), FALSE); if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT) { SetWindowPos (GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOREDRAW | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE); } else { ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE); }}voidgdk_window_withdraw (GdkWindow *window){ GdkWindowObject *private; g_return_if_fail (window != NULL); private = (GdkWindowObject*) window; if (private->destroyed) return; GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %p: %s\n", GDK_WINDOW_HWND (window), _gdk_win32_window_state_to_string (private->state))); gdk_window_hide (window); /* ??? */}voidgdk_window_move (GdkWindow *window, gint x, gint y){ GdkWindowObject *private = (GdkWindowObject *)window; GdkWindowImplWin32 *impl; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); if (GDK_WINDOW_DESTROYED (window)) return; GDK_NOTE (MISC, g_print ("gdk_window_move: %p: +%d+%d\n", GDK_WINDOW_HWND (window), x, y)); impl = GDK_WINDOW_IMPL_WIN32 (private->impl); if (private->state & GDK_WINDOW_STATE_FULLSCREEN) return; if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD) _gdk_window_move_resize_child (window, x, y, impl->width, impl->height); else { RECT outer_rect; get_outer_rect (window, impl->width, impl->height, &outer_rect); adjust_for_gravity_hints (impl, &outer_rect, &x, &y); API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL, x - _gdk_offset_x, y - _gdk_offset_y, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER)); }}voidgdk_window_resize (GdkWindow *window, gint width, gint height){ GdkWindowObject *private = (GdkWindowObject*) window; GdkWindowImplWin32 *impl; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); if (GDK_WINDOW_DESTROYED (window)) return; if (width < 1) width = 1; if (height < 1) height = 1; GDK_NOTE (MISC, g_print ("gdk_window_resize: %p: %dx%d\n", GDK_WINDOW_HWND (window), width, height)); impl = GDK_WINDOW_IMPL_WIN32 (private->impl); if (private->state & GDK_WINDOW_STATE_FULLSCREEN) return; if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD) _gdk_window_move_resize_child (window, private->x, private->y, width, height); else { RECT outer_rect; get_outer_rect (window, width, height, &outer_rect); API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL, 0, 0, outer_rect.right - outer_rect.left, outer_rect.bottom - outer_rect.top, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER)); private->resize_count += 1; }}voidgdk_window_move_resize (GdkWindow *window, gint x, gint y, gint width, gint height){ GdkWindowObject *private = (GdkWindowObject*) window; GdkWindowImplWin32 *impl; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); if (GDK_WINDOW_DESTROYED (window)) return; if (width < 1) width = 1; if (height < 1) height = 1; impl = GDK_WINDOW_IMPL_WIN32 (private->impl); if (private->state & GDK_WINDOW_STATE_FULLSCREEN) return; GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %p: %dx%d@+%d+%d\n", GDK_WINDOW_HWND (window), width, height, x, y)); if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD) _gdk_window_move_resize_child (window, x, y, width, height); else { RECT outer_rect; get_outer_rect (window, width, height, &outer_rect); adjust_for_gravity_hints (impl, &outer_rect, &x, &y); API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL, x - _gdk_offset_x, y - _gdk_offset_y, outer_rect.right - outer_rect.left, outer_rect.bottom - outer_rect.top, SWP_NOACTIVATE | SWP_NOZORDER)); }}voidgdk_window_reparent (GdkWindow *window, GdkWindow *new_parent, gint x, gint y){ GdkWindowObject *window_private; GdkWindowObject *parent_private; GdkWindowObject *old_parent_private; GdkWindowImplWin32 *impl; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); g_return_if_fail (new_parent == NULL || GDK_IS_WINDOW (new_parent)); g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_ROOT); if (GDK_WINDOW_DESTROYED (window) || (new_parent && GDK_WINDOW_DESTROYED (new_parent))) { return; } if (!new_parent) new_parent = _gdk_parent_root; window_private = (GdkWindowObject*) window; old_parent_private = (GdkWindowObject *) window_private->parent; parent_private = (GdkWindowObject*) new_parent; impl = GDK_WINDOW_IMPL_WIN32 (window_private->impl); if (!GDK_WINDOW_DESTROYED (window) && !GDK_WINDOW_DESTROYED (new_parent)) { GDK_NOTE (MISC, g_print ("gdk_window_reparent: %p: %p\n", GDK_WINDOW_HWND (window), GDK_WINDOW_HWND (new_parent))); API_CALL (SetParent, (GDK_WINDOW_HWND (window), GDK_WINDOW_HWND (new_parent))); API_CALL (MoveWindow, (GDK_WINDOW_HWND (window), x, y, impl->width, impl->height, TRUE)); } /* From here on, we treat parents of type GDK_WINDOW_FOREIGN like * the root window */ if (GDK_WINDOW_TYPE (new_parent) == GDK_WINDOW_FOREIGN) new_parent = _gdk_parent_root; window_private->parent = (GdkWindowObject *)new_parent; if (old_parent_private) old_parent_private->children = g_list_remove (old_parent_private->children, window); parent_private->children = g_list_prepend (parent_private->children, window); _gdk_window_init_position (GDK_WINDOW (window_private));}void_gdk_windowing_window_clear_area (GdkWindow *window, gint x, gint y, gint width, gint height){ GdkWindowImplWin32 *impl; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl); if (!GDK_WINDOW_DESTROYED (window)) { HDC hdc; if (width == 0) width = impl->width - x; if (height == 0) height = impl->height - y; GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: %p: " "%dx%d@+%d+%d\n", GDK_WINDOW_HWND (window), width, height, x, y)); hdc = GetDC (GDK_WINDOW_HWND (window)); IntersectClipRect (hdc, x, y, x + width + 1, y + height + 1); SendMessage (GDK_WINDOW_HWND (window), WM_ERASEBKGND, (WPARAM) hdc, 0); GDI_CALL (ReleaseDC, (GDK_WINDOW_HWND (window), hdc)); }}void_gdk_windowing_window_clear_area_e (GdkWindow *window, gint x, gint y, gint width, gint height){ g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); if (!GDK_WINDOW_DESTROYED (window)) { RECT rect; GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: %p: " "%dx%d@+%d+%d\n", GDK_WINDOW_HWND (window), width, height, x, y)); rect.left = x; rect.right = x + width + 1; rect.top = y; rect.bottom = y + height + 1; GDI_CALL (InvalidateRect, (GDK_WINDOW_HWND (window), &rect, TRUE)); UpdateWindow (GDK_WINDOW_HWND (window)); }}voidgdk_window_raise (GdkWindow *window){ g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); if (!GDK_WINDOW_DESTROYED (window)) { GDK_NOTE (MISC, g_print ("gdk_window_raise: %p\n", GDK_WINDOW_HWND (window))); API_CALL (BringWindowToTop, (GDK_WINDOW_HWND (window))); }}voidgdk_window_lower (GdkWindow *window){ g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); if (!GDK_WINDOW_DESTROYED (window)) { GDK_NOTE (MISC, g_print ("gdk_window_lower: %p\n", GDK_WINDOW_HWND (window))); API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE)); }}voidgdk_window_set_hints (GdkWindow *window, gint x, gint y, gint min_width, gint min_height, gint max_width, gint max_height, gint flags){ /* Note that this function is obsolete */ GdkWindowImplWin32 *impl; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); if (GDK_WINDOW_DESTROYED (window)) return; impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl); GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %p: %dx%d..%dx%d @+%d+%d\n", GDK_WINDOW_HWND (window), min_width, min_height, max_width, max_height, x, y)); if (flags) { GdkGeometry geom; gint geom_mask = 0; geom.min_width = min_width; geom.min_height = min_height; geom.max_width = max_width; geom.max_height = max_height; if (flags & GDK_HINT_MIN_SIZE) geom_mask |= GDK_HINT_MIN_SIZE; if (flags & GDK_HINT_MAX_SIZE) geom_mask |= GDK_HINT_MAX_SIZE; gdk_window_set_geometry_hints (window, &geom, geom_mask); }}void gdk_window_set_geometry_hints (GdkWindow *window, GdkGeometry *geometry, GdkWindowHints geom_mask){ GdkWindowImplWin32 *impl;#if 0 WINDOWPLACEMENT size_hints; RECT rect; gint new_width = 0, new_height = 0;#endif g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); if (GDK_WINDOW_DESTROYED (window)) return; GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints: %p\n", GDK_WINDOW_HWND (window))); impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -