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

Windows编程

开发平台:

Visual C++

  1. //+---------------------------------------------------------------------------
  2. //
  3. //  Microsoft Windows
  4. //  Copyright (C) Microsoft Corporation, 1992 - 1995.
  5. //
  6. //  File:       bitmaps.cxx
  7. //
  8. //  Contents:   bitmap helper functions
  9. //
  10. //  Classes:
  11. //
  12. //  Functions:  DDBChangeColor
  13. //              LoadAndStretch
  14. //
  15. //  History:    6-24-94   stevebl   Created
  16. //
  17. //----------------------------------------------------------------------------
  18. #include <windows.h>
  19. #include "bitmaps.h"
  20. //+---------------------------------------------------------------------------
  21. //
  22. //  Function:   LoadAndStretch
  23. //
  24. //  Synopsis:   Loads a bitmap from our resources, and creates a bitmap
  25. //              "array."  The red portions of the bitmap are considered
  26. //              clear.  Each resource consists of two bitmaps side by
  27. //              side:  an "open folder" and a "closed folder".  These
  28. //              bitmaps are turned into 4 bitmaps:  two selected, and
  29. //              two unselected bitmaps.
  30. //
  31. //  Arguments:  [hinst]        - instance containing the bitmap
  32. //              [hbmpDest]     - destination bitmap array
  33. //              [lpszResource] - name of the bitmap resource
  34. //              [cxBitmap]     - width to stretch to
  35. //              [cyBitmap]     - height to stretch to
  36. //              [crHigh]       - color of the highlighted background
  37. //              [crNorm]       - color of the normal background
  38. //
  39. //  Returns:    TRUE on success.
  40. //              FALSE on failure.
  41. //
  42. //  History:    6-24-94   stevebl   Stolen and modified from original DFView
  43. //
  44. //----------------------------------------------------------------------------
  45. BOOL LoadAndStretch (
  46.     HINSTANCE hinst,
  47.     HBITMAP hbmpDest,
  48.     LPTSTR lpszResource,
  49.     UINT cxBitmap,
  50.     UINT cyBitmap,
  51.     COLORREF crHigh,
  52.     COLORREF crNorm)
  53. {
  54.     HBITMAP hbmpOld1, hbmpOld2, hbmp;
  55.     BITMAP bm;
  56.     int i;
  57.     HDC hdcDest = CreateCompatibleDC(NULL);
  58.     HDC hdcSrc = CreateCompatibleDC(NULL);
  59.     if (NULL == hdcDest || NULL == hdcSrc)
  60.     {
  61.         DeleteDC(hdcSrc);
  62.         DeleteDC(hdcDest);
  63.         return(FALSE);
  64.     }
  65.     for (i=0;  i < 2;  i++)
  66.     {
  67.         hbmp = LoadBitmap(hinst, lpszResource);
  68.         if (NULL == hbmp)
  69.         {
  70.             DeleteDC(hdcSrc);
  71.             DeleteDC(hdcDest);
  72.             return FALSE;
  73.         }
  74.         DDBChangeColor(hbmp, RGB (255,0,0), ((i == 0) ? crHigh : crNorm));
  75.         GetObject(hbmp, sizeof (bm), &bm);
  76.         hbmpOld1 = (HBITMAP) SelectObject(hdcDest, hbmpDest);
  77.         hbmpOld2 = (HBITMAP) SelectObject(hdcSrc, hbmp);
  78.         SetStretchBltMode(hdcDest, COLORONCOLOR);
  79.         StretchBlt(
  80.             hdcDest,
  81.             i * cxBitmap * 2,
  82.             0,
  83.             cxBitmap * 2,
  84.             cyBitmap,
  85.             hdcSrc,
  86.             0,
  87.             0,
  88.             bm.bmWidth,
  89.             bm.bmHeight,
  90.             SRCCOPY);
  91.         SelectObject(hdcDest, hbmpOld1);
  92.         SelectObject(hdcSrc,  hbmpOld2);
  93.         DeleteObject(hbmp);
  94.     }
  95.     DeleteDC(hdcSrc);
  96.     DeleteDC(hdcDest);
  97.     return TRUE;
  98. }
  99. //+---------------------------------------------------------------------------
  100. //
  101. //  Function:   DDBChangeColor
  102. //
  103. //  Synopsis:   Change a particular color in a bitmap to another color.
  104. //              Strategy is to create a monochrome mask, where each pixel
  105. //              in the source bitmap that matches the color we're converting
  106. //              from is set to white (1), and all other colors to black.
  107. //              We then Blt this mask into the original bitmap, with a ROP
  108. //              code that does:
  109. //
  110. //                (~Mask&Source) | (~Mask&Pattern)
  111. //
  112. //              where Pattern is the color we're changing to.
  113. //
  114. //              In other words, wherever the Mask is 1, we want to put the pattern;
  115. //              wherever the Mask is 0, we want to leave the source alone.  By
  116. //              using a Truth Table, you'll find that this ROP code is equivalent
  117. //              to DSPDxax or ROP code 0x00E20746.
  118. //
  119. //              For info on figuring out ROP codes given a set of boolean ops,
  120. //              check out the Windows 3.0 SDK, Reference Volume 2, chapter 11.
  121. //
  122. //  Arguments:  [hBitmap] - bitmap handle
  123. //              [crFrom]  - color to change
  124. //              [crTo]    - new color
  125. //
  126. //  Returns:    TRUE on success.  FALSE on failur
  127. //
  128. //  History:    6-24-94   stevebl   Stolen from original DFView code
  129. //
  130. //----------------------------------------------------------------------------
  131. BOOL DDBChangeColor (HBITMAP hBitmap, COLORREF crFrom, COLORREF crTo)
  132. {
  133.     register int cx, cy;
  134.     BITMAP       bm;
  135.     HDC          hdcBmp, hdcMask;
  136.     HBITMAP      hbmMask, hbmOld1, hbmOld2;
  137.     HBRUSH       hBrush, hbrOld;
  138.     if (!hBitmap)
  139.           return FALSE;
  140.     GetObject (hBitmap, sizeof (bm), &bm);
  141.     cx = bm.bmWidth;
  142.     cy = bm.bmHeight;
  143.     hbmMask = CreateBitmap(cx, cy, 1, 1, NULL);
  144.     hdcMask = CreateCompatibleDC(NULL);
  145.     hdcBmp = CreateCompatibleDC(NULL);
  146.     hBrush = CreateSolidBrush(crTo);
  147.     if (!hdcMask || !hdcBmp || !hBrush || !hbmMask)
  148.     {
  149.         DeleteObject(hbmMask);
  150.         DeleteObject(hBrush);
  151.         DeleteDC(hdcMask);
  152.         DeleteDC(hdcBmp);
  153.         return FALSE;
  154.     }
  155.     hbmOld1 = (HBITMAP) SelectObject (hdcBmp,  hBitmap);
  156.     hbmOld2 = (HBITMAP) SelectObject (hdcMask, hbmMask);
  157.     hbrOld  = (HBRUSH) SelectObject (hdcBmp, hBrush);
  158.     SetBkColor(hdcBmp, crFrom);
  159.     BitBlt(hdcMask, 0, 0, cx, cy, hdcBmp,  0, 0, SRCCOPY);
  160.     SetBkColor(hdcBmp, RGB(255,255,255));
  161.     BitBlt(hdcBmp,  0, 0, cx, cy, hdcMask, 0, 0, DSPDxax);
  162.     SelectObject(hdcBmp,  hbrOld);
  163.     SelectObject(hdcBmp,  hbmOld1);
  164.     SelectObject(hdcMask, hbmOld2);
  165.     DeleteDC(hdcBmp);
  166.     DeleteDC(hdcMask);
  167.     DeleteObject(hBrush);
  168.     DeleteObject(hbmMask);
  169.     return TRUE;
  170. }