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

Windows编程

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------
  2. //---------------------------------------------------------------------------
  3. #include "app32.h"
  4. #include <windowsx.h>
  5. #include "resource.h"
  6. #define MYWM_NOTIFYICON (WM_APP+100)
  7. //---------------------------------------------------------------------------
  8. // Global to everybody...
  9. HINSTANCE g_hinst;
  10. #ifndef ARRAYSIZE
  11. #define ARRAYSIZE(a)    (sizeof(a)/sizeof(a[0]))
  12. #endif
  13. struct _DLGITEMS
  14. {
  15. DWORD dwStart;
  16. UINT uNotify;
  17. UINT uDelayID;
  18. UINT uState1;
  19. UINT uTip1;
  20. UINT uState2;
  21. UINT uTip2;
  22. } g_sDlgItems [] =
  23. {
  24. {
  25. 0, IDC_NOTIFY1, IDC_DELAY1, IDC_STATE11, IDC_TIP11, IDC_STATE12, IDC_TIP12,
  26. },
  27. {
  28. 0, IDC_NOTIFY2, IDC_DELAY2, IDC_STATE21, IDC_TIP21, IDC_STATE22, IDC_TIP22,
  29. },
  30. {
  31. 0, IDC_NOTIFY3, IDC_DELAY3, IDC_STATE31, IDC_TIP31, IDC_STATE32, IDC_TIP32,
  32. },
  33. } ;
  34. BOOL TrayMessage(HWND hDlg, DWORD dwMessage, UINT uID, HICON hIcon, PSTR pszTip)
  35. {
  36.         BOOL res;
  37. NOTIFYICONDATA tnd;
  38. tnd.cbSize = sizeof(NOTIFYICONDATA);
  39. tnd.hWnd = hDlg;
  40. tnd.uID = uID;
  41. tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
  42. tnd.uCallbackMessage = MYWM_NOTIFYICON;
  43. tnd.hIcon = hIcon;
  44. if (pszTip)
  45. {
  46. lstrcpyn(tnd.szTip, pszTip, sizeof(tnd.szTip));
  47. }
  48. else
  49. {
  50. tnd.szTip[0] = '';
  51. }
  52. res = Shell_NotifyIcon(dwMessage, &tnd);
  53. if (hIcon)
  54.     DestroyIcon(hIcon);
  55. return res;
  56. }
  57. LRESULT IconDrawItem(LPDRAWITEMSTRUCT lpdi)
  58. {
  59. HICON hIcon;
  60. hIcon = (HICON)LoadImage(g_hinst, MAKEINTRESOURCE(lpdi->CtlID), IMAGE_ICON,
  61. 16, 16, 0);
  62. if (!hIcon)
  63. {
  64. return(FALSE);
  65. }
  66. DrawIconEx(lpdi->hDC, lpdi->rcItem.left, lpdi->rcItem.top, hIcon,
  67. 16, 16, 0, NULL, DI_NORMAL);
  68. return(TRUE);
  69. }
  70. void StateChange(HWND hDlg, UINT uIndex, UINT uSelect)
  71. {
  72. UINT uState1, uState2;
  73. HWND hwndIcon;
  74. LPCSTR pszIDIcon;
  75. UINT uTip;
  76. char szTip[64];
  77. uState1 = g_sDlgItems[uIndex].uState1;
  78. uState2 = g_sDlgItems[uIndex].uState2;
  79. // if !uSelect, find out which button is selected
  80. if (!uSelect)
  81. {
  82. uSelect = IsDlgButtonChecked(hDlg, uState2) ? uState2 : uState1;
  83. }
  84. // if uSelect<0, find out shich button is NOT selected
  85. else if ((int)uSelect < 0)
  86. {
  87. uSelect = IsDlgButtonChecked(hDlg, uState2) ? uState1 : uState2;
  88. }
  89. CheckRadioButton(hDlg, uState1, uState2, uSelect);
  90. // If there is a tip specified, use it, otherwise use the default
  91. uTip = uSelect==uState1
  92. ? g_sDlgItems[uIndex].uTip1 : g_sDlgItems[uIndex].uTip2;
  93. if (!GetDlgItemText(hDlg, uTip, szTip, sizeof(szTip))
  94. && !LoadString(g_hinst, uSelect, szTip, sizeof(szTip)))
  95. {
  96. *szTip = '';
  97. }
  98. // HACK: The ID of window after the radio button is the ID of the icon
  99. hwndIcon = GetWindow(GetDlgItem(hDlg, uSelect), GW_HWNDNEXT);
  100. pszIDIcon = MAKEINTRESOURCE(GetDlgCtrlID(hwndIcon));
  101. TrayMessage(hDlg, NIM_MODIFY, g_sDlgItems[uIndex].uNotify,
  102. LoadImage(g_hinst, pszIDIcon, IMAGE_ICON, 16, 16, 0), szTip);
  103. }
  104. void NotifyDelete(HWND hDlg, UINT uIndex)
  105. {
  106. TrayMessage(hDlg, NIM_DELETE, g_sDlgItems[uIndex].uNotify, NULL, NULL);
  107. }
  108. void NotifyAdd(HWND hDlg, UINT uIndex)
  109. {
  110. TrayMessage(hDlg, NIM_ADD, g_sDlgItems[uIndex].uNotify, NULL, NULL);
  111. StateChange(hDlg, uIndex, 0);
  112. }
  113. void NotifyChange(HWND hDlg, UINT uIndex)
  114. {
  115. UINT uDelay;
  116. BOOL bTranslated;
  117. BOOL bEnable;
  118. if (IsDlgButtonChecked(hDlg, g_sDlgItems[uIndex].uNotify))
  119. {
  120. uDelay = GetDlgItemInt(hDlg, g_sDlgItems[uIndex].uDelayID,
  121. &bTranslated, FALSE);
  122. if (uDelay)
  123. {
  124. g_sDlgItems[uIndex].dwStart = GetTickCount() + uDelay*60000;
  125. SetTimer(hDlg, uIndex, 60000, NULL);
  126. }
  127. else
  128. {
  129. NotifyAdd(hDlg, uIndex);
  130. }
  131. }
  132. else
  133. {
  134. NotifyDelete(hDlg, uIndex);
  135. }
  136. for (uIndex=0, bEnable=FALSE; uIndex<ARRAYSIZE(g_sDlgItems); ++uIndex)
  137. {
  138. if (IsDlgButtonChecked(hDlg, g_sDlgItems[uIndex].uNotify))
  139. {
  140. bEnable = TRUE;
  141. }
  142. }
  143. EnableWindow(GetDlgItem(hDlg, IDABORT), bEnable);
  144. }
  145. BOOL CALLBACK TestAppDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  146. {
  147. switch (uMsg)
  148. {
  149. case WM_INITDIALOG:
  150. break;
  151. case WM_DRAWITEM:
  152. return(IconDrawItem((LPDRAWITEMSTRUCT)lParam));
  153. break;
  154. case WM_DESTROY:
  155. NotifyDelete(hDlg, 0);
  156. NotifyDelete(hDlg, 1);
  157. NotifyDelete(hDlg, 2);
  158. break;
  159. case WM_TIMER:
  160. if (wParam >= ARRAYSIZE(g_sDlgItems))
  161. {
  162. break;
  163. }
  164. if ((int)(GetTickCount() - g_sDlgItems[wParam].dwStart) < 0)
  165. {
  166. break;
  167. }
  168. KillTimer(hDlg, wParam);
  169. NotifyAdd(hDlg, wParam);
  170. break;
  171. case WM_COMMAND:
  172. switch (GET_WM_COMMAND_ID(wParam, lParam))
  173. {
  174. case IDCANCEL:
  175. EndDialog(hDlg, TRUE);
  176. break;
  177. case IDABORT:
  178. ShowWindow(hDlg, SW_HIDE);
  179. break;
  180. case IDC_NOTIFY1:
  181. NotifyChange(hDlg, 0);
  182. break;
  183. case IDC_NOTIFY2:
  184. NotifyChange(hDlg, 1);
  185. break;
  186. case IDC_NOTIFY3:
  187. NotifyChange(hDlg, 2);
  188. break;
  189. case IDC_STATE11:
  190. case IDC_STATE12:
  191. StateChange(hDlg, 0, GET_WM_COMMAND_ID(wParam, lParam));
  192. break;
  193. case IDC_STATE21:
  194. case IDC_STATE22:
  195. StateChange(hDlg, 1, GET_WM_COMMAND_ID(wParam, lParam));
  196. break;
  197. case IDC_STATE31:
  198. case IDC_STATE32:
  199. StateChange(hDlg, 2, GET_WM_COMMAND_ID(wParam, lParam));
  200. break;
  201. }
  202. break;
  203. case MYWM_NOTIFYICON:
  204. switch (lParam)
  205. {
  206. case WM_LBUTTONDOWN:
  207. switch (wParam)
  208. {
  209. case IDC_NOTIFY1:
  210. StateChange(hDlg, 0, (UINT)-1);
  211. break;
  212. case IDC_NOTIFY2:
  213. StateChange(hDlg, 1, (UINT)-1);
  214. break;
  215. case IDC_NOTIFY3:
  216. StateChange(hDlg, 2, (UINT)-1);
  217. break;
  218. default:
  219. break;
  220. }
  221. break;
  222. case WM_RBUTTONDOWN:
  223. ShowWindow(hDlg, SW_SHOW);
  224. SetForegroundWindow(hDlg); // make us come to the front
  225. break;
  226. default:
  227. break;
  228. }
  229. break;
  230. default:
  231. return(FALSE);
  232. }
  233. return(TRUE);
  234. }
  235. //---------------------------------------------------------------------------
  236. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  237. {
  238. g_hinst = hInstance;
  239. DialogBox(hInstance, MAKEINTRESOURCE(IDD_APP32), NULL, TestAppDlgProc);
  240. return(FALSE);
  241. }