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
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(¬ifyToken);
|
|
|
|
while (GetMessage(&msg, NULL, 0, 0))
|
|
{
|
|
if (!TranslateAccelerator(msg.hwnd, haccel, &msg))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
}
|
|
|
|
gGpSto.NotificationUnhook(notifyToken);
|
|
|
|
CoUninitialize();
|
|
|
|
return(1);
|
|
}
|