home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR9 / WDOS0793.ZIP / GRAVES.ZIP / WINBUF.CPP < prev    next >
C/C++ Source or Header  |  1993-05-28  |  5KB  |  180 lines

  1. #include "winbuf.h"
  2.  
  3. // -------------------------------------------------------
  4. //  Constructor
  5. //
  6. //  bBufferedRedraw_ -- initial buffer redraw flag
  7. //
  8. TWinBuffered::TWinBuffered(PTWindowsObject AParent, 
  9.                            LPSTR           ATitle, 
  10.                            PTModule        AModule,
  11.                            BOOL            bBufferedRedraw_)
  12.              :TWindow(AParent, ATitle, AModule),
  13.               bBufferedRedraw(bBufferedRedraw_)
  14. {
  15.     //
  16.     //  Buffer isn't created until WMSize().
  17.     //
  18.     hbmBuffer = 0;
  19. }
  20.  
  21. // -------------------------------------------------------
  22. //  Destructor
  23. //
  24. TWinBuffered::~TWinBuffered()
  25. {
  26.     if(hbmBuffer) DeleteBitmap(hbmBuffer);
  27. }
  28.  
  29. // -------------------------------------------------------
  30. //  If our buffered redraw flag is set, free our existing
  31. //  bitmap buffer, if any, and try to allocate another 
  32. //  one.  If we get it, redraw its contents -- and at the
  33. //  same time, draw the window contents.  Validate the 
  34. //  window after the drawing is complete.
  35. //
  36. void TWinBuffered::WMSize(RTMessage msg)
  37. {
  38.     TWindow::WMSize(msg);
  39.  
  40.     size.cx = msg.LP.Lo;
  41.     size.cy = msg.LP.Hi;
  42.  
  43.     if(bBufferedRedraw == FALSE)
  44.         return; 
  45.  
  46.     //
  47.     // If no size, nothing to do.
  48.     //
  49.     if((size.cx == 0) && (size.cy == 0))
  50.         return;
  51.  
  52.     //
  53.     // If we have a buffer, delete it.
  54.     //
  55.     if(hbmBuffer)
  56.         DeleteBitmap(hbmBuffer);
  57.     
  58.     //
  59.     // Try to create a new one.
  60.     //
  61.     HDC hdcScreen = GetDC(0);
  62.     hbmBuffer = CreateCompatibleBitmap(hdcScreen,
  63.                                        size.cx, size.cy);
  64.     ReleaseDC(0, hdcScreen);
  65.  
  66.     //
  67.     // If no luck, we're done.
  68.     //
  69.     if(hbmBuffer == 0) 
  70.         return;
  71.  
  72.     //
  73.     // Clear the contents of the buffer with light gray.
  74.     //
  75.     HDC     hdcBuf  = CreateCompatibleDC(0);
  76.     HBITMAP hbmSave = SelectBitmap(hdcBuf, hbmBuffer);
  77.  
  78.     RECT rc;
  79.     rc.left = rc.top = 0;
  80.     rc.right = size.cx;
  81.     rc.bottom = size.cy;
  82.     FillRect(hdcBuf, &rc, GetStockBrush(LTGRAY_BRUSH));
  83.  
  84.     //
  85.     // Clear the window with light gray, then draw in the 
  86.     // window and buffer at the same time.
  87.     //
  88.     HDC hdcWin = GetDC(HWindow); 
  89.     FillRect(hdcWin, &rc, GetStockBrush(LTGRAY_BRUSH));
  90.     prvDraw(hdcBuf, hdcWin);
  91.  
  92.     //
  93.     // Clean up.
  94.     //
  95.     ReleaseDC(HWindow, hdcWin);
  96.     SelectBitmap(hdcBuf, hbmSave);
  97.     DeleteDC(hdcBuf);
  98.  
  99.     //
  100.     // Validate entire window so no WM_PAINT.
  101.     //
  102.     ValidateRgn(HWindow, NULL);
  103. }
  104.  
  105. // -------------------------------------------------------
  106. //  If we're supposed to do buffered redrawing and we've got
  107. //  a buffer, use the buffered drawing function, else use 
  108. //  the regular drawing function.
  109. //
  110. void TWinBuffered::Paint(HDC hdc, PAINTSTRUCT &ps)
  111. {
  112.     if(bBufferedRedraw && hbmBuffer)
  113.         prvDrawWithBuffer(hdc, ps);
  114.     else
  115.         prvDraw(hdc, 0);    // 0 indicates no second DC 
  116. }
  117.  
  118. // -------------------------------------------------------
  119. //  Use BitBlt() to copy all or part of our buffer to the 
  120.  
  121. //  DC provided.  Use the rcPaint member of the PAINTSTRUCT
  122. //  to figure out how much to draw.
  123. //
  124. void TWinBuffered::prvDrawWithBuffer(HDC         hdc, 
  125.                                      PAINTSTRUCT &ps)
  126. {
  127.     //
  128.     //  Create a DC that's compatible with the one that's
  129.     //  passed in, then select our buffer bitmap into it.
  130.     //
  131.     HDC     hdcLocal = CreateCompatibleDC(hdc);
  132.     HBITMAP hbmSave  = SelectBitmap(hdcLocal, hbmBuffer);
  133.     
  134.     //
  135.     //  Copy the required portion from the buffer to the DC.
  136.     //
  137.     RECT &rc = ps.rcPaint;
  138.     int nWidth  = rc.right-rc.left;
  139.     int nHeight = rc.bottom-rc.top;
  140.  
  141.     BitBlt(hdc,                 // dest DC
  142.            rc.left, rc.top,     // dest upper left corner
  143.            nWidth, nHeight,     // dest size
  144.            hdcLocal,            // source DC
  145.            rc.left, rc.top,     // source upper left corner
  146.            SRCCOPY);
  147.  
  148.     //
  149.     //  Clean up.
  150.     //
  151.     SelectBitmap(hdcLocal, hbmSave);
  152.     DeleteDC(hdcLocal);
  153. }
  154.  
  155. // ---------------------------------------------------------
  156. //  Turn buffering on or off.  If it's turned on, force a 
  157. //  redraw by sending a dummy WM_SIZE message to ourselves.
  158. //  If turned off, force a redraw with InvalidateRect().
  159. //
  160. void TWinBuffered::SetbBufferedRedraw(BOOL b)
  161. {
  162.     bBufferedRedraw = b;
  163.  
  164.     if(b) {
  165.         RECT rc;
  166.         GetClientRect(HWindow, &rc);
  167.         SendMessage(HWindow,
  168.                     WM_SIZE,
  169.                     (WPARAM)0,
  170.                     MAKELPARAM(rc.right, rc.bottom));
  171.     } else {
  172.         if(hbmBuffer) {
  173.             DeleteBitmap(hbmBuffer);
  174.             hbmBuffer = 0;
  175.             InvalidateRect(HWindow, NULL, TRUE);
  176.         }
  177.     }
  178. }
  179.  
  180.