使用vc,如何实现出现在任务栏中的图标可以闪烁,或者换图标,类似qq.

解决方案 »

  1.   

    你可以参考 abstractspoon.com 的ToDoList的源代码中有个CTrayIcon类
      

  2.   

    //任务栏图标窗口的回调函数
    LRESULT CALLBACK myboleProc(
      HWND hwnd,        // handle to window
      UINT useMsg,      // message identifier
      WPARAM wParam,    // first message parameter
      LPARAM lParam     // second message parameter
    )
    {
    switch(useMsg)
    {
    case WM_TIMER:
         
    switch(wParam)
    {
    case 1:
    g_iWhichIcon = !g_iWhichIcon;
    NOTIFYICONDATA  nid;
    nid.cbSize = sizeof( NOTIFYICONDATA );
    nid.hWnd = hwnd;
    nid.uID = IDI_MYICON;
    nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    nid.uCallbackMessage = WM_SYSTEMTRAY;
    nid.hIcon =  ::LoadIcon(g_hInstance,MAKEINTRESOURCE( g_iWhichIcon ?  IDI_MYICON : IDI_MYICON2)  );
    strcpy((nid.szTip),"AccessControlService收到控制器发给监控管理模块的数据\n请确认监控管理模块是否已经正常运行");
    Shell_NotifyIcon(NIM_MODIFY ,&nid);
    break;
    case 2:
    g_iWhichIcon = !g_iWhichIcon;
    NOTIFYICONDATA  nid4;
    nid4.cbSize = sizeof( NOTIFYICONDATA );
    nid4.hWnd = hwnd;
    nid4.uID = IDI_ICON1;
    nid4.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    nid4.uCallbackMessage = WM_SYSTEMTRAY;
    nid4.hIcon =  ::LoadIcon(g_hInstance,MAKEINTRESOURCE( g_iWhichIcon ?  IDI_ICON1 : IDI_ICON2)  );
    strcpy((nid4.szTip),"AccessControlService收到控制器发给物业管理模块的数据\n请确认物业管理模块是否已经正常运行");
    Shell_NotifyIcon(NIM_MODIFY ,&nid4);
    break;
    }
    break; // 向任务栏添加图标-监控中心报警
    case WM_ADDTRAYICON:
    //MessageBox(NULL,"添加图表1的消息","",0 | 0x00200000L);
    NOTIFYICONDATA  nid2;
    nid2.cbSize = sizeof( NOTIFYICONDATA );
    nid2.hWnd   = hTrayIconDlghWnd;
    nid2.uID    = IDI_MYICON;
    nid2.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    nid2.uCallbackMessage = WM_SYSTEMTRAY;
    nid2.hIcon =  ::LoadIcon( g_hInstance,MAKEINTRESOURCE(IDI_MYICON));
    strcpy(nid2.szTip,"AccessControlService");
    Shell_NotifyIcon(NIM_ADD,&nid2);
    SetTimer(hwnd,1,350,NULL);
    g_TrayIcon1hascreate = true;
    break;

    // 向任务栏添加图标2--物业中心报警
    case WM_ADDTRAYICON1:
    //MessageBox(NULL,"添加图表2的消息","",0 | 0x00200000L);
    NOTIFYICONDATA  nid3;
    nid3.cbSize = sizeof( NOTIFYICONDATA );
    nid3.hWnd   = hTrayIconDlghWnd;
    nid3.uID    = IDI_ICON1;
    nid3.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    nid3.uCallbackMessage = WM_SYSTEMTRAY;
    nid3.hIcon =  ::LoadIcon( g_hInstance,MAKEINTRESOURCE(IDI_ICON1));
    strcpy(nid3.szTip,"AccessControlService物业模块");
    Shell_NotifyIcon(NIM_ADD,&nid3);
    SetTimer(hwnd,2,250,NULL);
    g_TrayIcon2hascreate = true;
    break;
       
    // 从任务栏删除监控模块图标
        case WM_DELTRAYICON1:
    // MessageBox(NULL,"收到删除图表1的消息","",0 | 0x00200000L);
    NOTIFYICONDATA  nid1;
    nid1.cbSize = sizeof( NOTIFYICONDATA );
    nid1.hWnd = hwnd;
    nid1.uID = IDI_MYICON;
    nid1.uFlags = 0;
    Shell_NotifyIcon(NIM_DELETE,&nid1);
    ::KillTimer(hwnd,1);
    g_TrayIcon1hascreate = false;
    break; // 从任务栏删除物业模块图标
        case WM_DELTRAYICON2:
    //MessageBox(NULL,"收到删除图表2的消息","",0 | 0x00200000L);
    NOTIFYICONDATA  nid5;
    nid5.cbSize = sizeof( NOTIFYICONDATA );
    nid5.hWnd = hwnd;
    nid5.uID = IDI_ICON1;
    nid5.uFlags = 0;
    Shell_NotifyIcon(NIM_DELETE,&nid5);
    ::KillTimer(hwnd,2);
    g_TrayIcon2hascreate = false;
    break;

    default:
    return DefWindowProc(hwnd,useMsg,wParam,lParam);
    }
    return 0;
    }
      

  3.   

    用两个图标,在定时器中交替LoadIcon
      

  4.   

    you can use SetTimer() to create WM_TIMER message and replace currently ico in the OnTimer() .you are welcome.....