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

Windows编程

开发平台:

Visual C++

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File: color.cpp
  6.  *
  7.  ***************************************************************************/
  8. #include <d3drmwin.h>
  9. #include "viewer.h"
  10. #include <windows.h>
  11. #include <string.h>
  12. #include <commdlg.h>
  13. #include <d3drm.h>
  14. static DWORD dwNewAlpha;
  15. VOID
  16. setAlphaDialog(HWND hdlg, DWORD dwVal)
  17. {
  18.     TCHAR szVal[5];
  19.     wsprintf(szVal, "%d", dwVal);
  20.     SendDlgItemMessage(hdlg, COLOR_ALPHA, EM_SETSEL,
  21.        (WPARAM)0, (LPARAM)-1);
  22.     SendDlgItemMessage(hdlg, COLOR_ALPHA, EM_REPLACESEL,
  23.        (WPARAM)FALSE, (LPARAM)szVal);
  24. }
  25. #define COLOR_OK 0
  26. #define COLOR_BADVAL 1
  27. #define COLOR_NONEWVAL 2
  28. DWORD
  29. getAlphaFromDialog(HWND hdlg, LPDWORD pdwAlpha)
  30. {
  31.     WORD cchAlpha;
  32.     TCHAR szAlpha[5];
  33.     TCHAR* pszStop;
  34.     DWORD dwAlpha;
  35.     cchAlpha = (WORD)SendDlgItemMessage(hdlg, COLOR_ALPHA,
  36. EM_LINELENGTH,
  37. (WPARAM)0, (LPARAM)0);
  38.     if (cchAlpha > 3)
  39.     {
  40. return (COLOR_BADVAL);
  41.     }
  42.     if (cchAlpha == 0)
  43.     {
  44. return (COLOR_NONEWVAL);
  45.     }
  46.     *szAlpha = (char)cchAlpha;
  47.     SendDlgItemMessage(hdlg, COLOR_ALPHA, EM_GETLINE,
  48.        (WPARAM)0, (LPARAM)szAlpha);
  49.     szAlpha[cchAlpha] = '';
  50.     pszStop = &szAlpha[cchAlpha];
  51.     dwAlpha = strtoul(szAlpha, &pszStop, 10);
  52.     if (dwAlpha > 255)
  53.     {
  54. return (COLOR_BADVAL);
  55.     }
  56.     *pdwAlpha = dwAlpha;
  57.     return (COLOR_OK);
  58. }
  59. UINT APIENTRY CCHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
  60. {
  61.     DWORD dwAlpha;
  62.     DWORD dwRet;
  63.     switch (uiMsg)
  64.     {
  65. case WM_INITDIALOG:
  66.     setAlphaDialog(hdlg, dwNewAlpha);
  67.     break;
  68. case WM_COMMAND:
  69.     if (wParam == IDOK)
  70.     {
  71. /*
  72.  * Get the Alpha Value
  73.  */
  74. dwRet = getAlphaFromDialog(hdlg, &dwAlpha);
  75. switch (dwRet)
  76. {
  77.     case COLOR_NONEWVAL:
  78.      break;
  79.     case COLOR_OK:
  80.      dwNewAlpha = dwAlpha;
  81. break;
  82.     case COLOR_BADVAL:
  83. setAlphaDialog(hdlg, dwNewAlpha);
  84. break;
  85. }
  86.     }
  87.     break;
  88.     }
  89.     return 0; /* Always give default behaviour */
  90. }
  91. int ChooseNewColor(HWND win, D3DCOLOR* current)
  92. {
  93.     CHOOSECOLOR cc;
  94.     COLORREF clr;
  95.     COLORREF aclrCust[16];
  96.     int i;
  97.     for (i = 0; i < 16; i++)
  98. aclrCust[i] = RGB(255, 255, 255);
  99.     clr =
  100. RGB
  101. (   (int) (255 * D3DRMColorGetRed(*current)),
  102.     (int) (255 * D3DRMColorGetGreen(*current)),
  103.     (int) (255 * D3DRMColorGetBlue(*current))
  104. );
  105.     memset(&cc, 0, sizeof(CHOOSECOLOR));
  106.     cc.lStructSize = sizeof(CHOOSECOLOR);
  107.     cc.hwndOwner = win;
  108.     cc.hInstance = (HWND)GetWindowLong(win, GWL_HINSTANCE);
  109.     cc.rgbResult = clr;
  110.     cc.lpCustColors = aclrCust;
  111.     cc.Flags = CC_RGBINIT|CC_FULLOPEN|CC_ENABLETEMPLATE|CC_ENABLEHOOK;
  112.     cc.lpfnHook = CCHookProc;
  113.     cc.lpTemplateName = "ViewerChooseColor";
  114.     dwNewAlpha = (DWORD) (255 * D3DRMColorGetAlpha(*current));
  115.     if (ChooseColor(&cc))
  116.     { *current =
  117.     D3DRMCreateColorRGBA
  118.     ( D3DVAL(GetRValue(cc.rgbResult) / D3DVAL(255.0)),
  119. D3DVAL(GetGValue(cc.rgbResult) / D3DVAL(255.0)),
  120. D3DVAL(GetBValue(cc.rgbResult) / D3DVAL(255.0)),
  121. D3DVAL(dwNewAlpha / D3DVAL(255.0))
  122.     );
  123. return TRUE;
  124.     }
  125.     else return FALSE;
  126. }