TEXTWND.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /***********************************************************************
  2. File:   TextWnd.c
  3. Abstract:
  4.     This module contains functions which deal with the Text window. This
  5.     includes a function to print to said window, and scroll.
  6. Contents:
  7.     RefreshText() -- Redraws text in the bottom of the Text message window
  8.     lstrdup() -- same as strdup() but for LPSTR's
  9.     PrintTextLine() -- Prints a string to the text message window, scrolls
  10.     TextWndProc() -- Windows message processing loop for text message window
  11. ************************************************************************/
  12. #include "winmaze.h"
  13. #include "mazproto.h"
  14. #include "net.h"
  15. #include <mmsystem.h>
  16. #include <string.h>
  17. #define MAX_TEXT_LINES 80
  18. LPSTR cText[MAX_TEXT_LINES];
  19. TEXTMETRIC tmTextInfo;
  20. int iMaxNumLines,       // Number of lines that will fit in the TextWnd display.
  21.     iCurLine,           // Line # in the text display we're on.
  22.     iTextLines;         // # of lines of text which are valid in cText.
  23. /*=====================================================================
  24. Function: RefreshText()
  25. Inputs: none
  26. Outputs: none
  27. Abstract:
  28.     RefreshText() is responsible for drawing the bottom n lines of the
  29.     display, however many can fit into it. This should only be called when
  30.     a clipping region is in effect and has already been cleared.
  31. ======================================================================*/
  32. void RefreshText(
  33.     )
  34. {
  35.     HDC hDC;
  36.     int i;
  37.     hDC = GetDC(hWndText);
  38.     iCurLine = 0;
  39.     for(i=0;i<iMaxNumLines;i++) {
  40.         if ((iTextLines -(iMaxNumLines-i)) >= 0) {
  41.             TextOut(hDC,10,iCurLine * tmTextInfo.tmHeight + 2,
  42.                     cText[iTextLines-(iMaxNumLines-i)],
  43.                     lstrlen(cText[iTextLines-(iMaxNumLines-i)]));
  44.             iCurLine++;
  45.             }
  46.         }
  47.     ReleaseDC(hWndText,hDC);
  48. }
  49. /*=====================================================================
  50. Function: lstrdup()
  51. Inputs: String to duplicate
  52. Outputs:Returns a copy of the string.
  53. Abstract:
  54.     Same as strdup, but works with LPSTR's
  55. ======================================================================*/
  56. LPSTR lstrdup(
  57.     LPSTR s
  58.     )
  59. {
  60.     HGLOBAL hMem;
  61.     LPSTR lpRet;
  62.     hMem = GlobalAlloc(GHND,lstrlen(s)+1);
  63.     lpRet = GlobalLock(hMem);
  64.     lstrcpy(lpRet,s);
  65.     return(lpRet);
  66. }
  67. /*=====================================================================
  68. Function: PrintTextLine()
  69. Inputs: Line of text to print
  70. Outputs: none
  71. Abstract:
  72.     PrintTextLine will print a line of text to the text display window, and
  73.     scroll as necessary.
  74. ======================================================================*/
  75. void PrintTextLine(
  76.     LPSTR cLine
  77.     )
  78. {
  79.     HDC hDC;
  80.     int i;
  81.     RECT rScroll;
  82.     HGLOBAL hMem;
  83.     hDC = GetDC(hWndText);
  84.     //
  85.     // If we already have MAX_TEXT_LINES of text remembered,
  86.     // we need to zap one to make room for the new line.
  87.     //
  88.     if (iTextLines == MAX_TEXT_LINES) {
  89.         hMem = (HGLOBAL) GlobalHandle(SELECTOROF(cText[0]));
  90.         GlobalUnlock(hMem);
  91.         GlobalFree(hMem);
  92.         for(i=0;i<MAX_TEXT_LINES-1;i++) {
  93.             cText[i] = cText[i+1];
  94.             }
  95.         iTextLines--;
  96.         }
  97.     //
  98.     // Copy the line to be displayed into our buffer
  99.     //
  100.     cText[iTextLines++] = lstrdup(cLine);
  101.     //
  102.     // Scroll if necessary
  103.     //
  104.     if (iCurLine >= iMaxNumLines) {
  105.         GetClientRect(hWndText,&rScroll);
  106.         rScroll.top += 2;
  107.         ScrollWindow(hWndText,0,-tmTextInfo.tmHeight,&rScroll,&rScroll);
  108.         UpdateWindow(hWndText);
  109.         iCurLine--;
  110.         }
  111.     TextOut(hDC,10,iCurLine * tmTextInfo.tmHeight + 2,
  112.             cText[iTextLines-1],
  113.             lstrlen(cText[iTextLines-1]));
  114.     iCurLine++;
  115.     ReleaseDC(hWndText,hDC);
  116.     return;
  117. }
  118. /*=====================================================================
  119. Function: TextWndProc()
  120. Inputs: Standard windows entrypoint parms
  121. Outputs: success
  122. Abstract:
  123.     This is the main procedure to take care of drawing, resizing etc.
  124.     the text message window.
  125. ======================================================================*/
  126. LONG FAR PASCAL TextWndProc(
  127.     HWND hWnd,
  128.     UINT Message,
  129.     WPARAM wParam,
  130.     LPARAM lParam
  131.     )
  132. {
  133.     PAINTSTRUCT ps;
  134.     HDC hDC;
  135.     int i;
  136.     HGLOBAL hMem;
  137.     switch (Message) {
  138.         case WM_CREATE:
  139.             for(i=0;i<MAX_TEXT_LINES;i++) {
  140.                 cText[i] = (LPSTR) NULL;
  141. //                hMem = GlobalAlloc(GHND,sizeof(char));
  142. //                cText[i] = GlobalLock(hMem);
  143. //                cText[i][0] = '';
  144.                 }
  145.             iTextLines = iCurLine = 0;
  146.             hDC = GetDC(hWnd);
  147.             if(!GetTextMetrics(hDC,&tmTextInfo)) {
  148.                 MessageBox((HWND)NULL,GetStringRes(IDS_GETTXTMTRCSFAIL),
  149.                            "TextWndProc",MB_ICONEXCLAMATION|MB_APPLMODAL);
  150.                 }
  151.             ReleaseDC(hWnd,hDC);
  152.             GetClientRect(hWnd,&rText);
  153.             iMaxNumLines = (rText.bottom - rText.top-5)/tmTextInfo.tmHeight;
  154.             break;
  155.         case WM_KEYDOWN:
  156.             SendMessage(hWndMaze,WM_KEYDOWN,wParam,lParam);
  157.             break;
  158.         case WM_MOVE:
  159.             break;
  160.         case WM_SIZE:
  161.             GetClientRect(hWnd,&rText);
  162.             iMaxNumLines = (rText.bottom - rText.top - 5)/tmTextInfo.tmHeight;
  163.             RefreshText();
  164.             break;
  165.         case WM_PAINT:
  166.             GetClientRect(hWnd,&rText);
  167.             hDC = BeginPaint(hWnd, &ps);
  168.             SetBkMode(hDC, OPAQUE);
  169.             RefreshText();
  170.             EndPaint(hWnd, &ps);
  171.             break;
  172.         case WM_CLOSE:
  173.             for (i=0; i<iTextLines ; i++) {
  174.                 if (cText[i] != NULL) {
  175.                     hMem = (HGLOBAL) GlobalHandle(SELECTOROF(cText[i]));
  176.                     GlobalUnlock(hMem);
  177.                     GlobalFree(hMem);
  178.                 }
  179.             }
  180.             DestroyWindow(hWnd);
  181.             break;
  182.         default:
  183.             return DefWindowProc(hWnd, Message, wParam, lParam);
  184.         }
  185.     return(0);
  186. }