home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / inole2 / inole / uieffect.cpp < prev    next >
C/C++ Source or Header  |  1995-05-03  |  6KB  |  253 lines

  1. /*
  2.  * UIEFFECT.CPP
  3.  *
  4.  * Utility functions for drawing various graphical effects.
  5.  *
  6.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  7.  *
  8.  * Kraig Brockschmidt, Microsoft
  9.  * Internet  :  kraigb@microsoft.com
  10.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  11.  */
  12.  
  13.  
  14. #include "inoledll.h"
  15.  
  16. //Hatch pattern brush bits
  17. static WORD g_wHatchBmp[]={0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88};
  18.  
  19.  
  20. /*
  21.  * UIDrawHandles
  22.  *
  23.  * Purpose:
  24.  *  Draw handles or/and boundary around Container Object when selected
  25.  *
  26.  * Parameters:
  27.  *  pRect           Dimensions of Container Object
  28.  *  hDC             HDC of the site
  29.  *  dwFlags         DWORD specifying how to draw the handles.
  30.  *  cSize           UINT size of handle box
  31.  *  fDraw           BOOL draw if TRUE, erase if FALSE
  32.  *
  33.  * Return Value:
  34.  *  None
  35.  */
  36.  
  37. STDAPI_(void) UIDrawHandles(LPRECT pRect, HDC hDC, DWORD dwFlags, UINT cSize
  38.     , BOOL fDraw)
  39.     {
  40.     HBRUSH  hBR;
  41.     RECT    rc;
  42.     int     bkmodeOld;
  43.     BOOL    fInvert=(BOOL)(dwFlags & UI_HANDLES_USEINVERSE);
  44.  
  45.     CopyRect((LPRECT)&rc, pRect);
  46.  
  47.     bkmodeOld=SetBkMode(hDC, TRANSPARENT);
  48.  
  49.     if (dwFlags & UI_HANDLES_OUTSIDE)
  50.         InflateRect((LPRECT)&rc, cSize - 1, cSize - 1);
  51.  
  52.     //Draw the handles inside the rectangle boundary
  53.     DrawHandle(hDC, rc.left, rc.top, cSize, fInvert, fDraw);
  54.     DrawHandle(hDC, rc.left, rc.top+(rc.bottom-rc.top-cSize)/2, cSize, fInvert, fDraw);
  55.     DrawHandle(hDC, rc.left, rc.bottom-cSize, cSize, fInvert, fDraw);
  56.     DrawHandle(hDC, rc.left+(rc.right-rc.left-cSize)/2, rc.top, cSize, fInvert, fDraw);
  57.     DrawHandle(hDC, rc.left+(rc.right-rc.left-cSize)/2, rc.bottom-cSize, cSize, fInvert, fDraw);
  58.     DrawHandle(hDC, rc.right-cSize, rc.top, cSize, fInvert, fDraw);
  59.     DrawHandle(hDC, rc.right-cSize, rc.top+(rc.bottom-rc.top-cSize)/2, cSize, fInvert, fDraw);
  60.     DrawHandle(hDC, rc.right-cSize, rc.bottom-cSize, cSize, fInvert, fDraw);
  61.  
  62.     if (!(dwFlags & UI_HANDLES_NOBORDER))
  63.         {
  64.         if (fDraw)
  65.             hBR=(HBRUSH)GetStockObject(BLACK_BRUSH);
  66.         else
  67.             hBR=(HBRUSH)GetStockObject(WHITE_BRUSH);
  68.  
  69.         FrameRect(hDC, pRect, hBR);
  70.         }
  71.  
  72.     SetBkMode(hDC, bkmodeOld);
  73.     }
  74.  
  75.  
  76.  
  77. /*
  78.  * DrawHandle
  79.  *
  80.  * Purpose:
  81.  *  Draw a handle box at the specified coordinate
  82.  *
  83.  * Parameters:
  84.  *  hDC             HDC to be drawn into
  85.  *  x, y            int upper left corner coordinate of the handle box
  86.  *  cSize           UINT size of handle box
  87.  *  fInvert         BOOL indicating to invert the rect or fill it
  88.  *  fDraw           BOOL draw if TRUE, erase if FALSE,
  89.  *                  ignored if fInvert is TRUE
  90.  *
  91.  * Return Value:
  92.  *  None
  93.  */
  94.  
  95. void DrawHandle(HDC hDC, int x, int y, UINT cSize, BOOL fInvert
  96.     , BOOL fDraw)
  97.     {
  98.     HBRUSH  hBR;
  99.     HBRUSH  hBROld;
  100.     HPEN    hPen;
  101.     HPEN    hPenOld;
  102.     RECT    rc;
  103.  
  104.     if (!fInvert)
  105.         {
  106.         if (fDraw)
  107.             {
  108.             hPen=(HPEN)GetStockObject(BLACK_PEN);
  109.             hBR=(HBRUSH)GetStockObject(BLACK_BRUSH);
  110.             }
  111.         else
  112.             {
  113.             hPen=(HPEN)GetStockObject(WHITE_PEN);
  114.             hBR=(HBRUSH)GetStockObject(WHITE_PEN);
  115.             }
  116.  
  117.         hPenOld=(HPEN)SelectObject(hDC, hPen);
  118.         hBROld=(HBRUSH)SelectObject(hDC, hBR);
  119.         Rectangle(hDC, x, y, x+cSize, y+cSize);
  120.         SelectObject(hDC, hPenOld);
  121.         SelectObject(hDC, hBROld);
  122.         }
  123.     else
  124.         {
  125.         rc.left=x;
  126.         rc.top=y;
  127.         rc.right=x + cSize;
  128.         rc.bottom=y + cSize;
  129.         InvertRect(hDC, (LPRECT)&rc);
  130.         }
  131.  
  132.     return;
  133.     }
  134.  
  135.  
  136.  
  137. /*
  138.  * UIDrawShading
  139.  *
  140.  * Purpose:
  141.  *  Draw a hatching across a rectangle, inside a rectangle, or
  142.  *  outside a rectangle.
  143.  *
  144.  * Parameters:
  145.  *  prc             LPRECT containing the rectangle.
  146.  *  hDC             HDC on which to draw.
  147.  *  dwFlags         DWORD specifying how to draw the shading.
  148.  *  cWidth          UINT width of the border to draw.  Ignored
  149.  *                  if dwFlags has UI_SHADE_FULLRECT.
  150.  *
  151.  * Return Value:
  152.  *  None
  153.  */
  154.  
  155. STDAPI_(void) UIDrawShading(LPRECT prc, HDC hDC, DWORD dwFlags, UINT cWidth)
  156.     {
  157.     HBRUSH      hBR;
  158.     HBRUSH      hBROld;
  159.     HBITMAP     hBM;
  160.     RECT        rc;
  161.     UINT        cx, cy;
  162.     COLORREF    crText;
  163.     COLORREF    crBk;
  164.     const DWORD dwROP=0x00A000C9L;  //DPa
  165.  
  166.     if (NULL==prc || NULL==hDC)
  167.         return;
  168.  
  169.     hBM=CreateBitmap(8, 8, 1, 1, g_wHatchBmp);
  170.     hBR=CreatePatternBrush(hBM);
  171.     hBROld=(HBRUSH)SelectObject(hDC, hBR);
  172.  
  173.     rc=*prc;
  174.     cx=rc.right-rc.left;
  175.     cy=rc.bottom-rc.top;
  176.  
  177.     if (UI_SHADE_FULLRECT==dwFlags)
  178.         {
  179.         crText=SetTextColor(hDC, RGB(255, 255, 255));
  180.         crBk=SetBkColor(hDC, RGB(0, 0, 0));
  181.         PatBlt(hDC, rc.left, rc.top, cx, cy, dwROP);
  182.         }
  183.     else
  184.         {
  185.         if (UI_SHADE_BORDEROUT==dwFlags)
  186.             InflateRect((LPRECT)&rc, cWidth-1, cWidth-1);
  187.  
  188.         crText=SetTextColor(hDC, RGB(255, 255, 255));
  189.         crBk=SetBkColor(hDC, RGB(0, 0, 0));
  190.         PatBlt(hDC, rc.left, rc.top, cx, cWidth, dwROP);
  191.         PatBlt(hDC, rc.left, rc.top, cWidth, cy, dwROP);
  192.         PatBlt(hDC, rc.right-cWidth, rc.top, cWidth, cy, dwROP);
  193.         PatBlt(hDC, rc.left, rc.bottom-cWidth, cx, cWidth, dwROP);
  194.         }
  195.  
  196.     SetTextColor(hDC, crText);
  197.     SetBkColor(hDC, crBk);
  198.     SelectObject(hDC, hBROld);
  199.     DeleteObject(hBR);
  200.     DeleteObject(hBM);
  201.  
  202.     return;
  203.     }
  204.  
  205.  
  206.  
  207.  
  208. /*
  209.  * UIShowObject
  210.  *
  211.  * Purpose:
  212.  *  Draw the ShowObject effect around an embedded or linked
  213.  *  object.
  214.  *
  215.  * Parameters:
  216.  *  prc             LPRECT to draw around.
  217.  *  hDC             HDC on which to draw.
  218.  *  fLink           BOOL specifying a linked (TRUE) or
  219.  *                  embedded (FALSE) object
  220.  *
  221.  * Return Value:
  222.  *  None
  223.  */
  224.  
  225. STDAPI_(void) UIShowObject(LPCRECT prc, HDC hDC, BOOL fLink)
  226.     {
  227.     HPEN    hPen;
  228.     HPEN    hPenOld;
  229.     HBRUSH  hBROld;
  230.  
  231.     if (NULL==prc || NULL==hDC)
  232.         return;
  233.  
  234.     hPen=fLink ? CreatePen(PS_DASH, 1, RGB(0,0,0))
  235.         : (HPEN)GetStockObject(BLACK_PEN);
  236.  
  237.     if (!hPen)
  238.         return;
  239.  
  240.     hPenOld=(HPEN)SelectObject(hDC, hPen);
  241.     hBROld=(HBRUSH)SelectObject(hDC, GetStockObject(NULL_BRUSH));
  242.  
  243.     Rectangle(hDC, prc->left, prc->top, prc->right, prc->bottom);
  244.  
  245.     SelectObject(hDC, hPenOld);
  246.     SelectObject(hDC, hBROld);
  247.  
  248.     if (fLink)
  249.         DeleteObject(hPen);
  250.  
  251.     return;
  252.     }
  253.