TEXTWND.C
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:
Windows编程
开发平台:
Visual C++
- /***********************************************************************
- 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] = ' ';
- }
- 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);
- }