Files
UnrealEngine/Engine/Source/ThirdParty/MaterialX/MaterialX-1.38.10/source/MaterialXRenderHw/SimpleWindowWindows.cpp
2025-05-18 13:04:45 +08:00

123 lines
3.2 KiB
C++

//
// Copyright Contributors to the MaterialX Project
// SPDX-License-Identifier: Apache-2.0
//
#if defined(_WIN32)
#include <MaterialXRenderHw/SimpleWindow.h>
#include <MaterialXRenderHw/WindowWrapper.h>
#include <string>
MATERIALX_NAMESPACE_BEGIN
SimpleWindow::SimpleWindow() :
_width(0),
_height(0)
{
// Give a unique ID to this window.
//
static unsigned int windowCount = 1;
_id = windowCount;
windowCount++;
// Generate a unique string for our window class.
sprintf_s(_windowClassName, "_SW_%u", _id);
}
// No-op window procedure
LRESULT CALLBACK NoOpProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CLOSE:
case WM_DESTROY:
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
break;
}
return 0;
}
bool SimpleWindow::initialize(const char* title,
unsigned int width, unsigned int height,
void* /*applicationShell*/)
{
HINSTANCE hInstance = GetModuleHandle(NULL);
// Basic windows class structure
//
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC) NoOpProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance; // Set the instance to this application
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL; // No background required
wc.lpszMenuName = NULL; // No menu required
wc.lpszClassName = _windowClassName;
if (!RegisterClass(&wc))
{
_id = 0;
return false;
}
// Window style and extended style
//
DWORD dwStyle = WS_OVERLAPPEDWINDOW;
DWORD dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
// Set the rectangle of the client area.
RECT WindowRect;
WindowRect.left = (long) 0;
WindowRect.top = (long) 0;
WindowRect.right = (long) width;
WindowRect.bottom = (long) height;
// Calculate the exact window size (including border) so that the
// client area has the desired dimensions.
//
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);
// Attempt to create the window.
HWND hWnd = CreateWindowEx(dwExStyle, _windowClassName, title,
dwStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
0, 0, // Window position
WindowRect.right - WindowRect.left, // Window width (including borders)
WindowRect.bottom - WindowRect.top, // Window height (including borders/title bar)
NULL, // No parent window
NULL, // No menu
hInstance, // Instance
NULL); // Don't pass anything To WM_CREATE
if (!hWnd)
{
_id = 0;
return false;
}
_windowWrapper = WindowWrapper::create(hWnd);
return true;
}
SimpleWindow::~SimpleWindow()
{
HWND hWnd = _windowWrapper->externalHandle();
if (hWnd)
{
_windowWrapper->release();
}
DestroyWindow(hWnd);
UnregisterClass(_windowClassName, GetModuleHandle(NULL));
}
MATERIALX_NAMESPACE_END
#endif