/***********************************************************************
File: TextWnd.c
Abstract:
This module contains functions which deal with the Text window. This
includes a function to print to said window, and scroll.
Contents:
RefreshText() -- Redraws text in the bottom of the Text message window
lstrdup() -- same as strdup() but for LPSTR's
PrintTextLine() -- Prints a string to the text message window, scrolls
TextWndProc() -- Windows message processing loop for text message window
************************************************************************/
#include "winmaze.h"
#include "mazproto.h"
#include "net.h"
#include <mmsystem.h>
#include <string.h>
#define MAX_TEXT_LINES 80
LPSTR cText[MAX_TEXT_LINES];
TEXTMETRIC tmTextInfo;
int iMaxNumLines, // Number of lines that will fit in the TextWnd display.
iCurLine, // Line # in the text display we're on.
iTextLines; // # of lines of text which are valid in cText.
/*=====================================================================
Function: RefreshText()
Inputs: none
Outputs: none
Abstract:
RefreshText() is responsible for drawing the bottom n lines of the
display, however many can fit into it. This should only be called when
a clipping region is in effect and has already been cleared.
======================================================================*/
void RefreshText(
)
{
HDC hDC;
int i;
hDC = GetDC(hWndText);
iCurLine = 0;
for(i=0;i<iMaxNumLines;i++) {
if ((iTextLines -(iMaxNumLines-i)) >= 0) {
TextOut(hDC,10,iCurLine * tmTextInfo.tmHeight + 2,
cText[iTextLines-(iMaxNumLines-i)],
lstrlen(cText[iTextLines-(iMaxNumLines-i)]));
iCurLine++;
}
}
ReleaseDC(hWndText,hDC);
}
/*=====================================================================
Function: lstrdup()
Inputs: String to duplicate
Outputs:Returns a copy of the string.
Abstract:
Same as strdup, but works with LPSTR's
======================================================================*/
LPSTR lstrdup(
LPSTR s
)
{
HGLOBAL hMem;
LPSTR lpRet;
hMem = GlobalAlloc(GHND,lstrlen(s)+1);
lpRet = GlobalLock(hMem);
lstrcpy(lpRet,s);
return(lpRet);
}
/*=====================================================================
Function: PrintTextLine()
Inputs: Line of text to print
Outputs: none
Abstract:
PrintTextLine will print a line of text to the text display window, and
scroll as necessary.
======================================================================*/
void PrintTextLine(
LPSTR cLine
)
{
HDC hDC;
int i;
RECT rScroll;
HGLOBAL hMem;
hDC = GetDC(hWndText);
//
// If we already have MAX_TEXT_LINES of text remembered,
// we need to zap one to make room for the new line.
//
if (iTextLines == MAX_TEXT_LINES) {
hMem = (HGLOBAL) GlobalHandle(SELECTOROF(cText[0]));
GlobalUnlock(hMem);
GlobalFree(hMem);
for(i=0;i<MAX_TEXT_LINES-1;i++) {
cText[i] = cText[i+1];
}
iTextLines--;
}
//
// Copy the line to be displayed into our buffer
//
cText[iTextLines++] = lstrdup(cLine);
//
// Scroll if necessary
//
if (iCurLine >= iMaxNumLines) {
GetClientRect(hWndText,&rScroll);
rScroll.top += 2;
ScrollWindow(hWndText,0,-tmTextInfo.tmHeight,&rScroll,&rScroll);
UpdateWindow(hWndText);
iCurLine--;
}
TextOut(hDC,10,iCurLine * tmTextInfo.tmHeight + 2,
cText[iTextLines-1],
lstrlen(cText[iTextLines-1]));
iCurLine++;
ReleaseDC(hWndText,hDC);
return;
}
/*=====================================================================
Function: TextWndProc()
Inputs: Standard windows entrypoint parms
Outputs: success
Abstract:
This is the main procedure to take care of drawing, resizing etc.
the text message window.
======================================================================*/
LONG FAR PASCAL TextWndProc(
HWND hWnd,
UINT Message,
WPARAM wParam,
LPARAM lParam
)
{
PAINTSTRUCT ps;
HDC hDC;
int i;
HGLOBAL hMem;
switch (Message) {
case WM_CREATE:
for(i=0;i<MAX_TEXT_LINES;i++) {
cText[i] = (LPSTR) NULL;
// hMem = GlobalAlloc(GHND,sizeof(char));
// cText[i] = GlobalLock(hMem);
// cText[i][0] = '\0';
}
iTextLines = iCurLine = 0;
hDC = GetDC(hWnd);
if(!GetTextMetrics(hDC,&tmTextInfo)) {
MessageBox((HWND)NULL,GetStringRes(IDS_GETTXTMTRCSFAIL),
"TextWndProc",MB_ICONEXCLAMATION|MB_APPLMODAL);
}
ReleaseDC(hWnd,hDC);
GetClientRect(hWnd,&rText);
iMaxNumLines = (rText.bottom - rText.top-5)/tmTextInfo.tmHeight;
break;
case WM_KEYDOWN:
SendMessage(hWndMaze,WM_KEYDOWN,wParam,lParam);
break;
case WM_MOVE:
break;
case WM_SIZE:
GetClientRect(hWnd,&rText);
iMaxNumLines = (rText.bottom - rText.top - 5)/tmTextInfo.tmHeight;
RefreshText();
break;
case WM_PAINT:
GetClientRect(hWnd,&rText);
hDC = BeginPaint(hWnd, &ps);
SetBkMode(hDC, OPAQUE);
RefreshText();
EndPaint(hWnd, &ps);
break;
case WM_CLOSE:
for (i=0; i<iTextLines ; i++) {
if (cText[i] != NULL) {
hMem = (HGLOBAL) GlobalHandle(SELECTOROF(cText[i]));
GlobalUnlock(hMem);
GlobalFree(hMem);
}
}
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, Message, wParam, lParam);
}
return(0);
}