RotatingIcon.c
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:5k
源码类别:

VC书籍

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "globals.h"
  3. ////////////////////////////////////////////////////////////////////////////////
  4. //
  5. typedef struct _CPs_SysIcon
  6. {
  7.     HWND m_hWnd;
  8.     HBITMAP m_bmStrip;
  9.     HBITMAP m_bmStrip_Mask;
  10.     HBITMAP m_bmIcon;
  11.     int m_iCurrentFrame;
  12. } CPs_SysIcon;
  13. //
  14. ////////////////////////////////////////////////////////////////////////////////
  15. void CPSYSICON_DrawCurrentFrame(CPs_SysIcon* pSysIconData);
  16. ////////////////////////////////////////////////////////////////////////////////
  17. //
  18. //
  19. //
  20. CP_HSYSICON CPSYSICON_Create(HWND hWnd)
  21. {
  22.     CPs_SysIcon* pSysIconData = (CPs_SysIcon*)malloc(sizeof(CPs_SysIcon));
  23.     pSysIconData->m_bmStrip = LoadBitmap( GetModuleHandle(NULL),
  24.                                           MAKEINTRESOURCE(IDB_SYSICON));
  25.     pSysIconData->m_bmStrip_Mask = LoadImage( GetModuleHandle(NULL),
  26.                                    MAKEINTRESOURCE(IDB_SYSICON_MASK), IMAGE_BITMAP, 0, 0, LR_MONOCHROME);
  27.     pSysIconData->m_iCurrentFrame = 0;
  28.     pSysIconData->m_hWnd = hWnd;
  29.     pSysIconData->m_bmIcon = NULL;
  30.     CPSYSICON_DrawCurrentFrame(pSysIconData);
  31.     {
  32.         NOTIFYICONDATA nic;
  33.         ICONINFO iconinfo;
  34.         nic.cbSize = sizeof(NOTIFYICONDATA);
  35.         nic.hWnd = hWnd;
  36.         nic.uID = NOTIFY_ICON_ID;
  37.         nic.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
  38.         nic.uCallbackMessage = WM_NOTIFYICON;
  39.         iconinfo.fIcon = TRUE;
  40.         iconinfo.hbmColor = pSysIconData->m_bmIcon;
  41.         iconinfo.hbmMask = pSysIconData->m_bmStrip_Mask;
  42.         nic.hIcon = CreateIconIndirect(&iconinfo);
  43.         strcpy(nic.szTip, "CoolerPlayer");
  44.         Shell_NotifyIcon(NIM_ADD, &nic);
  45.         if(nic.hIcon)
  46.             DestroyIcon(nic.hIcon);
  47.     }
  48.     return pSysIconData;
  49. }
  50. //
  51. //
  52. //
  53. void CPSYSICON_Destroy(CP_HSYSICON hSysIconData)
  54. {
  55.     CPs_SysIcon* pSysIconData = (CPs_SysIcon*)hSysIconData;
  56.     NOTIFYICONDATA nic;
  57.     CP_CHECKOBJECT(pSysIconData);
  58.     // Remove systray icon
  59.     nic.cbSize = sizeof(NOTIFYICONDATA);
  60.     nic.hWnd = pSysIconData->m_hWnd;
  61.     nic.uID = NOTIFY_ICON_ID;
  62.     nic.uFlags = NIF_ICON | NIF_MESSAGE;
  63.     Shell_NotifyIcon(NIM_DELETE, &nic);
  64.     if(pSysIconData->m_bmStrip)
  65.         DeleteObject(pSysIconData->m_bmStrip);
  66.     if(pSysIconData->m_bmStrip_Mask)
  67.         DeleteObject(pSysIconData->m_bmStrip_Mask);
  68.     if(pSysIconData->m_bmIcon)
  69.         DeleteObject(pSysIconData->m_bmIcon);
  70.     free(pSysIconData);
  71. }
  72. //
  73. //
  74. //
  75. void CPSYSICON_DrawCurrentFrame(CPs_SysIcon* pSysIconData)
  76. {
  77.     HDC dcSource, dcDest;
  78.     HDC dcScreen;
  79.     HBITMAP bmOld_Source, bmOld_Dest;
  80.     // Setup dest DC
  81.     dcDest = CreateCompatibleDC(NULL);
  82.     if(!pSysIconData->m_bmIcon)
  83.     {
  84.         dcScreen = GetDC(NULL);
  85.         pSysIconData->m_bmIcon = CreateCompatibleBitmap(dcScreen, 16, 16);
  86.         ReleaseDC(NULL, dcScreen);
  87.     }
  88.     bmOld_Dest = (HBITMAP)SelectObject(dcDest, pSysIconData->m_bmIcon);
  89.     // Setup source DC
  90.     dcSource = CreateCompatibleDC(NULL);
  91.     bmOld_Source = (HBITMAP)SelectObject(dcSource, pSysIconData->m_bmStrip);
  92.     // Blt dest onto source
  93.     BitBlt(dcDest, 0, 0, 16, 16,
  94.            dcSource, pSysIconData->m_iCurrentFrame * 16,0,SRCCOPY);
  95.     // Cleanup
  96.     SelectObject(dcDest, bmOld_Dest);
  97.     SelectObject(dcSource, bmOld_Source);
  98.     DeleteDC(dcDest);
  99.     DeleteDC(dcSource);
  100. }
  101. //
  102. //
  103. //
  104. void CPSYSICON_AdvanceFrame(CP_HSYSICON hSysIconData)
  105. {
  106.     CPs_SysIcon* pSysIconData = (CPs_SysIcon*)hSysIconData;
  107.     int iNewIconFrame;
  108.     CP_CHECKOBJECT(pSysIconData);
  109.     // Work out new icon frame
  110.     iNewIconFrame = pSysIconData->m_iCurrentFrame;
  111.     if(options.rotate_systray_icon)
  112.     {
  113.         if(globals.m_enPlayerState == cppsPlaying)
  114.             iNewIconFrame = (pSysIconData->m_iCurrentFrame + 1) % 10;
  115.         else if(globals.m_enPlayerState != cppsPaused)
  116.             iNewIconFrame = 0;
  117.     }
  118.     else
  119.         iNewIconFrame = 0;
  120.     // Not changed? - fast out
  121.     if(pSysIconData->m_iCurrentFrame == iNewIconFrame)
  122.         return;
  123.     // Update the icon
  124.     pSysIconData->m_iCurrentFrame = iNewIconFrame;
  125.     CPSYSICON_DrawCurrentFrame(pSysIconData);
  126.     {
  127.         NOTIFYICONDATA nic;
  128.         ICONINFO iconinfo;
  129.         nic.cbSize = sizeof(NOTIFYICONDATA);
  130.         nic.hWnd = pSysIconData->m_hWnd;
  131.         nic.uID = NOTIFY_ICON_ID;
  132.         nic.uFlags = NIF_ICON;
  133.         iconinfo.fIcon = TRUE;
  134.         iconinfo.hbmColor = pSysIconData->m_bmIcon;
  135.         iconinfo.hbmMask = pSysIconData->m_bmStrip_Mask;
  136.         nic.hIcon = CreateIconIndirect(&iconinfo);
  137.         Shell_NotifyIcon(NIM_MODIFY, &nic);
  138.         if(nic.hIcon)
  139.             DestroyIcon(nic.hIcon);
  140.     }
  141. }
  142. //
  143. //
  144. //
  145. void CPSYSICON_SetTipText(CP_HSYSICON hSysIconData, const char* pcNewTipText)
  146. {
  147.     CPs_SysIcon* pSysIconData = (CPs_SysIcon*)hSysIconData;
  148.     NOTIFYICONDATA nic;
  149.     CP_CHECKOBJECT(pSysIconData);
  150.     nic.cbSize = sizeof(NOTIFYICONDATA);
  151.     nic.hWnd = pSysIconData->m_hWnd;
  152.     nic.uID = NOTIFY_ICON_ID;
  153.     nic.uFlags = NIF_TIP;
  154.     strncpy(nic.szTip, pcNewTipText, sizeof(nic.szTip));
  155.     Shell_NotifyIcon(NIM_MODIFY, &nic);
  156. }
  157. //
  158. //
  159. //