home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / win_lrn / string / stjust.c < prev    next >
C/C++ Source or Header  |  1988-08-10  |  5KB  |  156 lines

  1. /*
  2. Function(s) demonstrated in this program: SetTextJustification
  3. Compiler version: 5.1
  4. Description: This program removes leading spaces from the given string,
  5.              counts the number of spaces left, removes and subtracts the
  6.              trailing spaces, and then justifies the remaining string to
  7.              zero and eighty.
  8. */
  9.  
  10. #include <windows.h>
  11.  
  12. long FAR PASCAL WndProc ( HWND, unsigned, WORD, LONG );
  13. extern LPSTR FAR PASCAL lstrcpy ( LPSTR, LPSTR );
  14. extern int   FAR PASCAL lstrlen ( LPSTR );
  15. void Justify ( HDC );
  16.  
  17. static char szAppName [] = "STJUST" ;
  18. static char szFuncName [] = "SetTextJustification" ;
  19.  
  20. int PASCAL WinMain (hInstance, hPrevInstance, lpszCmdLine, nCmdShow)
  21. HANDLE      hInstance;
  22. HANDLE      hPrevInstance;
  23. LPSTR       lpszCmdLine;
  24. int         nCmdShow;
  25. {
  26.      HWND        hWnd;
  27.      WNDCLASS    wndclass;
  28.      MSG         msg;
  29.  
  30.      if (!hPrevInstance) {
  31.           wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  32.           wndclass.lpfnWndProc   = WndProc ;
  33.           wndclass.cbClsExtra    = 0 ;
  34.           wndclass.cbWndExtra    = 0 ;
  35.           wndclass.hInstance     = hInstance ;
  36.           wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  37.           wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  38.           wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
  39.           wndclass.lpszMenuName  = NULL ;
  40.           wndclass.lpszClassName = szAppName ;
  41.  
  42.           if (!RegisterClass (&wndclass))
  43.                return FALSE ;
  44.           }
  45.  
  46.      hWnd = CreateWindow (szAppName,            /* window class name       */
  47.                     szFuncName,                 /* window caption          */
  48.                     WS_OVERLAPPEDWINDOW,        /* window style            */
  49.                     CW_USEDEFAULT,              /* initial x position      */
  50.                     0,                          /* initial y position      */
  51.                     CW_USEDEFAULT,              /* initial x size          */
  52.                     0,                          /* initial y size          */
  53.                     NULL,                       /* parent window handle    */
  54.                     NULL,                       /* window menu handle      */
  55.                     hInstance,                  /* program instance handle */
  56.                     NULL) ;                     /* create parameters       */
  57.  
  58.      ShowWindow (hWnd, nCmdShow) ;
  59.      UpdateWindow (hWnd) ;
  60.  
  61.      while (GetMessage(&msg, NULL, 0, 0))
  62.      {
  63.       TranslateMessage(&msg);
  64.       DispatchMessage(&msg);
  65.      } 
  66.      return (msg.wParam) ;     
  67. }
  68.  
  69. long FAR PASCAL WndProc (hWnd, iMessage, wParam, lParam)
  70. HWND     hWnd;
  71. unsigned iMessage;
  72. WORD     wParam;
  73. LONG     lParam;
  74. {
  75.    HDC         hDC;
  76.    PAINTSTRUCT ps;
  77.  
  78.    switch(iMessage)
  79.       {
  80.       case WM_PAINT:
  81.          hDC = BeginPaint(hWnd, (LPPAINTSTRUCT)&ps);
  82.          Justify ( hDC );
  83.          EndPaint(hWnd, (LPPAINTSTRUCT)&ps);
  84.          break;
  85.       case WM_DESTROY:
  86.          PostQuitMessage(0);
  87.          break;
  88.       default:
  89.          return DefWindowProc (hWnd, iMessage, wParam, lParam) ;
  90.       }
  91.    return (0L); 
  92. }
  93.  
  94. void Justify ( hDC )
  95. HDC   hDC;
  96. {
  97.    TEXTMETRIC  tmText;
  98.    DWORD       dwExtent;
  99.    char        szJustifyString [80];
  100.    int         nBreakCount;
  101.    int         nElement;
  102.    int         nIndex;
  103.  
  104.    lstrcpy ( (LPSTR)szJustifyString,
  105.       (LPSTR)"    This string is justified between 0 and 80.   \0" );
  106.  
  107.    GetTextMetrics ( hDC, (LPTEXTMETRIC)&tmText );
  108.  
  109.    nBreakCount = 0;
  110.    nElement = 0;
  111.  
  112.                                                  /* Removing leading spaces */
  113.    while ( szJustifyString [ nElement ]  == ' ' &&
  114.       szJustifyString [ nElement ] != '\0' )
  115.       {
  116.       for ( nIndex = 0; nIndex < lstrlen ( (LPSTR)szJustifyString );
  117.        nIndex++ )
  118.          szJustifyString [ nIndex ] = szJustifyString [ nIndex + 1 ];
  119.       }
  120.  
  121.                                                /* Counting remaining spaces */
  122.    do
  123.       {
  124.       while ( szJustifyString [ nElement ] != '\0' &&
  125.          szJustifyString [ nElement++ ] != ' ');
  126.       if ( szJustifyString [ nElement ] == '\0' )
  127.          break;
  128.  
  129.       nBreakCount++;
  130.                                           /* Clearing error out of dwExtent */
  131.       SetTextJustification ( hDC, 0, 0 );
  132.       dwExtent = GetTextExtent ( hDC, (LPSTR)szJustifyString,
  133.          lstrlen ( (LPSTR)szJustifyString ) - 1 );
  134.       }
  135.    while ( LOWORD ( dwExtent ) < tmText.tmAveCharWidth * 80 );
  136.  
  137.                                                 /* Removing trailing spaces */
  138.    nBreakCount--;
  139.    nElement = lstrlen ( (LPSTR)szJustifyString );
  140.    while ( szJustifyString [ nElement ]  == ' ' && nElement != 0 )
  141.       {
  142.       nElement--;
  143.       nBreakCount--;
  144.       }
  145.                                           /* Clearing error out of dwExtent */
  146.    SetTextJustification ( hDC, 0, 0 );    
  147.                                         /* Justifing string szJustifyString */
  148.    dwExtent = GetTextExtent ( hDC, (LPSTR)szJustifyString,
  149.       lstrlen ( (LPSTR)szJustifyString ) - 1 );
  150.    SetTextJustification ( hDC, tmText.tmAveCharWidth * 80 -
  151.       (int)LOWORD ( dwExtent ), nBreakCount );
  152.  
  153.    TextOut ( hDC, 0 , 0 + (int)HIWORD ( dwExtent ), (LPSTR)szJustifyString,
  154.       lstrlen ( (LPSTR)szJustifyString ) );
  155. }
  156.