windows-nt/Source/XPSP1/NT/multimedia/opengl/test/demos/viewer/viewer.c
2020-09-26 16:20:57 +08:00

241 lines
5.3 KiB
C

/******************************Module*Header*******************************\
* Module Name: viewer.c
*
* Main window.
*
* Created: 14-Mar-1995 23:42:08
* Author: Gilman Wong [gilmanw]
*
* Copyright (c) 1995 Microsoft Corporation
*
\**************************************************************************/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "global.h"
#include "glwindow.h"
// Window functions.
void MyCreateWindows(HINSTANCE);
long FAR PASCAL MainWndProc(HWND, UINT, WPARAM, LPARAM);
// Global window handles. Always handy to have around.
HINSTANCE ghInstance;
HWND hwndMain = (HWND) NULL;
HWND hwndList = (HWND) NULL;
/******************************Public*Routine******************************\
* WinMain
*
* Main loop.
*
* History:
* 15-Dec-1994 -by- Gilman Wong [gilmanw]
* Wrote it.
\**************************************************************************/
int WINAPI
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
SCENE *scene;
MyCreateWindows(hInstance);
MyCreateGLWindow(hInstance, lpCmdLine);
while ( GetMessage(&msg, (HWND) NULL, (UINT) NULL, (UINT) NULL) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
/******************************Public*Routine******************************\
* MyCreateWindows
*
* Setup the windows.
*
* History:
* 15-Dec-1994 -by- Gilman Wong [gilmanw]
* Wrote it.
\**************************************************************************/
void MyCreateWindows(HINSTANCE hInstance)
{
WNDCLASS wc;
RECT rcl;
ghInstance = hInstance;
// Register and create the main window, which contains the info listbox.
wc.style = 0;
wc.lpfnWndProc = MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, "ViewerIcon");
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "MainWClass";
RegisterClass(&wc);
hwndMain = CreateWindow(
"MainWClass",
"3D Viewer",
WS_OVERLAPPEDWINDOW|WS_MAXIMIZE,
0,
0,
300,
768,
NULL,
NULL,
hInstance,
NULL
);
if (hwndMain)
{
ShowWindow(hwndMain, SW_NORMAL);
UpdateWindow(hwndMain);
// Create the list box to fill the main window.
GetClientRect(hwndMain, &rcl);
hwndList = CreateWindow(
"LISTBOX",
"3D Viewer Info",
WS_CHILD | WS_VISIBLE | WS_VSCROLL
| WS_HSCROLL | LBS_NOINTEGRALHEIGHT,
rcl.left, rcl.top,
(rcl.right - rcl.left), (rcl.bottom - rcl.top),
hwndMain,
NULL,
hInstance,
NULL
);
if (hwndList)
{
SendMessage(
hwndList,
WM_SETFONT,
(WPARAM) GetStockObject(ANSI_FIXED_FONT),
(LPARAM) FALSE
);
LBreset();
ShowWindow(hwndList, SW_NORMAL);
UpdateWindow(hwndList);
}
}
}
/******************************Public*Routine******************************\
* MainWndProc
*
* WndProc for the main window. List box is maintained here.
*
* History:
* 15-Dec-1994 -by- Gilman Wong [gilmanw]
* Wrote it.
\**************************************************************************/
long FAR PASCAL MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
RECT rcl;
long lRet = 0;
// Process window message.
switch (message)
{
case WM_SIZE:
lRet = DefWindowProc(hwndList, message, wParam, lParam);
GetClientRect(hwndMain, &rcl);
MoveWindow(
hwndList,
rcl.left, rcl.top,
(rcl.right - rcl.left), (rcl.bottom - rcl.top),
TRUE
);
UpdateWindow(hwndList);
break;
case WM_KEYDOWN:
switch (wParam)
{
case VK_ESCAPE: // <ESC> is quick exit
PostMessage(hwnd, WM_DESTROY, 0, 0);
break;
default:
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
lRet = DefWindowProc(hwnd, message, wParam, lParam);
break;
}
return lRet;
}
/******************************Public*Routine******************************\
* LBprintf
*
* ListBox printf implementation.
*
* History:
* 15-Dec-1994 -by- Gilman Wong [gilmanw]
* Wrote it.
\**************************************************************************/
void LBprintf(PCH msg, ...)
{
va_list ap;
char buffer[256];
va_start(ap, msg);
vsprintf(buffer, msg, ap);
SendMessage(hwndList, LB_ADDSTRING, (WPARAM) 0, (LPARAM) buffer);
SendMessage(hwndList, WM_SETREDRAW, (WPARAM) TRUE, (LPARAM) 0);
InvalidateRect(hwndList, NULL, TRUE);
UpdateWindow(hwndList);
va_end(ap);
}
/******************************Public*Routine******************************\
* LBreset
*
* Reset ListBox state (clear).
*
* History:
* 15-Dec-1994 -by- Gilman Wong [gilmanw]
* Wrote it.
\**************************************************************************/
void LBreset()
{
SendMessage(hwndList, LB_RESETCONTENT, (WPARAM) FALSE, (LPARAM) 0);
}