TRIDEE.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:4k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //************************************************************************
  2. //**
  3. //**  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  4. //**  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
  5. //**  TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR
  6. //**  A PARTICULAR PURPOSE.
  7. //**
  8. //**  Copyright (C) 1993 - 1997 Microsoft Corporation. All Rights Reserved.
  9. //**
  10. //**  tridee.c
  11. //**
  12. //**  DESCRIPTION:
  13. //**    routines to draw 3d borders
  14. //**
  15. //************************************************************************
  16. #include <windows.h>
  17. #include <windowsx.h>
  18. #include "res.h"
  19. #include "tridee.h"
  20. // declare variables global to this module
  21. //
  22. static COLORREF crFace;
  23. static COLORREF crHilite;
  24. static COLORREF crShadow;
  25. static HBRUSH hBrFace = NULL;
  26. static HBRUSH hBrShadow = NULL;
  27. static HBRUSH hBrHilite = NULL;
  28. static BOOL   bIs3D = FALSE;
  29. static int    cUsers = 0;
  30. /*+ TrideeCreate
  31.  *
  32.  * Register a new client for the Tridee stuff.
  33.  *
  34.  * on the first client we create the brushes that we will need.
  35.  * on others we just release the useage count.
  36.  *
  37.  * this routine is intended to be called in the WM_CREATE case of the
  38.  * client.
  39.  *
  40.  *-=================================================================*/
  41. HBRUSH FAR PASCAL TrideeCreate(HWND hWnd)
  42. {
  43.    hWnd;
  44.    if(!cUsers++)
  45.    {
  46.       // create the button face brush, if we fail this,
  47.       // set the use count back to 0 and return failure to
  48.       // the caller.
  49.       //
  50.       crFace = GetSysColor(COLOR_BTNFACE);
  51.       crShadow = GetSysColor(COLOR_BTNSHADOW);
  52.       crHilite = GetSysColor(COLOR_BTNHIGHLIGHT);
  53.       hBrFace = CreateSolidBrush(crFace);
  54.       if(!hBrFace)
  55.       {
  56.          cUsers = 0;
  57.          return NULL;
  58.       }
  59.       // if the button face color is white, assume we are
  60.       // on a EGA or Mono system, and dont even try to create
  61.       // hilite and shadow brushes.
  62.       bIs3D = (crFace != RGB(255,255,255));
  63.       if (!bIs3D)
  64.          hBrShadow = hBrHilite = NULL;
  65.       else
  66.       {
  67.          // create brushes for the hilite and shadow
  68.          //
  69.          hBrShadow = CreateSolidBrush(crShadow);
  70.          hBrHilite = CreateSolidBrush(crHilite);
  71.       }
  72.    }
  73.    return hBrFace;
  74. }
  75. /*+ TrideeDestroy
  76.  *
  77.  * DeRegister a client for the tridee stuff.
  78.  *
  79.  * when the count of clients gets to 0, we destroy the brushes.
  80.  *
  81.  * this routine is intended to be used in the WM_DESTROY case of
  82.  * the client.
  83.  *
  84.  *-=================================================================*/
  85. BOOL FAR PASCAL TrideeDestroy(HWND hWnd)
  86. {
  87.    hWnd;
  88.    if(!--cUsers)
  89.    {
  90.       // free the GDI objects
  91.       if(hBrFace)
  92.          DeleteObject(hBrFace), hBrFace = NULL;
  93.       if(hBrHilite)
  94.          DeleteObject(hBrHilite), hBrHilite = NULL;
  95.       if(hBrShadow)
  96.          DeleteObject(hBrShadow), hBrShadow = NULL;
  97.    }
  98.    return TRUE;
  99. }
  100. /*+ TrideeWellShadow
  101.  *
  102.  * draw a well border just inside the supplied rectangle.
  103.  * (a well has a hilite on lower and right edges and shadow
  104.  * on upper and left)
  105.  *
  106.  * this routine does not fill the recangle, it merely paints
  107.  * the 'frame'
  108.  *
  109.  *-=================================================================*/
  110. VOID FAR PASCAL TrideeWellShadow(HDC hDC, LPRECT lprc)
  111. {
  112.    // draw the left and upper shadow
  113.    //
  114.    SelectObject(hDC, hBrShadow);
  115.    PatBlt(hDC, lprc->left, lprc->top, 2, 
  116.                      lprc->bottom - lprc->top -2, PATCOPY);
  117.    PatBlt(hDC, lprc->left, lprc->top, 
  118.                      lprc->right - lprc->left, 2, PATCOPY);
  119.    // now draw the bottom and right hilite
  120.    //
  121.    SelectObject(hDC, hBrHilite);
  122.    PatBlt(hDC, lprc->right-1, lprc->top+1,
  123.                 1, lprc->bottom - lprc->top -2, PATCOPY);
  124.    PatBlt(hDC, lprc->left+1, lprc->bottom-1,
  125.                 lprc->right -lprc->left-1, 1, PATCOPY);
  126. }