Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

439 lines
9.7 KiB

/******************************Module*Header*******************************\
* Module Name: wndstuff.cpp
*
* This file contains the code to support a simple window that has
* a menu with a single item called "Test". When "Test" is selected
* vTest(HWND) is called.
*
* Created: 09-Dec-1992 10:44:31
* Author: Kirk Olynyk [kirko]
*
* Copyright (c) 1991 Microsoft Corporation
*
\**************************************************************************/
// for Win95 compile
#undef UNICODE
#undef _UNICODE
#include <windows.h>
#include <stdio.h>
#include <objbase.h>
#include <tchar.h>
//
// Where is IStream included from?
//
#define IStream int
#include <gdiplus.h>
using namespace Gdiplus;
#include "wndstuff.h"
HINSTANCE ghInstance;
HWND ghwndMain;
HWND ghwndDebug;
HWND ghwndList;
HBRUSH ghbrWhite;
VOID WINAPI
AltDebugEvent(
DebugEventLevel level,
CHAR *message)
{
OutputDebugStringA("AltDebugEvent: ");
OutputDebugStringA(message);
if (level == DebugEventLevelFatal)
{
DebugBreak();
}
}
GdiplusStartupOutput gGpSto;
// Because we have global initializers which call GDI+, GDI+ needs to be
// initialized before, and destroyed after, those constructors and destructors.
// Here goes:
#pragma warning( push )
#pragma warning( disable : 4073 )
#pragma code_seg( "MySeg" )
#pragma init_seg( lib )
class GdiplusInitHelper
{
public:
GdiplusInitHelper() : gpToken(0), Valid(FALSE)
{
// Use the non-defaults, to test the alternative code-path.
GdiplusStartupInput sti(AltDebugEvent, TRUE, TRUE);
if (GdiplusStartup(&gpToken, &sti, &gGpSto) == Ok)
{
Valid = TRUE;
}
else
{
MessageBox(0, _T("Engine didn't initialize"), _T("Uh oh"), MB_OK);
}
}
~GdiplusInitHelper()
{
if (Valid)
{
GdiplusShutdown(gpToken);
}
}
BOOL IsValid() { return Valid; }
private:
ULONG_PTR gpToken;
BOOL Valid;
};
GdiplusInitHelper gGdiplusInitHelper;
#pragma code_seg()
#pragma warning( pop )
/***************************************************************************\
* lMainWindowProc(hwnd, message, wParam, lParam)
*
* Processes all messages for the main window.
*
* History:
* 04-07-91 -by- KentD
* Wrote it.
\***************************************************************************/
LONG_PTR
lMainWindowProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam
)
{
PAINTSTRUCT ps;
switch (message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case MM_TEST:
Test(hwnd);
break;
default:
break;
}
break;
case WM_DESTROY:
DeleteObject(ghbrWhite);
PostQuitMessage(0);
return(DefWindowProc(hwnd, message, wParam, lParam));
default:
return(DefWindowProc(hwnd, message, wParam, lParam));
}
return(0);
}
/******************************Public*Routine******************************\
* DebugWndProc
*
* List box is maintained here.
*
\**************************************************************************/
LONG_PTR FAR PASCAL DebugWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
RECT rcl;
HDC hdc;
LONG_PTR lRet = 0;
// Process window message.
switch (message)
{
case WM_SIZE:
lRet = DefWindowProc(ghwndList, message, wParam, lParam);
GetClientRect(ghwndMain, &rcl);
MoveWindow(
ghwndList,
rcl.left, rcl.top,
(rcl.right - rcl.left), (rcl.bottom - rcl.top),
TRUE
);
UpdateWindow(ghwndList);
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, ...)
{
if (ghwndList)
{
va_list ap;
char buffer[256];
va_start(ap, msg);
vsprintf(buffer, msg, ap);
SendMessage(ghwndList, LB_ADDSTRING, (WPARAM) 0, (LPARAM) buffer);
SendMessage(ghwndList, WM_SETREDRAW, (WPARAM) TRUE, (LPARAM) 0);
InvalidateRect(ghwndList, NULL, TRUE);
UpdateWindow(ghwndList);
va_end(ap);
}
}
/******************************Public*Routine******************************\
* LBreset
*
* Reset ListBox state (clear).
*
* History:
* 15-Dec-1994 -by- Gilman Wong [gilmanw]
* Wrote it.
\**************************************************************************/
void LBreset()
{
if (ghwndList)
SendMessage(ghwndList, LB_RESETCONTENT, (WPARAM) FALSE, (LPARAM) 0);
}
/***************************************************************************\
* bInitApp()
*
* Initializes app.
*
* History:
* 04-07-91 -by- KentD
* Wrote it.
\***************************************************************************/
BOOL bInitApp(BOOL debug)
{
WNDCLASS wc;
ghbrWhite = CreateSolidBrush(RGB(0xFF,0xFF,0xFF));
wc.style = 0;
wc.lpfnWndProc = lMainWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = ghInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = ghbrWhite;
wc.lpszMenuName = _T("MainMenu");
wc.lpszClassName = _T("TestClass");
if (!RegisterClass(&wc))
{
return(FALSE);
}
ghwndMain =
CreateWindowEx(
0,
_T("TestClass"),
_T("Win32 Test"),
WS_OVERLAPPED |
WS_CAPTION |
WS_BORDER |
WS_THICKFRAME |
WS_MAXIMIZEBOX |
WS_MINIMIZEBOX |
WS_CLIPCHILDREN |
WS_VISIBLE |
WS_SYSMENU,
80,
70,
500,
500,
NULL,
NULL,
ghInstance,
NULL);
if (ghwndMain == NULL)
{
return(FALSE);
}
if (debug)
{
RECT rcl;
memset(&wc, 0, sizeof(wc));
wc.style = 0;
wc.lpfnWndProc = DebugWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = ghInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = ghbrWhite;
wc.lpszClassName = "DebugWClass";
RegisterClass(&wc);
ghwndDebug = CreateWindow(
"DebugWClass",
"Debug output",
WS_OVERLAPPEDWINDOW|WS_MAXIMIZE,
600,
70,
300,
500,
NULL,
NULL,
ghInstance,
NULL
);
if (ghwndDebug)
{
ShowWindow(ghwndDebug, SW_NORMAL);
UpdateWindow(ghwndDebug);
// Create the list box to fill the main window.
GetClientRect(ghwndDebug, &rcl);
ghwndList = CreateWindow(
"LISTBOX",
"Debug output",
WS_CHILD | WS_VISIBLE | WS_VSCROLL
| WS_HSCROLL | LBS_NOINTEGRALHEIGHT,
rcl.left, rcl.top,
(rcl.right - rcl.left), (rcl.bottom - rcl.top),
ghwndDebug,
NULL,
ghInstance,
NULL
);
if (ghwndList)
{
SendMessage(
ghwndList,
WM_SETFONT,
(WPARAM) GetStockObject(ANSI_FIXED_FONT),
(LPARAM) FALSE
);
LBreset();
ShowWindow(ghwndList, SW_NORMAL);
UpdateWindow(ghwndList);
}
}
}
SetFocus(ghwndMain);
return(TRUE);
}
/***************************************************************************\
* main(argc, argv[])
*
* Sets up the message loop.
*
* History:
* 04-07-91 -by- KentD
* Wrote it.
\***************************************************************************/
_cdecl
main(
INT argc,
PCHAR argv[])
{
MSG msg;
HACCEL haccel;
CHAR* pSrc;
CHAR* pDst;
BOOL wantDebugWindow = FALSE;
if (!gGdiplusInitHelper.IsValid())
{
return 0;
}
CoInitialize(NULL);
// Parse arguments
for (argc--, argv++ ; argc && '-' == **argv ; argc--, argv++ )
{
switch ( *(++(*argv)) )
{
case 'd':
case 'D':
wantDebugWindow = TRUE;
break;
}
}
ghInstance = GetModuleHandle(NULL);
if (!bInitApp(wantDebugWindow))
{
return(0);
}
haccel = LoadAccelerators(ghInstance, MAKEINTRESOURCE(1));
ULONG_PTR notifyToken;
gGpSto.NotificationHook(&notifyToken);
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, haccel, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
gGpSto.NotificationUnhook(notifyToken);
CoUninitialize();
return(1);
}