C++讓你的任務欄圖標動起來

字號:

在windows環(huán)境下上網(wǎng)時,你有沒有注意到在屏幕的右下腳的任務欄上有一個動畫圖標呢?它一閃一閃的,形象的表示出網(wǎng)絡此時正在傳輸數(shù)據(jù)。關于任務欄圖標編程的文章有不少,可是如何才能編制出動態(tài)圖標呢?在C++Builder中可以比較方便的實現(xiàn)?! ?BR>    ---- 其基本編程思路是:通過設置Timer時鐘控件使應用程序在規(guī)定的時間間隔內(nèi)發(fā)送特定的消息,使任務欄圖標不斷更改,從而形成動畫效果。實現(xiàn)方法為在應用程序的表單中加載幾個Image控件,使他們裝載相應的圖畫,幾幅圖畫按順序連續(xù)的被顯示,就形成了動畫?! ?BR>    ---- 在這里,我們用一個門的開關動畫來做例子,在表單上放置一個Timer控件,兩個Image,分別裝載“開門”和“關門”兩幅圖。開始加入代碼。
    ---- 應用程序必須用發(fā)送消息的辦法通知任務欄增加,刪除,和修改圖標。發(fā)送消息必須調(diào)用Shell_NotifyIcon。它的原形為:  
    WINSHELLAPI BOLL WINAPI Shell_NotifyIcon(
    DWORD dwMessage, POINTIFYCONDATA pnid);  
    第一個參數(shù) dwMessage是發(fā)送消息的標志,可以選
    NIM_ADD // 往任務欄通知區(qū)添加圖標
    NIM_DELETE //往任務欄通知區(qū)刪除圖標
    NIM_MODIFY //通知任務欄通知區(qū)修改圖標  
    編制消息發(fā)送函數(shù)TrayMessage
    bool __fastcall TForm1::TrayMessage(DWORD dwMessage)
    {
     NOTIFYICONDATA tnd;
     PSTR pszTip;
     pszTip = TipText();
     tnd.cbSize= sizeof(NOTIFYICONDATA);
     //結(jié)構(gòu)的大小
     tnd.uCallbackMessage = MYWM_NOTIFY;
     //自定義回調(diào)消息,在頭文件中聲明
     tnd.hWnd= Handle;
     //接受回調(diào)消息的窗口句柄
     tnd.uID = IDC_MYICON;
     //圖標標志號
    tnd.uFlags= NIF_MESSAGE   NIF_ICON   NIF_TIP;
    //指定以下三個參數(shù)哪個包含有效數(shù)據(jù)
     if (dwMessage == NIM_MODIFY)
     {
     tnd.hIcon =
    (HICON)IconHandle(); //取得圖標句柄
     if (pszTip)
     lstrcpyn(tnd.szTip, pszTip,
    sizeof(tnd.szTip));
     else
     tnd.szTip[0] = ’\0’;
     }
     else
     {
     tnd.hIcon = NULL;
     tnd.szTip[0] = ’\0’;
     }
     return (Shell_NotifyIcon(dwMessage, &tnd));
    }
    編制取得圖標句柄的函數(shù)
    HICON __fastcall TForm1::IconHandle(void)
    {
    if (n==1)
    { return (Image1- >Picture->Icon- >Handle);
     //n是全局變量,1為顯示Image1,0為Image2
     }
     else
     { return (Image2- >Picture- >Icon- >Handle);
     }
    }
    編制圖標狀態(tài)轉(zhuǎn)換函數(shù)  
    void __fastcall TForm1::ToggleState(void)
    {
     if (n==1) //n為圖標句柄鎖,是全局變量,
    1為顯示Image1,0為Image2
     {
     n=n-1;
     }
     else
     {
     n=n+1;
     }
     TrayMessage(NIM_MODIFY);
     //發(fā)送圖標變換消息
    }  
    對Timer控件編制代碼,設它的Interval
    屬性為1000,即定時器每一秒響應一次。為 Ontimer
    事件鍵入代碼:  
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    { ToggleState( );
     }
    ---- 由于篇幅有限,以上只列出了基本部分的代碼,其他功能的實現(xiàn),如關閉程序,打開窗口等,比較簡單,不在贅述。程序運行時,你將看到在屏幕的右下角任務欄有一扇門打開又關閉的動畫圖標。是不是很有趣,快編一個你喜歡的吧