home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / m / ms3dctl.zip / DRAW3D.C < prev    next >
C/C++ Source or Header  |  1993-02-08  |  7KB  |  318 lines

  1. //
  2. // Sample 3D Drawing routines
  3. //  
  4. #include "windows.h"
  5. #include "draw3d.h"
  6. #include "memory.h"
  7.  
  8. // Windows Versions (Byte order flipped from GetWindowsVersion)
  9. #define ver30 0x0300      
  10.  
  11. typedef COLORREF CV;
  12. // CoLoR Table
  13. typedef struct
  14.     {
  15.     CV rgcv[ICVMAX];
  16.     } CLRT;
  17.  
  18.  
  19.  
  20. // BRush Table
  21. typedef struct
  22.     {
  23.     HBRUSH mpicvhbr[ICVBRUSHMAX];
  24.     } BRT;
  25.  
  26. int mpicvSysColor[] =
  27.     {
  28.     COLOR_BTNHIGHLIGHT,
  29.     COLOR_BTNFACE,
  30.     COLOR_BTNSHADOW,
  31.     COLOR_BTNTEXT,
  32.     COLOR_WINDOW,
  33.     COLOR_WINDOWTEXT,
  34.     COLOR_GRAYTEXT,
  35.     COLOR_WINDOWFRAME
  36.     };
  37.  
  38.  
  39. static BOOL InternalDraw3dColorChange(BOOL fForce);
  40. static VOID DeleteObjectNull(HANDLE FAR *ph);
  41. static VOID DeleteObjects(VOID);
  42. static VOID PatFill(HDC hdc, RC FAR *lprc);
  43.  
  44. /*-----------------------------------------------------------------------
  45. |   Draw3d Global ( Static ) Variables
  46. -----------------------------------------------------------------------*/
  47. CLRT clrt;
  48. BRT brt;    
  49. BOOL f3dDialogs;
  50. int cInited;
  51. WORD verWindows;
  52.  
  53. /*-----------------------------------------------------------------------
  54. |   Draw3d Utility routines
  55. -----------------------------------------------------------------------*/
  56. static VOID DeleteObjectNull(HANDLE FAR *ph)
  57.     {
  58.     if (*ph != NULL)
  59.         {
  60.         DeleteObject(*ph);
  61.         *ph = NULL;
  62.         }
  63.     }
  64.  
  65. static VOID DeleteObjects(VOID)
  66.     {
  67.     int icv;
  68.  
  69.     for(icv = 0; icv < ICVBRUSHMAX; icv++)
  70.         DeleteObjectNull(&brt.mpicvhbr[icv]);
  71.     }
  72.  
  73.  
  74. static VOID PatFill(HDC hdc, RC FAR *lprc)
  75.     {
  76.     PatBlt(hdc, lprc->xLeft, lprc->yTop, lprc->xRight-lprc->xLeft, lprc->yBot-lprc->yTop, PATCOPY);
  77.     }
  78.  
  79.        
  80. /*-----------------------------------------------------------------------
  81. |   Draw3dRec
  82. |
  83. |   Arguments:
  84. |       HDC hdc:    
  85. |       RC FAR *lprc:   
  86. |       LONG cvUpperLeft:  
  87. |       LONG cvLowerRight:  
  88. |       WORD grbit;
  89. |       
  90. |   Returns:
  91. |       
  92. -----------------------------------------------------------------------*/
  93. VOID Draw3dRec(HDC hdc, RC FAR *lprc, ICV icvUpperLeft, ICV icvLowerRight, DR3 dr3)
  94.     {
  95.     COLORREF cvSav;
  96.     RC rc;
  97.  
  98.     cvSav = SetBkColor(hdc, clrt.rgcv[icvUpperLeft]);
  99.  
  100.     // top
  101.     rc = *lprc;
  102.     rc.yBot = rc.yTop+1;
  103.     if (dr3 & DR3TOP)
  104.         ExtTextOut(hdc, 0, 0, ETO_OPAQUE, (LPRECT) &rc, 
  105.             (char far *) NULL, 0, (int far *) NULL);
  106.  
  107.     // left
  108.     rc.yBot = lprc->yBot;
  109.     rc.xRight = rc.xLeft+1;
  110.     if (dr3 & DR3LEFT)
  111.         ExtTextOut(hdc, 0, 0, ETO_OPAQUE, (LPRECT) &rc, 
  112.             (char far *) NULL, 0, (int far *) NULL);
  113.  
  114.     if (icvUpperLeft != icvLowerRight)
  115.         SetBkColor(hdc, clrt.rgcv[icvLowerRight]);
  116.  
  117.     // right
  118.     rc.xRight = lprc->xRight;
  119.     rc.xLeft = rc.xRight-1;
  120.     if (dr3 & DR3RIGHT)
  121.         ExtTextOut(hdc, 0, 0, ETO_OPAQUE, (LPRECT) &rc, 
  122.             (char far *) NULL, 0, (int far *) NULL);
  123.  
  124.     // bot
  125.     if (dr3 & DR3BOT)
  126.         {
  127.         rc.xLeft = lprc->xLeft;
  128.         rc.yTop = rc.yBot-1;
  129.         if (dr3 & DR3HACKBOTRIGHT)
  130.             rc.xRight -=2;
  131.         ExtTextOut(hdc, 0, 0, ETO_OPAQUE, (LPRECT) &rc, 
  132.             (char far *) NULL, 0, (int far *) NULL);
  133.         }
  134.  
  135.     SetBkColor(hdc, cvSav);
  136.     }
  137.  
  138. VOID Draw3dInsetRect(HDC hdc, RC FAR *prc, DR3 dr3)
  139.     {
  140.     RC rc;
  141.  
  142.     rc = *prc;
  143.     Draw3dRec(hdc, &rc, ICVWINDOWFRAME, ICVBTNFACE, dr3 & DR3ALL);
  144.     rc.xLeft--;
  145.     rc.yTop--;
  146.     rc.xRight++;
  147.     rc.yBot++;
  148.     Draw3dRec(hdc, &rc, ICVBTNSHADOW, ICVBTNHILITE, dr3);
  149.     }
  150.  
  151.  
  152. /*-----------------------------------------------------------------------
  153. |   Draw3dCtlColor
  154. |
  155. |       Common CTL_COLOR processor for 3d UITF dialogs & alerts.
  156. |
  157. |   Arguments:
  158. |
  159. |   Returns:
  160. |       appropriate brush if f3dDialogs.  Returns FALSE otherwise
  161. |
  162. -----------------------------------------------------------------------*/
  163. HBRUSH FAR PASCAL Draw3dCtlColor(UINT wm, WPARAM wParam, LPARAM lParam)
  164. {
  165.     if(f3dDialogs) {
  166.             SetTextColor((HDC) wParam, clrt.rgcv[ICVBTNTEXT]);
  167.             SetBkColor((HDC) wParam, clrt.rgcv[ICVBTNFACE]);
  168.             return brt.mpicvhbr[ICVBTNFACE];
  169.     }
  170.     return (HBRUSH) FALSE;
  171. }
  172.  
  173.  
  174. /*-----------------------------------------------------------------------
  175. |   Draw3dColorChange
  176. |   
  177. |       App calls this when it gets a WM_SYSCOLORCHANGE message
  178. |       
  179. |   Returns:
  180. |       TRUE if successful.
  181. |       
  182. -----------------------------------------------------------------------*/
  183. BOOL FAR PASCAL Draw3dColorChange(VOID)
  184.     {
  185.     return InternalDraw3dColorChange(FALSE);
  186.     }
  187.  
  188.  
  189. static BOOL InternalDraw3dColorChange(BOOL fForce)
  190.     {
  191.     ICV icv;
  192.     CLRT clrtNew;
  193.     BRT brtNew;
  194.  
  195.     if (!f3dDialogs)
  196.         return FALSE;
  197.  
  198.     for (icv = 0; icv < ICVMAX; icv++)
  199.         clrtNew.rgcv[icv] = GetSysColor(mpicvSysColor[icv]);
  200.  
  201.     if (verWindows == ver30)
  202.         clrtNew.rgcv[ICVBTNHILITE] = RGB(0xff, 0xff, 0xff);
  203.  
  204.     if (clrtNew.rgcv[ICVGRAYTEXT] == 0L || clrtNew.rgcv[ICVGRAYTEXT] == clrtNew.rgcv[ICVBTNFACE])
  205.         clrtNew.rgcv[ICVGRAYTEXT] = RGB(0x80, 0x80, 0x80);
  206.     if (clrtNew.rgcv[ICVGRAYTEXT] == clrtNew.rgcv[ICVBTNFACE])
  207.         clrtNew.rgcv[ICVGRAYTEXT] = 0L;
  208.  
  209.     if (fForce || _fmemicmp(&clrt, &clrtNew, sizeof(CLRT))) {
  210.         for (icv = 0; icv < ICVBRUSHMAX; icv++)
  211.             brtNew.mpicvhbr[icv] = CreateSolidBrush(clrtNew.rgcv[icv]);
  212.  
  213.         for (icv = 0; icv < ICVBRUSHMAX; icv++) {
  214.             if (brtNew.mpicvhbr[icv] == NULL) {
  215.                for (icv = 0; icv < ICVBRUSHMAX; icv++)
  216.                   DeleteObjectNull(&brtNew.mpicvhbr[icv]);
  217.                return FALSE;
  218.             }
  219.         }
  220.  
  221.         DeleteObjects();
  222.         brt = brtNew;
  223.         clrt = clrtNew;
  224.         return TRUE;
  225.     }
  226.         
  227.     return TRUE;
  228. }
  229.  
  230.  
  231.  
  232.  
  233. #ifdef IN_A_DLL
  234. /*-----------------------------------------------------------------------
  235. |   LibMain
  236. -----------------------------------------------------------------------*/
  237. #ifdef WIN32
  238. BOOL LibMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
  239. #else
  240. int FAR PASCAL LibMain(hModule, wDataSeg, cbHeapSize, lpszCmdLine)
  241. HANDLE  hModule;
  242. WORD    wDataSeg;
  243. WORD    cbHeapSize;
  244. LPSTR   lpszCmdLine;
  245. #endif
  246. {
  247.    return 1;
  248. }
  249.  
  250. #endif
  251.   
  252.  
  253. BOOL FInit3dDialogs(VOID)
  254. {
  255.     HDC hdc;
  256.     extern HANDLE hinstLib;
  257.     WORD wT;
  258.  
  259.     wT = (WORD) GetVersion();
  260.     verWindows = (LOBYTE(wT) << 8) | HIBYTE(wT); 
  261.     
  262.     hdc = GetDC(NULL);
  263.     f3dDialogs = GetDeviceCaps(hdc,BITSPIXEL)*GetDeviceCaps(hdc,PLANES) >= 4;
  264.     
  265.     // Win 3.1 EGA lies to us...
  266.     if(GetSystemMetrics(SM_CYSCREEN) == 350 && GetSystemMetrics(SM_CXSCREEN) == 640)
  267.         f3dDialogs = FALSE;
  268.         
  269.     ReleaseDC(NULL, hdc);
  270.     
  271.     if (f3dDialogs) {
  272.         if ( !InternalDraw3dColorChange(TRUE)) {
  273.             f3dDialogs = FALSE;
  274.         }            
  275.     }
  276.     return f3dDialogs;
  277. }
  278.  
  279.  
  280.  
  281. VOID End3dDialogs(VOID)
  282.     {
  283.     DeleteObjects();
  284.     f3dDialogs = FALSE;
  285.     }
  286.                
  287.                
  288. BOOL FAR PASCAL Draw3dRegister(void)
  289. {
  290.     cInited++;
  291.     
  292.     if (cInited == 1) {
  293.         return FInit3dDialogs();
  294.     }
  295.     return f3dDialogs;
  296. }
  297.  
  298.  
  299. BOOL FAR PASCAL Draw3dUnregister(void)
  300. {
  301.     cInited--;
  302.         
  303.     if (cInited == 0) {
  304.        End3dDialogs();
  305.     }
  306.     return TRUE;
  307. }
  308.  
  309.  
  310.  
  311.  
  312.                
  313.  
  314.  
  315.  
  316.  
  317.   
  318.