Files
qt5-legatus-legacy/Lts/Application/THP/THP-Starter/thp_starter.cpp
T
2026-08-13 18:33:10 +02:00

150 lines
4.3 KiB
C++
Executable File

/**
* @RDE_HEADER@
* Small wrapper to automatically start thp_viewer
* $Id$
* $HeadURL$
* $Author$
* Created by Christian Ehrlicher, SLSE, 2016-02-29
*/
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
static void* getGLExtensionFuncPtr(const char *funcName, const char *fallbackFuncName)
{
void* ptr = wglGetProcAddress(funcName);
if (ptr)
return ptr;
return wglGetProcAddress(fallbackFuncName);
}
static int checkOpenGL(HWND hWnd)
{
HDC hDC = GetDC( hWnd );
PIXELFORMATDESCRIPTOR pfd;
ZeroMemory( &pfd, sizeof( pfd ) );
pfd.nSize = sizeof( pfd );
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER |
PFD_SWAP_EXCHANGE;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cRedBits = 8;
pfd.cGreenBits = 8;
pfd.cBlueBits = 8;
pfd.cAlphaBits = 8;
pfd.cDepthBits = 0;
pfd.iLayerType = PFD_MAIN_PLANE;
int iFormat = ChoosePixelFormat( hDC, &pfd );
if( !SetPixelFormat( hDC, iFormat, &pfd ) ) {
DWORD dw = GetLastError();
int ret = MessageBox(NULL,
L"Your system does not support some mandatory OpenGL Functions.\nThe THP-Viewer may not display all things correct!\nDo you really want to start the THP-viewer?",
L"THP-Viewer startup",
MB_ICONWARNING|MB_YESNO);
if(ret == IDNO) {
ReleaseDC( hWnd, hDC );
return 1;
}
}
HGLRC hRC = wglCreateContext( hDC );
DWORD dw = wglMakeCurrent( hDC, hRC );
void *_glCompressedTexImage2D = getGLExtensionFuncPtr( "glCompressedTexImage2D", "glCompressedTexImage2DARB" );
if(!_glCompressedTexImage2D) {
int ret = MessageBox(NULL,
L"Your system does not support the mandatory OpenGL Function glCompressedTexImage2D.\nThe THP-Viewer may not display all things correct!\nDo you really want to start the THP-viewer?",
L"THP-Viewer startup",
MB_ICONWARNING|MB_YESNO);
if(ret == IDNO) {
wglDeleteContext( hRC );
ReleaseDC( hWnd, hDC );
return 1;
}
}
wglDeleteContext( hRC );
ReleaseDC( hWnd, hDC );
return 0;
}
static int startThpViewer(HINSTANCE hInstance)
{
TCHAR fn[MAX_PATH*10];
DWORD len = GetModuleFileName(hInstance, fn, sizeof(fn));
for(int i = len - 1; i >= 0; --i) {
if(fn[i] == '\\')
break;
fn[i] = '\0';
}
wcscat(fn, L"thp\\thp_viewer.exe");
STARTUPINFO si; ZeroMemory(&si, sizeof(si));
PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi));
si.cb = sizeof(si);
DWORD ret = CreateProcess(fn,
NULL, // lpCommandLine
NULL, // lpProcessAttributes
NULL, // lpThreadAttributes
NULL, // bInheritHandles
0, // dwCreationFlags
NULL, // lpEnvironment
NULL, // lpCurrentDirectory
&si, // lpStartupInfo
&pi); // lpProcessInformation
if(ret == 0) {
MessageBox(NULL,
L"Error starting the THP-Viewer!",
L"THP-Viewer startup",
MB_ICONWARNING|MB_OK);
return 1;
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc( hWnd, message, wParam, lParam );
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASS wc;
ZeroMemory( &wc, sizeof(wc) );
// register window class
wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = L"THP_Viewer_startup";
RegisterClass( &wc );
// create main window
HWND hWnd = CreateWindow(L"THP_Viewer_startup",
L"THP-Viewer startup",
WS_CAPTION | WS_POPUPWINDOW,
0, 0, 256, 256,
NULL, NULL, hInstance, NULL );
int iRet = checkOpenGL(hWnd);
if(iRet != 0)
return iRet;
return startThpViewer(hInstance);
}