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

  1. /*
  2.  *   ValidateRect
  3.  *   valrect.c
  4.  *
  5.  *   This program demonstrates the use of the ValidateRect function. The
  6.  *   ValidateRect function subtracts the given rectangle from the update
  7.  *   region, which marks that rectangle for painting. ValidateRect is called 
  8.  *   once in this program to cancel the effects of the InvalidateRect
  9.  *   function.  In effect I first set a dirty bit using the InvalidateRect
  10.  *   function.  This dirty bit tells windows that the area containing the
  11.  *   specified rectangle identified by the Rect parameter needs to be
  12.  *   repainted.  I clear the dirty bit with the ValidateRect function so
  13.  *   that the area containing the rectangle is not repainted.  InvalidateRect
  14.  *   is called a second time to demonstrate the effects of the first
  15.  *   ValidateRect function.
  16.  *
  17.  */
  18.  
  19. #include "windows.h"
  20.  
  21. long FAR PASCAL ValrectWndProc(HWND, unsigned, WORD, LONG);
  22.  
  23. /***************************************************************************/
  24.  
  25. /* Procedure called when the application is loaded for the first time */
  26. BOOL ValrectInit( hInstance )
  27. HANDLE hInstance;
  28. {
  29.     PWNDCLASS   pValrectClass;
  30.  
  31.     pValrectClass = (PWNDCLASS)LocalAlloc( LPTR, sizeof(WNDCLASS) );
  32.  
  33.     pValrectClass->hCursor        = LoadCursor( NULL, IDC_ARROW );
  34.     pValrectClass->hIcon          = LoadIcon( hInstance,NULL);
  35.     pValrectClass->lpszMenuName   = (LPSTR)NULL;
  36.     pValrectClass->lpszClassName  = (LPSTR)"ValidateRect";
  37.     pValrectClass->hbrBackground  = (HBRUSH)GetStockObject( WHITE_BRUSH );
  38.     pValrectClass->hInstance      = hInstance;
  39.     pValrectClass->style          = CS_HREDRAW | CS_VREDRAW;
  40.     pValrectClass->lpfnWndProc    = ValrectWndProc;
  41.  
  42.     if (!RegisterClass( (LPWNDCLASS)pValrectClass ) )
  43.         /* Initialization failed.
  44.          * Windows will automatically deallocate all allocated memory.
  45.          */
  46.         return FALSE;
  47.  
  48.     LocalFree( (HANDLE)pValrectClass );
  49.     return TRUE;        /* Initialization succeeded */
  50. }
  51. /***************************************************************************/
  52.  
  53. int PASCAL WinMain( hInstance, hPrevInstance, lpszCmdLine, cmdShow )
  54. HANDLE hInstance, hPrevInstance;
  55. LPSTR lpszCmdLine;
  56. int cmdShow;
  57. {
  58.     MSG   msg;
  59.     HWND  hWnd;
  60.     WORD  rectcolor = RGB(0x022,0x022,0x022);
  61.     HDC hDC;             /* handle to display context */
  62.     HBRUSH hMyBrush;      /* handle to brush */
  63.     RECT Rect;         /* structure to hold rectangle coordinates */
  64.  
  65.  
  66.          ValrectInit( hInstance );
  67.     hWnd = CreateWindow((LPSTR)"ValidateRect",
  68.                         (LPSTR)"ValidateRect",
  69.             WS_OVERLAPPEDWINDOW,
  70.             CW_USEDEFAULT,
  71.             CW_USEDEFAULT,
  72.             CW_USEDEFAULT,
  73.             CW_USEDEFAULT,
  74.             (HWND)NULL,       /* no parent */
  75.                         (HMENU)NULL,       /* use class menu */
  76.                         (HANDLE)hInstance, /* handle to window instance */
  77.                         (LPSTR)NULL        /* no params to pass on */
  78.                         );
  79.  
  80.     /* Make window visible according to the way the app is activated */
  81.     ShowWindow( hWnd, cmdShow );
  82.     UpdateWindow( hWnd );
  83.  
  84. /* ----------------------------------------------------------------------- */
  85. /* Begginning of the ValidateRect section */
  86.  
  87. /* create brush to fill rectangle with */
  88.    hMyBrush = CreateSolidBrush(rectcolor);
  89.  
  90. /* get handle to display context */
  91.    hDC = GetDC(hWnd);
  92.  
  93. /* select brush into display context */
  94.    SelectObject(hDC,hMyBrush);
  95.  
  96. /* draw a big rectangle so we can see InvalidateRect's effects */
  97.    Rectangle(hDC,5,5,400,200);
  98.  
  99. /* fill Rect with coordinate information for a small rectangle */
  100.    Rect.left = 10;
  101.    Rect.top  = 10;
  102.    Rect.right= 50;
  103.    Rect.bottom=50;
  104.  
  105.    MessageBox(hWnd,(LPSTR)"a small rectangle then ValidateRect the same \
  106. small rectangle.  InvalidateRect sets a dirty bit to redraw the rectangle \
  107. region.  ValidateRect clears the dirty bit so that a call to UpdateWindow \
  108. will not draw the small rectangle.",
  109.               (LPSTR)"I am about to InvalidateRect...",MB_OK);
  110.  
  111.  
  112. /* invalidate the rect.identified by Rect (TRUE param. causes erase) */
  113.    InvalidateRect(hWnd, (LPRECT)&Rect, (BOOL)TRUE);
  114.  
  115. /* Don't draw the rectangle (ie. remove it from the update region) */
  116.    ValidateRect(hWnd, (LPRECT)&Rect);  
  117.  
  118. /* call UpdateWindow so that draw will take place immediately */
  119.    UpdateWindow(hWnd);
  120.  
  121.  
  122.    MessageBox(hWnd,(LPSTR)"Notice that the small rectangle was not drawn",
  123.               (LPSTR)"Done",MB_OK);
  124.  
  125.    MessageBox(hWnd,(LPSTR)"the small rectangle again, but this time I'm not \
  126. going to cancel the effects of InvalidateRect with a call to ValidateRect.  \
  127. This time my call to UpdateWindow will draw the rectangle.",
  128.               (LPSTR)"I am about to InvalidateRect...",MB_OK);
  129.  
  130.    InvalidateRect(hWnd, (LPRECT)&Rect, (BOOL)TRUE);
  131.  
  132.    UpdateWindow(hWnd);
  133.  
  134.    ReleaseDC(hWnd, hDC);
  135.  
  136. /* End of the ValidateRect section */
  137. /* ----------------------------------------------------------------------- */
  138.  
  139.     /* Polling messages from event queue */
  140.     while (GetMessage((LPMSG)&msg, NULL, 0, 0)) {
  141.         TranslateMessage((LPMSG)&msg);
  142.         DispatchMessage((LPMSG)&msg);
  143.         }
  144.  
  145.     return (int)msg.wParam;
  146. }
  147. /***************************************************************************/
  148.  
  149. /* Procedures which make up the window class. */
  150. long FAR PASCAL ValrectWndProc( hWnd, message, wParam, lParam )
  151. HWND hWnd;
  152. unsigned message;
  153. WORD wParam;
  154. LONG lParam;
  155. {
  156.     PAINTSTRUCT ps;
  157.  
  158.     switch (message)
  159.     {
  160.     case WM_SYSCOMMAND:
  161.         switch (wParam)
  162.         {
  163.         default:
  164.             return DefWindowProc( hWnd, message, wParam, lParam );
  165.         }
  166.         break;
  167.  
  168.     case WM_DESTROY:
  169.         PostQuitMessage( 0 );
  170.         break;
  171.  
  172.     case WM_PAINT:
  173.         BeginPaint( hWnd, (LPPAINTSTRUCT)&ps );
  174.         EndPaint( hWnd, (LPPAINTSTRUCT)&ps );
  175.         break;
  176.  
  177.     default:
  178.         return DefWindowProc( hWnd, message, wParam, lParam );
  179.         break;
  180.     }
  181.     return(0L);
  182. }
  183.