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

Windows编程

开发平台:

Visual C++

  1. /************************************************************************
  2.   File: colors.c
  3.   Purpose:
  4.     This file contains all the code necessary for the colors dialog.
  5.   Functions:
  6.     DoColorsDialog()          -- Starts off the creation of the main colors dlg
  7.     ColorsProc()              -- Callback function for the colors dialog
  8.     InitColorStruct()         -- Initializes default CHOOSECOLOR strucure
  9.     FillColorDlg()            -- Fills the colors dialog with the current
  10.                                  CHOOSECOLOR structure values.
  11.     GetColorDlg()             -- Retrieves users edits and puts them in
  12.                                  the appropriate CHOOSECOLOR structure.
  13.     ColorsHookProc()          -- Callback hook function if the ChooseColor()
  14.                                  function is called with CC_ENABLEHOOK
  15.     GetColorsResHandle()      -- Loads a custom template from the EXE
  16.                                  and returns a handle to it
  17.     DoChooseColorStuff()      -- Calls the ChooseColor() function.
  18.     ColorThreadProc1()        -- Starting address for the first thread
  19.     ColorThreadProc2()        -- Starting address for the second thread
  20.     MultiThreadColorDlg()     -- Creates two threads in this process
  21.                                  which each create ChooseColor() dialogs.
  22.     EnableColorButtons()      -- Enables or disables buttons in the colors
  23.                                  dialog.  Necessary for the multithreading.
  24. ************************************************************************/
  25. #include <windows.h>
  26. #include <commdlg.h>
  27. #include <stdlib.h>
  28. #include <winnls.h>
  29. #include "cdtest.h"
  30. #include "colors.h"
  31. /* Function prototypes */
  32. void InitColorStruct(HWND hwnd, LPCHOOSECOLOR) ;
  33. void FillColorDlg(HWND hwnd, LPCHOOSECOLOR) ;
  34. void GetColorDlg(HWND hwnd, LPCHOOSECOLOR) ;
  35. void DoChooseColorStuff(HWND, LPCHOOSECOLOR) ;
  36. UINT APIENTRY ColorsHookProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam) ;
  37. /* Variables and external declarations */
  38. CHOOSECOLOR cc ;
  39. DWORD dwCustColors[16] ;
  40. DWORD dwColor ;
  41. HANDLE hDialogColors, hResColors ;
  42. HANDLE GetColorsResHandle(void) ;
  43. TCHAR szTemplateNameC[50] ;
  44. extern UINT uMode ;
  45. extern LONG MyAtol(LPTSTR, BOOL, LPBOOL) ;
  46. /* Multithreading stuff */
  47. DWORD dwColorThreadID1 ;
  48. DWORD dwColorThreadID2 ;
  49. DWORD dwColorThreadParm1 ;
  50. DWORD dwColorThreadParm2 ;
  51. DWORD ColorThreadProc1(LPDWORD) ;
  52. DWORD ColorThreadProc2(LPDWORD) ;
  53. void MultiThreadColorDlg(void) ;
  54. void EnableColorButtons(HWND, BOOL) ;
  55. HANDLE hColorThread1 ;
  56. HANDLE hColorThread2 ;
  57. HWND hwndMainColor ;
  58. int nOpenColorDlgCount ;
  59. CHOOSECOLOR ccThread1 ;
  60. CHOOSECOLOR ccThread2 ;
  61. /************************************************************************
  62.   Function: DoColorsDialog(HWND)
  63.   Purpose: To create the ChooseColor() common dialog creation dialog.
  64.   Returns: Nothing.
  65.   Comments:
  66. ************************************************************************/
  67. void DoColorsDialog(HWND hwnd)
  68. {
  69.   DialogBox(hInst, MAKEINTRESOURCE(ID_COLORSDIALOG),
  70.             hwnd, ColorsProc) ;
  71. }
  72. /************************************************************************
  73.   Function: ColorsProc(HWND, UINT, UINT, LONG)
  74.   Purpose: The callback function for the main colors dialog.
  75.   Returns: TRUE or FALSE depending on the situation.
  76.   Comments:
  77. ************************************************************************/
  78. BOOL APIENTRY ColorsProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
  79. {
  80.   BOOL bRet = FALSE ;
  81.   switch (msg)
  82.   {
  83.     case WM_INITDIALOG:
  84.        InitColorStruct(hwnd, &cc) ;  //initialize the CHOOSECOLOR structure
  85.        FillColorDlg(hwnd, &cc) ;  //and fill the colors dialog.
  86.        nOpenColorDlgCount = 0 ;
  87.        hwndMainColor = hwnd ;
  88.        *(&ccThread1) = *(&ccThread2) = *(&cc) ;
  89.        SetFocus(GetDlgItem(hwnd, ID_STRUCTSIZEC)) ;
  90.        break ;
  91.      case UMSG_DECREMENTDLGCOUNT:  //user defined message indicating
  92.                                    //the closure of a multithreaded dialog
  93.        /* Keep the main colors dialog buttons disabled until the last
  94.           multithreaded dialog function has returned. */
  95.        nOpenColorDlgCount-- ;
  96.        if (nOpenColorDlgCount == 0)
  97.          EnableColorButtons(hwnd, TRUE) ;
  98.        break ;
  99.      case WM_COMMAND:
  100.         switch (LOWORD(wParam))
  101.         {
  102.           case IDOK:
  103.             GetColorDlg(hwnd, &cc) ;            //get user's choices
  104.             DoChooseColorStuff(hwnd, &cc) ;     //do the dialog
  105.             break ;
  106.           case ID_RESETC:
  107.             SendDlgItemMessage(hwnd, ID_CUSTCOLORSC, CB_RESETCONTENT,
  108.               (WPARAM) 0, (LPARAM) 0) ;
  109.             InitColorStruct(hwnd, &cc) ;
  110.             FillColorDlg(hwnd, &cc) ;
  111.             SendDlgItemMessage(hwnd, ID_NULLSTRUCTCOLOR, BM_SETCHECK, (WPARAM)0, (LPARAM)0) ;
  112.             SendDlgItemMessage(hwnd, ID_PRELOADEDCOLORS, BM_SETCHECK, (WPARAM)0, (LPARAM)0) ;
  113.             SetFocus(GetDlgItem(hwnd, ID_STRUCTSIZEC)) ;
  114.             break ;
  115.           case IDCANCEL:
  116.             EndDialog(hwnd, FALSE) ;
  117.             break ;
  118.           case ID_ADD1C:
  119.             GetDlgItemText(hwnd, ID_CUSTCOLORSC, szTemp, 100) ;
  120.             if (*szTemp)
  121.               SendDlgItemMessage(hwnd, ID_CUSTCOLORSC, CB_ADDSTRING,
  122.                                  (WPARAM) 0, (LPARAM) (LPTSTR) szTemp) ;
  123.             break ;
  124.           case ID_CLEAR1C:
  125.             SendDlgItemMessage(hwnd, ID_CUSTCOLORSC, CB_RESETCONTENT,
  126.                                (WPARAM) 0, (LPARAM) 0) ;
  127.             break ;
  128.           case ID_MULTITHREADCOLORS:
  129.             /* Start the dialog count off at 2, disable the main dialog's
  130.                buttons, and multithread */
  131.             nOpenColorDlgCount = 2 ;
  132.             EnableColorButtons(hwnd, FALSE) ;
  133.             MultiThreadColorDlg() ;
  134.             break ;
  135.           default: break ;
  136.         }
  137.     default:
  138.       /* If the help button is pressed in the ChooseColor()
  139.          dialog, it will send a message Registered with RegisterWindowMessage()
  140.          to the parent window.  The message nHelpMessage was registered
  141.          at application startup */
  142.       if (msg == nHelpMessage)
  143.         MessageBox(GetForegroundWindow(), TEXT("Hello from the help button"),
  144.                    TEXT("Colors Help Button"), MB_OK | MB_APPLMODAL) ;
  145.       break ;
  146.   }
  147.   return FALSE ;
  148. }
  149. /************************************************************************
  150.   Function: InitColorStruct(HWND, LPCHOOSECOLOR)
  151.   Purpose: Fills the default CHOOSECOLOR structure with some default
  152.            values.
  153.   Returns: Nothing.
  154.   Comments:
  155. ************************************************************************/
  156. void InitColorStruct(HWND hwnd, LPCHOOSECOLOR pcc)
  157. {
  158.   int i ;
  159.   pcc->lStructSize  = sizeof(CHOOSECOLOR) ;
  160.   pcc->hwndOwner    = hwnd ;
  161.   pcc->hInstance    = (HANDLE) hInst ;
  162.   dwColor = RGB(0, 0, 0) ;
  163.   pcc->rgbResult    = dwColor ;
  164.   for (i=0; i<16; i++)
  165.     dwCustColors[i] = (RGB(255-i*10, i, i*10)) ;
  166.   pcc->lpCustColors = (LPDWORD) dwCustColors ;
  167.   pcc->Flags     = CC_FULLOPEN | CC_SHOWHELP | CC_RGBINIT ;
  168.   pcc->lCustData = 0 ;
  169.   pcc->lpfnHook = ColorsHookProc ;
  170.   lstrcpy(szTemplateNameC, TEXT("clrtemp")) ;         //name of custom template
  171.   pcc->lpTemplateName = (LPTSTR) szTemplateNameC ;
  172.   return ;
  173. }
  174. /************************************************************************
  175.   Function: FillColorDlg(HWND, LPCHOOSECOLOR)
  176.   Purpose: Fills the colors dialog with the current contents of the
  177.            CHOOSECOLOR structure passed in as the second parameter.
  178.   Returns: Nothing.
  179.   Comments:
  180. ************************************************************************/
  181. void FillColorDlg(HWND hwnd, LPCHOOSECOLOR pcc)
  182. {
  183.   int i ;
  184.   wsprintf(szTemp, szLongFilter, pcc->lStructSize) ;
  185.   SetDlgItemText(hwnd, ID_STRUCTSIZEC, szTemp) ;
  186.   wsprintf(szTemp, szLongFilter, (DWORD) pcc->hwndOwner) ;
  187.   SetDlgItemText(hwnd, ID_HWNDOWNERC, szTemp) ;
  188.   wsprintf(szTemp, szLongFilter, (DWORD) pcc->hInstance) ;
  189.   SetDlgItemText(hwnd, ID_HINSTANCEC, szTemp) ;
  190.   wsprintf(szTemp, szLongFilter, pcc->rgbResult) ;
  191.   SetDlgItemText(hwnd, ID_RGBRESULTC, szTemp) ;
  192.   SendDlgItemMessage(hwnd, ID_CUSTCOLORSC, CB_RESETCONTENT,
  193.                      (WPARAM) 0, (LPARAM) 0) ;
  194.   for (i=0; i<16; i++)
  195.   {
  196.     wsprintf(szTemp, szLongFilter, dwCustColors[i]) ;
  197.     SendDlgItemMessage(hwnd, ID_CUSTCOLORSC, CB_ADDSTRING,
  198.                        (WPARAM) 0, (LPARAM) (LPTSTR) szTemp) ;
  199.   }
  200.   SendDlgItemMessage(hwnd, ID_CUSTCOLORSC, CB_SETCURSEL,
  201.                      (WPARAM) 0 , (LPARAM) 0) ;
  202.   wsprintf(szTemp, szLongFilter, pcc->Flags) ;
  203.   SetDlgItemText(hwnd, ID_FLAGSC, szTemp) ;
  204.   wsprintf(szTemp, szLongFilter, pcc->lCustData) ;
  205.   SetDlgItemText(hwnd, ID_CUSTDATAC, szTemp) ;
  206.   wsprintf(szTemp, szLongFilter, (DWORD) pcc->lpfnHook) ;
  207.   SetDlgItemText(hwnd, ID_HOOKC, szTemp) ;
  208.   SetDlgItemText(hwnd, ID_TEMPLATEC, (LPTSTR) pcc->lpTemplateName) ;
  209. }
  210. /************************************************************************
  211.   Function: GetColorDlg(HWND, LPCHOOSECOLOR)
  212.   Purpose: Retrieves the users entries in the colors dialog edit boxes
  213.            and puts them in the appropriate CHOOSECOLOR structure
  214.            members.
  215.   Returns: Nothing.
  216.   Comments:
  217. ************************************************************************/
  218. void GetColorDlg(HWND hwnd, LPCHOOSECOLOR pcc)
  219. {
  220.   int i ;
  221.   BOOL b ;
  222.   TCHAR szNum[30] ;
  223.   #define WSIZECC 30
  224.   GetDlgItemText(hwnd, ID_STRUCTSIZEC, szNum, WSIZECC) ;
  225.   pcc->lStructSize = MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  226.   GetDlgItemText(hwnd, ID_HWNDOWNERC, szNum, WSIZECC) ;
  227.   pcc->hwndOwner = (HWND) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  228.   GetDlgItemText(hwnd, ID_HINSTANCEC, szNum, WSIZECC) ;
  229.   pcc->hInstance = (HANDLE) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  230.   GetDlgItemText(hwnd, ID_RGBRESULTC, szNum, WSIZECC) ;
  231.   pcc->rgbResult = MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  232.   for (i=0; i<16; i++)
  233.   {
  234.     if (SendDlgItemMessage(hwnd, ID_CUSTCOLORSC, CB_GETLBTEXT,
  235.                           (WPARAM) i, (LPARAM) (LPTSTR) szNum) != CB_ERR)
  236.       dwCustColors[i] = MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  237.     else
  238.       dwCustColors[i] = (DWORD) 0 ;
  239.     *(pcc->lpCustColors + i) = dwCustColors[i] ;
  240.   }
  241.   GetDlgItemText(hwnd, ID_FLAGSC, szNum, WSIZECC) ;
  242.   pcc->Flags = MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  243.   GetDlgItemText(hwnd, ID_CUSTDATAC, szNum, WSIZECC) ;
  244.   pcc->lCustData = MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  245.   GetDlgItemText(hwnd, ID_HOOKC, szNum, WSIZECC) ;
  246.   pcc->lpfnHook = (LPCCHOOKPROC) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  247.   GetDlgItemText(hwnd, ID_TEMPLATEC, (LPTSTR) pcc->lpTemplateName, 50) ;
  248.   return ;
  249. }
  250. /************************************************************************
  251.   Function: ColorsHookProc(HWND, UINT, UINT, LONG) ;
  252.   Purpose:  This function will be called before the normal ChooseColor()
  253.             logic is envoked.
  254.   Returns: FALSE to instruct ChooseColor() to proceed with it's normal
  255.            processing of the message.  TRUE to discard normal processing.
  256.   Comments:
  257.     To enable the hook, type the value for "CC_ENABLEHOOK" in the
  258.     "Flags" edit box.
  259. ************************************************************************/
  260. UINT APIENTRY ColorsHookProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
  261. {
  262.   LPCHOOSECOLOR pCc ;
  263.   TCHAR szMsg[50] ;
  264.   switch(msg)
  265.   {
  266.     case WM_INITDIALOG:
  267.       /* During initialization of the ChooseColor() dialog, if there is a
  268.          hook proc the ChooseColor() function will send a pointer to the
  269.          current CHOOSECOLOR structure in the wParam parameter */
  270.       pCc = (LPCHOOSECOLOR) lParam ;
  271.       if (pCc->lCustData != 0L)
  272.       {
  273.         wsprintf(szMsg, TEXT("CHOOSECOLOR->lCustData is: %ld"), pCc->lCustData) ;
  274.         MessageBox(hwnd, szMsg, TEXT("lCustData Sent!"), MB_OK | MB_APPLMODAL) ;
  275.       }
  276.       SetWindowText(hwnd, TEXT("Color Hook Proc Dialog")) ;
  277.       break ;
  278.     default:
  279.       break ;
  280.   }
  281.   return FALSE ;   //send msg to the common dialog code
  282. }
  283. /************************************************************************
  284.   Function: GetColorsResHandle(void)
  285.   Purpose: Creates a handle to the custom template and returns it to the
  286.            caller.
  287.   Returns: HANDLE to a preloaded custom template
  288.   Comments:
  289.     To use this preloaded template, mark the "Preloaded Template" checkbox
  290.     and enter CC_ENABLETEMPLATEHANDLE in the "Flags" edit box.
  291. ************************************************************************/
  292. HANDLE GetColorsResHandle(void)
  293. {
  294.   hResColors = FindResource(hInst, TEXT("clrtemp"), RT_DIALOG) ;
  295.   hDialogColors = LoadResource(hInst, hResColors) ;
  296.   return hDialogColors ;
  297. }
  298. /************************************************************************
  299.   Function:DoChooseColorStuff(HWND, LPCHOOSECOLOR)
  300.   Purpose: Does the actual calling of the ChooseColor() function.
  301.   Returns: Nothing.
  302.   Comments:
  303. ************************************************************************/
  304. void DoChooseColorStuff(HWND hwnd, LPCHOOSECOLOR pcc)
  305. {
  306.   BOOL bRet ;
  307.   /* If the "Preloaded template button is checked, load a handle for
  308.      the custom template and put it in the hInstance member of the
  309.      CHOOSECOLOR structure */
  310.   if (IsDlgButtonChecked(hwnd, ID_PRELOADEDCOLORS) == 1)
  311.     pcc->hInstance = GetColorsResHandle() ;
  312.    /* If the "NULL Structure" box is checked, call ChooseColor() will
  313.       a NULL pointer.  Otherwise call with the current CHOOSECOLOR pointer */
  314.   if (IsDlgButtonChecked(hwnd, ID_NULLSTRUCTCOLOR) == 1)
  315.     bRet = ChooseColor((LPCHOOSECOLOR) NULL) ;
  316.   else
  317.     bRet = ChooseColor(pcc) ;
  318.   if (pcc->hInstance)
  319.   {
  320.     FreeResource(hDialogColors) ;
  321.     hDialogColors = (HANDLE) 0 ;
  322.     hResColors = (HANDLE) 0 ;
  323.   }
  324.   /* Fill the results into the main colors dialog */
  325.   FillColorDlg(hwnd, pcc) ;
  326.   wsprintf(szTemp, szShortFilter, bRet) ;
  327.   SetDlgItemText(hwnd, ID_RETURNC, szTemp) ;
  328.   wsprintf(szTemp, szLongFilter, CommDlgExtendedError()) ;
  329.   SetDlgItemText(hwnd, ID_ERRORC, szTemp) ;
  330. }
  331. /************************************************************************
  332.   Function:ColorThreadProc1(LPDWORD)
  333.   Purpose: Starting address for first thread
  334.   Returns: Any DWORD value.
  335.   Comments:
  336. ************************************************************************/
  337. DWORD ColorThreadProc1(LPDWORD pdw)
  338. {
  339.   GetColorDlg(hwndMainColor, &ccThread1) ;
  340.   DoChooseColorStuff(hwndMainColor, &ccThread1) ;
  341.   PostMessage(hwndMainColor, UMSG_DECREMENTDLGCOUNT, 0, 0L ) ;
  342.   return 0L ;
  343. }
  344. /************************************************************************
  345.   Function:ColorThreadProc2(LPDWORD)
  346.   Purpose: Starting address for second thread
  347.   Returns: Any DWORD value.
  348.   Comments:
  349. ************************************************************************/
  350. DWORD ColorThreadProc2(LPDWORD pdw)
  351. {
  352.   GetColorDlg(hwndMainColor, &ccThread2) ;
  353.   DoChooseColorStuff(hwndMainColor, &ccThread2) ;
  354.   PostMessage(hwndMainColor, UMSG_DECREMENTDLGCOUNT, 0, 0L ) ;
  355.   return 0L ;
  356. }
  357. /************************************************************************
  358.   Function:MultiThreadColorDlg(void)
  359.   Purpose: Creates two threads which will each create a new ChooseColor()
  360.            dialog.
  361.   Returns: Nothing.
  362.   Comments:
  363.     Do not pass any parameters to this function that may be used by the
  364.     ChooseColor dialog routines because this function will return before
  365.     the new threads are finished.
  366. ************************************************************************/
  367. void MultiThreadColorDlg(void)
  368. {
  369.   dwColorThreadParm1 = dwColorThreadParm2 = 0L ;
  370.   if (!(hColorThread1 = CreateThread((LPSECURITY_ATTRIBUTES) NULL, 0,
  371.                                      (LPTHREAD_START_ROUTINE) ColorThreadProc1,
  372.                                      &dwColorThreadParm1, CREATE_SUSPENDED, &dwColorThreadID1)))
  373.   {
  374.     MessageBox(GetForegroundWindow(), TEXT("Error creating thread 1"), NULL,
  375.                MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL) ;
  376.     nOpenColorDlgCount = 0 ;
  377.     EnableColorButtons(hwndMainColor, TRUE) ;
  378.     return ;
  379.   }
  380.   if (!(hColorThread2 = CreateThread((LPSECURITY_ATTRIBUTES) NULL, 0,
  381.                                      (LPTHREAD_START_ROUTINE) ColorThreadProc2,
  382.                                      &dwColorThreadParm2, CREATE_SUSPENDED, &dwColorThreadID2)))
  383.   {
  384.     MessageBox(GetForegroundWindow(), TEXT("Error creating thread 2"), NULL,
  385.                MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL) ;
  386.     nOpenColorDlgCount = 0 ;
  387.     EnableColorButtons(hwndMainColor, TRUE) ;
  388.     return ;
  389.   }
  390.   ResumeThread(hColorThread1) ;
  391.   ResumeThread(hColorThread2) ;
  392.   return ;
  393. }
  394. /************************************************************************
  395.   Function:EnableColorButtons(HWND, BOOL)
  396.   Purpose: Enables or disables the buttons on the main colors dialog.
  397.            Necessary when multithreading.
  398.   Returns: Nothing.
  399.   Comments:
  400. ************************************************************************/
  401. void EnableColorButtons(HWND hwnd, BOOL bEnable)
  402. {
  403.   EnableWindow(GetDlgItem(hwnd, IDOK), bEnable) ;
  404.   EnableWindow(GetDlgItem(hwnd, IDCANCEL), bEnable) ;
  405.   EnableWindow(GetDlgItem(hwnd, ID_RESETC), bEnable) ;
  406.   EnableWindow(GetDlgItem(hwnd, ID_MULTITHREADCOLORS), bEnable) ;
  407. }