%source
#include "windows.h"
#include "%l.h"

long FAR PASCAL %cWndProc(HWND, unsigned, WORD, LONG);
BOOL FAR PASCAL TextEnterBoxFunc(HWND, unsigned, WORD, LONG);


static    HBRUSH  hbrBlack;
static    HANDLE  hAccelTable;
static    HANDLE  hInst;

HWND	  hWindow;


char	%ltext[LINESIZE];

/*
Standard Windows feature.  About box tells you something about the
application
*/

BOOL FAR PASCAL About( hDlg, message, wParam, lParam )
HWND            hDlg;
unsigned        message;
WORD            wParam;
LONG            lParam;
{
    if (message == WM_COMMAND) {

        EndDialog( hDlg, TRUE );
        return TRUE;
        }
    else if (message == WM_INITDIALOG)
        return TRUE;
    else return FALSE;
}


%cPaint(hDC)
HDC hDC;
{
	TextOut(hDC,0,0,%ltext,strlen(%ltext));	
}



%cCommand(hWnd, id)
HWND hWnd;
int id;
{
	HDC	 hDC;
	FARPROC     lpprocAbout;
	char	 wbuffer[80];

	switch (id) {
		case ID_EXIT:	
			exit(id);				
			break;

		case ID_ABOUT:
			lpprocAbout = MakeProcInstance ((FARPROC)About, hInst);
    			DialogBox(hInst, (LPSTR)"About", hWnd, lpprocAbout);
			FreeProcInstance((FARPROC)lpprocAbout);
            		break;

		case ID_%u:
			GetText(hWnd);
			break;

		default:	
			break;
	}
}


/* Procedure called every time a new instance of the application
** is created */

long FAR PASCAL WinMain(hInstance, hPrevInstance, lpszCmdLine, cmdShow)
HANDLE hInstance, hPrevInstance;
LPSTR  lpszCmdLine;
int    cmdShow;
{
	MSG   msg;
	HWND  hWnd;
	HMENU hMenu;
	int i;

	if (!hPrevInstance) {
    		if (!%cInit(hInstance))
        		return FALSE;
    	}
        else {
        	GetInstanceData(hPrevInstance, (PSTR)&hbrBlack, sizeof(hbrBlack));
    		GetInstanceData(hPrevInstance, (PSTR)&hAccelTable, sizeof(hAccelTable));
    	}

	hWnd = CreateWindow((LPSTR) "%c",
        	            (LPSTR) "%c",
                	    WS_OVERLAPPEDWINDOW,
		  	    CW_USEDEFAULT, 	
			    CW_USEDEFAULT, 	
			    CW_USEDEFAULT, 	
			    CW_USEDEFAULT, 	
	                    (HWND)NULL,
        	            (HMENU)NULL,
                	    (HANDLE)hInstance,
	                    (LPSTR)NULL);
	/* initialize various things */

	hWindow = hWnd;
 	hInst = hInstance;

	/*
	Code to append About box to system menu removed here
	The About box is now the user's responsibility
	*/

	ShowWindow(hWnd, cmdShow);
	UpdateWindow(hWnd);

	/*
	This is the classic loop
	*/

	while (GetMessage((LPMSG)&msg, NULL, 0, 0)) {
    		if (TranslateAccelerator(hWnd, hAccelTable, (LPMSG)&msg) == 0) {
        		TranslateMessage((LPMSG)&msg);
        		DispatchMessage((LPMSG)&msg);
        	}
    	}
	exit(msg.wParam);
}

int %cInit(hInstance)
HANDLE hInstance;
{
	PWNDCLASS   p%cClass;

    	/* set up some default brushes */
	hbrBlack = GetStockObject(BLACK_BRUSH);

	p%cClass = (PWNDCLASS)LocalAlloc(LPTR, sizeof(WNDCLASS));
	p%cClass->hCursor  = LoadCursor(NULL, IDC_ARROW);
	p%cClass->hIcon    = LoadIcon(hInstance, (LPSTR)"%c");
	p%cClass->lpszMenuName = (LPSTR)"MainMenu";
	p%cClass->lpszClassName   = (LPSTR)"%c";
	p%cClass->hbrBackground   = NULL;
	p%cClass->hInstance       = hInstance;
	p%cClass->style         = CS_VREDRAW | CS_HREDRAW;
	p%cClass->lpfnWndProc = %cWndProc;

	if (!RegisterClass((LPWNDCLASS)p%cClass))
    	    return FALSE;

	LocalFree((HANDLE)p%cClass);
	hAccelTable = LoadAccelerators(hInstance, (LPSTR)"%caccel");
	return TRUE;
}

/* Procedures which make up the window class. */
long FAR PASCAL %cWndProc(hWnd, message, wParam, lParam)
HWND       hWnd;
unsigned   message;
WORD       wParam;
LONG       lParam;
{
	PAINTSTRUCT  ps;
	RECT        rect;
	HBRUSH      hbr, hbrOld;
	POINT	    pt;

	pt = MAKEPOINT(lParam);

	switch (message)
	    {
    		case WM_SYSCOMMAND:
        		switch (wParam) {
            			default:
                			return(DefWindowProc(hWnd, message, wParam, lParam));
                			break;
            		}
        		break;

	    	case WM_CREATE:
        		break;

    		case WM_LBUTTONDOWN:
    		case WM_RBUTTONDOWN:
    		case WM_LBUTTONDBLCLK:
    		case WM_RBUTTONDBLCLK:
			break;
    		case WM_MOUSEMOVE:
			break;
    		case WM_LBUTTONUP:
	        case WM_RBUTTONUP:
			break;
    		case WM_DESTROY:
		        PostQuitMessage(0);
		        break;

 		case WM_COMMAND:
		        %cCommand(hWnd, wParam);
		        break;

		case WM_PAINT:
		        BeginPaint(hWnd, (LPPAINTSTRUCT)&ps);
			%cPaint(ps.hdc);
		        EndPaint(hWnd, (LPPAINTSTRUCT)&ps);
		        break;

		case WM_ERASEBKGND:
		        GetClientRect(hWnd, (LPRECT)&rect);
		        hbr = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
		        hbrOld = SelectObject((HDC)wParam, hbr);
		        FillRect((HDC)wParam, (LPRECT)&rect, hbr);
		        SelectObject((HDC)wParam, hbrOld);
		        DeleteObject(hbr);
		        break;


    		default:
		        return(DefWindowProc(hWnd, message, wParam, lParam));
		        break;
    		}

	return(0L);	
}

GetText(hWnd)
HWND hWnd;
{
	FARPROC lpprocTextEnterBoxFunc;
	BOOL 	i;

	lpprocTextEnterBoxFunc = MakeProcInstance ((FARPROC)TextEnterBoxFunc, hInst);
	i = DialogBox(hInst, (LPSTR)"TextEnterBox", hWnd, lpprocTextEnterBoxFunc);
	FreeProcInstance((FARPROC)lpprocTextEnterBoxFunc);

	if (i == TRUE) {	
		InvalidateRect (hWnd, (LPRECT) NULL, (BOOL) TRUE);
	}
}


BOOL FAR PASCAL TextEnterBoxFunc(hDlg, message, wParam, lParam)
HWND hDlg;
unsigned message;
WORD wParam;
LONG lParam;
{
	switch(message)
		{
		case WM_INITDIALOG:
			SetFocus(GetDlgItem(hDlg, ID_TEXT));
			return(FALSE);
			break;
		case WM_COMMAND:
			switch(wParam)
				{
				case ID_OK:
					GrabText(hDlg,%ltext,ID_TEXT,LINESIZE);
					EndDialog(hDlg, TRUE);
					return(TRUE);
					break;
				case ID_CANCEL:
					EndDialog(hDlg,FALSE);
					return(FALSE);
				default:
					return(FALSE);
			}
			break;
		default:
			return(FALSE);
			break;
	}				
}


GrabText(hDlg,name,id,size)
HWND hDlg;
char name[];
short id;
short size;
{
	short i;
	
	strcpy(name,"");
	i = GetDlgItemText(hDlg,id,(LPSTR)name, size);
 	name[i] = 0;


}
%end
%include
#define LINESIZE 80


/* Menu choice to display the About dialog box */

#define ID_ABOUT           0x100

/* Menu choice to display the text */

#define ID_%u	0x200

/* Menu choice to exit the application */

#define ID_EXIT		0x300

/* Dialog box control identifiers */

#define ID_ETEXT	0x400
#define ID_TEXT		0x401 
#define ID_OK		0x402
#define ID_CANCEL	0x403

%end
%def

NAME  %c
DESCRIPTION '%d'

CODE    MOVEABLE
DATA    MOVEABLE MULTIPLE

STUB    'WINSTUB.EXE'

EXETYPE WINDOWS

HEAPSIZE  1024
STACKSIZE 4096

EXPORTS
    %cWndProc       
    About    
    TextEnterBoxFunc	
%end
%resource
#include "windows.h"
#include "%l.h"

%l  ICON    %l.ico

MainMenu  MENU	
BEGIN
    POPUP "&File"
	BEGIN
	    MENUITEM "&Exit",	 			ID_EXIT 
	    MENUITEM "&About This Application",		ID_ABOUT
	END
    MENUITEM "&Get Text",				ID_%u
END		


About DIALOG LOADONCALL MOVEABLE DISCARDABLE 22, 17, 144, 85 
STYLE WS_POPUP | WS_DLGFRAME
BEGIN
    CTEXT "%c" 		                        -1, 38, 10, 68, 8
    ICON  "%l" 		                        -1,  9,  5, 18, 28
    CTEXT "%d" 			                -1,  0, 33, 144, 8
    CTEXT "Version 1.00"  	                -1,  0, 43, 144, 8
    CTEXT "Copyright (c) 1990 by %n" 		-1,  0, 53, 144, 9
    DEFPUSHBUTTON "Ok"                        ID_OK, 53, 67, 32, 14, WS_GROUP
END

TEXTENTERBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 66, 52, 155, 69
STYLE WS_DLGFRAME | WS_POPUP
BEGIN
	   CONTROL "Enter text:" ID_ETEXT, "static", SS_LEFT | WS_CHILD, 15, 10, 124, 16
	   CONTROL "" ID_TEXT, "edit", ES_LEFT | WS_BORDER | WS_TABSTOP | WS_CHILD, 15, 22, 126, 12
	   CONTROL "OK" ID_OK, "button", BS_DEFPUSHBUTTON | WS_TABSTOP | WS_CHILD, 30, 46, 31, 14
	   CONTROL "Cancel" ID_CANCEL, "button", BS_PUSHBUTTON | WS_TABSTOP | WS_CHILD, 87, 46, 31, 14
END
%end
%make
%l.obj: %l.c %l.h 
   cl -d -c -AM -Gsw -Oas -Zpe -Fl %l.obj %l.c

%l.exe: %l.obj %l.def 
    link %l , %l /align:16,%l/map, mlibcew libw ,%l.def;
    rc %l 

%end
