Add create glfw window as child support for win32

This commit is contained in:
halx99 2024-02-25 11:16:35 +08:00 committed by Deal
parent dc557ecf38
commit a94c9782d5
5 changed files with 37 additions and 8 deletions

View File

@ -1129,6 +1129,7 @@ extern "C" {
/*! @brief Win32 specific [window hint](@ref GLFW_WIN32_SHOWDEFAULT_hint). /*! @brief Win32 specific [window hint](@ref GLFW_WIN32_SHOWDEFAULT_hint).
*/ */
#define GLFW_WIN32_SHOWDEFAULT 0x00025002 #define GLFW_WIN32_SHOWDEFAULT 0x00025002
#define GLFW_WIN32_HWND_PARENT 0x00025003
/*! @brief Wayland specific /*! @brief Wayland specific
* [window hint](@ref GLFW_WAYLAND_APP_ID_hint). * [window hint](@ref GLFW_WAYLAND_APP_ID_hint).
* *
@ -3052,6 +3053,14 @@ GLFWAPI void glfwDefaultWindowHints(void);
*/ */
GLFWAPI void glfwWindowHint(int hint, int value); GLFWAPI void glfwWindowHint(int hint, int value);
/*! @brief Sets the specified window hint to the desired value.
*
* @since Added in version 3.4.x.
*
* @ingroup window
*/
GLFWAPI void glfwWindowHintPointer(int hint, void* value);
/*! @brief Sets the specified window hint to the desired value. /*! @brief Sets the specified window hint to the desired value.
* *
* This function sets hints for the next call to @ref glfwCreateWindow. The * This function sets hints for the next call to @ref glfwCreateWindow. The

View File

@ -416,6 +416,7 @@ struct _GLFWwndconfig
struct { struct {
GLFWbool keymenu; GLFWbool keymenu;
GLFWbool showDefault; GLFWbool showDefault;
void* handleParent;
} win32; } win32;
struct { struct {
char appId[256]; char appId[256];

View File

@ -413,6 +413,7 @@ typedef struct _GLFWlibraryWGL
typedef struct _GLFWwindowWin32 typedef struct _GLFWwindowWin32
{ {
HWND handle; HWND handle;
HWND handleParent;
HICON bigIcon; HICON bigIcon;
HICON smallIcon; HICON smallIcon;

View File

@ -45,17 +45,22 @@ static DWORD getWindowStyle(const _GLFWwindow* window)
style |= WS_POPUP; style |= WS_POPUP;
else else
{ {
style |= WS_SYSMENU | WS_MINIMIZEBOX; if (!window->win32.handleParent)
if (window->decorated)
{ {
style |= WS_CAPTION; style |= WS_SYSMENU | WS_MINIMIZEBOX;
if (window->resizable) if (window->decorated)
style |= WS_MAXIMIZEBOX | WS_THICKFRAME; {
style |= WS_CAPTION;
if (window->resizable)
style |= WS_MAXIMIZEBOX | WS_THICKFRAME;
}
else
style |= WS_POPUP;
} }
else else
style |= WS_POPUP; style |= WS_CHILD;
} }
return style; return style;
@ -1384,13 +1389,14 @@ static int createNativeWindow(_GLFWwindow* window,
if (!wideTitle) if (!wideTitle)
return GLFW_FALSE; return GLFW_FALSE;
window->win32.handleParent = wndconfig->win32.handleParent;
window->win32.handle = CreateWindowExW(exStyle, window->win32.handle = CreateWindowExW(exStyle,
MAKEINTATOM(_glfw.win32.mainWindowClass), MAKEINTATOM(_glfw.win32.mainWindowClass),
wideTitle, wideTitle,
style, style,
frameX, frameY, frameX, frameY,
frameWidth, frameHeight, frameWidth, frameHeight,
NULL, // No parent window (HWND)wndconfig->win32.handleParent,
NULL, // No window menu NULL, // No window menu
_glfw.win32.instance, _glfw.win32.instance,
(LPVOID) wndconfig); (LPVOID) wndconfig);

View File

@ -436,6 +436,18 @@ GLFWAPI void glfwWindowHint(int hint, int value)
_glfwInputError(GLFW_INVALID_ENUM, "Invalid window hint 0x%08X", hint); _glfwInputError(GLFW_INVALID_ENUM, "Invalid window hint 0x%08X", hint);
} }
GLFWAPI void glfwWindowHintPointer(int hint, void* value)
{
_GLFW_REQUIRE_INIT();
switch (hint)
{
case GLFW_WIN32_HWND_PARENT:
_glfw.hints.window.win32.handleParent = value;
break;
}
}
GLFWAPI void glfwWindowHintString(int hint, const char* value) GLFWAPI void glfwWindowHintString(int hint, const char* value)
{ {
assert(value != NULL); assert(value != NULL);