UIEFFECT.CPP
/* 
 * UIEFFECT.CPP 
 * 
 * Utility functions for drawing various graphical effects. 
 * 
 * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved 
 * 
 * Kraig Brockschmidt, Microsoft 
 * Internet  :  kraigb@microsoft.com 
 * Compuserve:  >INTERNET:kraigb@microsoft.com 
 */ 
 
 
#include "inoledll.h" 
 
//Hatch pattern brush bits 
static WORD g_wHatchBmp[]={0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88}; 
 
 
/* 
 * UIDrawHandles 
 * 
 * Purpose: 
 *  Draw handles or/and boundary around Container Object when selected 
 * 
 * Parameters: 
 *  pRect           Dimensions of Container Object 
 *  hDC             HDC of the site 
 *  dwFlags         DWORD specifying how to draw the handles. 
 *  cSize           UINT size of handle box 
 *  fDraw           BOOL draw if TRUE, erase if FALSE 
 * 
 * Return Value: 
 *  None 
 */ 
 
STDAPI_(void) UIDrawHandles(LPRECT pRect, HDC hDC, DWORD dwFlags, UINT cSize 
    , BOOL fDraw) 
    { 
HBRUSH  hBR; 
RECT    rc; 
int     bkmodeOld; 
BOOL    fInvert=(BOOL)(dwFlags & UI_HANDLES_USEINVERSE); 
 
CopyRect((LPRECT)&rc, pRect); 
 
bkmodeOld=SetBkMode(hDC, TRANSPARENT); 
 
if (dwFlags & UI_HANDLES_OUTSIDE) 
InflateRect((LPRECT)&rc, cSize - 1, cSize - 1); 
 
//Draw the handles inside the rectangle boundary 
DrawHandle(hDC, rc.left, rc.top, cSize, fInvert, fDraw); 
DrawHandle(hDC, rc.left, rc.top+(rc.bottom-rc.top-cSize)/2, cSize, fInvert, fDraw); 
DrawHandle(hDC, rc.left, rc.bottom-cSize, cSize, fInvert, fDraw); 
DrawHandle(hDC, rc.left+(rc.right-rc.left-cSize)/2, rc.top, cSize, fInvert, fDraw); 
DrawHandle(hDC, rc.left+(rc.right-rc.left-cSize)/2, rc.bottom-cSize, cSize, fInvert, fDraw); 
DrawHandle(hDC, rc.right-cSize, rc.top, cSize, fInvert, fDraw); 
DrawHandle(hDC, rc.right-cSize, rc.top+(rc.bottom-rc.top-cSize)/2, cSize, fInvert, fDraw); 
DrawHandle(hDC, rc.right-cSize, rc.bottom-cSize, cSize, fInvert, fDraw); 
 
if (!(dwFlags & UI_HANDLES_NOBORDER)) 
        { 
if (fDraw) 
hBR=(HBRUSH)GetStockObject(BLACK_BRUSH); 
else 
hBR=(HBRUSH)GetStockObject(WHITE_BRUSH); 
 
FrameRect(hDC, pRect, hBR); 
    } 
 
SetBkMode(hDC, bkmodeOld); 
    } 
 
 
 
/* 
 * DrawHandle 
 * 
 * Purpose: 
 *  Draw a handle box at the specified coordinate 
 * 
 * Parameters: 
 *  hDC             HDC to be drawn into 
 *  x, y            int upper left corner coordinate of the handle box 
 *  cSize           UINT size of handle box 
 *  fInvert         BOOL indicating to invert the rect or fill it 
 *  fDraw           BOOL draw if TRUE, erase if FALSE, 
 *                  ignored if fInvert is TRUE 
 * 
 * Return Value: 
 *  None 
 */ 
 
void DrawHandle(HDC hDC, int x, int y, UINT cSize, BOOL fInvert 
    , BOOL fDraw) 
    { 
HBRUSH  hBR; 
HBRUSH  hBROld; 
HPEN    hPen; 
HPEN    hPenOld; 
RECT    rc; 
 
if (!fInvert) 
        { 
if (fDraw) 
            { 
hPen=(HPEN)GetStockObject(BLACK_PEN); 
hBR=(HBRUSH)GetStockObject(BLACK_BRUSH); 
    } 
        else 
            { 
hPen=(HPEN)GetStockObject(WHITE_PEN); 
hBR=(HBRUSH)GetStockObject(WHITE_PEN); 
    } 
 
hPenOld=(HPEN)SelectObject(hDC, hPen); 
hBROld=(HBRUSH)SelectObject(hDC, hBR); 
Rectangle(hDC, x, y, x+cSize, y+cSize); 
SelectObject(hDC, hPenOld); 
SelectObject(hDC, hBROld); 
    } 
else 
        { 
rc.left=x; 
rc.top=y; 
rc.right=x + cSize; 
rc.bottom=y + cSize; 
InvertRect(hDC, (LPRECT)&rc); 
    } 
 
    return; 
    } 
 
 
 
/* 
 * UIDrawShading 
 * 
 * Purpose: 
 *  Draw a hatching across a rectangle, inside a rectangle, or 
 *  outside a rectangle. 
 * 
 * Parameters: 
 *  prc             LPRECT containing the rectangle. 
 *  hDC             HDC on which to draw. 
 *  dwFlags         DWORD specifying how to draw the shading. 
 *  cWidth          UINT width of the border to draw.  Ignored 
 *                  if dwFlags has UI_SHADE_FULLRECT. 
 * 
 * Return Value: 
 *  None 
 */ 
 
STDAPI_(void) UIDrawShading(LPRECT prc, HDC hDC, DWORD dwFlags, UINT cWidth) 
    { 
    HBRUSH      hBR; 
    HBRUSH      hBROld; 
    HBITMAP     hBM; 
    RECT        rc; 
    UINT        cx, cy; 
    COLORREF    crText; 
    COLORREF    crBk; 
    const DWORD dwROP=0x00A000C9L;  //DPa 
 
    if (NULL==prc || NULL==hDC) 
return; 
 
    hBM=CreateBitmap(8, 8, 1, 1, g_wHatchBmp); 
    hBR=CreatePatternBrush(hBM); 
    hBROld=(HBRUSH)SelectObject(hDC, hBR); 
 
    rc=*prc; 
    cx=rc.right-rc.left; 
    cy=rc.bottom-rc.top; 
 
    if (UI_SHADE_FULLRECT==dwFlags) 
        { 
        crText=SetTextColor(hDC, RGB(255, 255, 255)); 
        crBk=SetBkColor(hDC, RGB(0, 0, 0)); 
        PatBlt(hDC, rc.left, rc.top, cx, cy, dwROP); 
        } 
    else 
        { 
        if (UI_SHADE_BORDEROUT==dwFlags) 
            InflateRect((LPRECT)&rc, cWidth-1, cWidth-1); 
 
        crText=SetTextColor(hDC, RGB(255, 255, 255)); 
        crBk=SetBkColor(hDC, RGB(0, 0, 0)); 
        PatBlt(hDC, rc.left, rc.top, cx, cWidth, dwROP); 
        PatBlt(hDC, rc.left, rc.top, cWidth, cy, dwROP); 
        PatBlt(hDC, rc.right-cWidth, rc.top, cWidth, cy, dwROP); 
        PatBlt(hDC, rc.left, rc.bottom-cWidth, cx, cWidth, dwROP); 
        } 
 
    SetTextColor(hDC, crText); 
    SetBkColor(hDC, crBk); 
    SelectObject(hDC, hBROld); 
    DeleteObject(hBR); 
    DeleteObject(hBM); 
 
    return; 
    } 
 
 
 
 
/* 
 * UIShowObject 
 * 
 * Purpose: 
 *  Draw the ShowObject effect around an embedded or linked 
 *  object. 
 * 
 * Parameters: 
 *  prc             LPRECT to draw around. 
 *  hDC             HDC on which to draw. 
 *  fLink           BOOL specifying a linked (TRUE) or 
 *                  embedded (FALSE) object 
 * 
 * Return Value: 
 *  None 
 */ 
 
STDAPI_(void) UIShowObject(LPCRECT prc, HDC hDC, BOOL fLink) 
    { 
HPEN    hPen; 
HPEN    hPenOld; 
HBRUSH  hBROld; 
 
if (NULL==prc || NULL==hDC) 
return; 
 
hPen=fLink ? CreatePen(PS_DASH, 1, RGB(0,0,0)) 
        : (HPEN)GetStockObject(BLACK_PEN); 
 
if (!hPen) 
return; 
 
hPenOld=(HPEN)SelectObject(hDC, hPen); 
hBROld=(HBRUSH)SelectObject(hDC, GetStockObject(NULL_BRUSH)); 
 
Rectangle(hDC, prc->left, prc->top, prc->right, prc->bottom); 
 
SelectObject(hDC, hPenOld); 
SelectObject(hDC, hBROld); 
 
if (fLink) 
DeleteObject(hPen); 
 
    return; 
    }