windows-nt/Source/XPSP1/NT/base/mvdm/wow16/test/hello/hello.c
2020-09-26 16:20:57 +08:00

170 lines
3.8 KiB
C

/*++
*
* Hello.c
* Simple 16-bit Windows App
*
* Copyright (c) 1991, Microsoft Corporation
*
* History:
* Created 27-Jan-1991 by Jeff Parsons (jeffpar)
* From "Programming Windows" by C. Petzold, p.16-19
*
* Updated 02-May-1991 by Jeff Parsons (jeffpar)
* To serve as a bare-bones shell (user-friendly of course)
--*/
#include <windows.h>
#include "hello.h"
#define BUTTON_REVERSI 1 // button IDs
#define BUTTON_WIDTH 80 // width and height for all buttons
#define BUTTON_HEIGHT 20
BOOL FAR PASCAL EnumWindowFunc(HWND hwnd, DWORD lParam)
{
char achTmp[80];
wsprintf(achTmp, "HELLO: Window %04x enumerated\n", hwnd);
OutputDebugString(achTmp);
return TRUE; // return non-zero to continue enumeration
}
LONG FAR PASCAL WndProc(HWND hwnd, WORD wMsg, int wParam, LONG lParam)
{
HDC hdc;
PAINTSTRUCT ps;
HANDLE hTask;
char achTmp[80];
static char achTextOut[] = "The User-Friendly WOW Shell";
switch(wMsg) {
case WM_CREATE:
CreateWindow("Button",
"Reversi",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
8,
8 + BUTTON_REVERSI*24,
BUTTON_WIDTH,
BUTTON_HEIGHT,
hwnd,
BUTTON_REVERSI,
((LPCREATESTRUCT)lParam)->hInstance, NULL);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 8, 8, achTextOut, sizeof(achTextOut)-1);
EndPaint(hwnd, &ps);
return 0;
case WM_COMMAND:
// See if the command is from a menu
if (LOWORD(lParam) == 0) {
switch(wParam) {
case IDM_BREAKPOINT:
_asm int 3
// Hokey timing test -JTP
GetParent(hwnd);
{
int i;
for (i=0; i<10000; i++)
GetParent(hwnd);
}
return 0;
case IDM_ENUMWINDOWS:
OutputDebugString("HELLO: Enumerating windows\n");
EnumWindows(EnumWindowFunc, 0x10000001);
return 0;
case IDM_ENUMCHILDWINDOWS:
wsprintf(achTmp, "HELLO: Enumerating child windows for hwnd %04x\n", hwnd);
OutputDebugString(achTmp);
EnumChildWindows(hwnd, EnumWindowFunc, 0x10000002);
return 0;
case IDM_ENUMTASKWINDOWS:
hTask = GetCurrentTask();
wsprintf(achTmp, "HELLO: Enumerating task windows for task %04x\n", hTask);
OutputDebugString(achTmp);
EnumTaskWindows(hTask, EnumWindowFunc, 0x10000003);
return 0;
}
}
// The command must be a button notification
// (or something else I'm too ignorant to know about -JTP)
else {
if (wParam == BUTTON_REVERSI) {
// _asm int 3
WinExec("REVERSI.EXE", SW_SHOWNORMAL);
// _asm int 3
}
return 0;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, wMsg, wParam, lParam);
}
int PASCAL WinMain(HANDLE hInstance,
HANDLE hPrevInstance, LPSTR lpszCmd, int iCmd)
{
HWND hwnd;
MSG msg;
WNDCLASS wc;
static char szApp[] = "WOW";
if (!hPrevInstance) {
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground= GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = szApp;
wc.lpszClassName= szApp;
if (!RegisterClass(&wc))
return 0;
}
hwnd = CreateWindow(
szApp, // window class name
szApp, // window caption
(WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME) | WS_VISIBLE,
50, 50, 250, 128,
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL // creation parameters
);
if (!hwnd)
return 0;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}