中文字幕天天躁日日躁狠狠躁,最近中文字幕大全免费版在线,最近2019免费中文字幕视频三,亚洲精品无码你懂的,亚洲国产精品成人精品小说

  • 相關軟件
    >VC編程制作系統(tǒng)托盤程序 創(chuàng)建者:webmaster 更新時間:2005-05-17 23:55

    Windows操作系統(tǒng)中的某些程序運行時不顯示運行窗口,只在任務欄上顯示一個圖標,表示程序正在運行,用戶可以通過鼠標與應用程序交互,比如金山毒霸等應用程序,我們有時也需要編制一些僅在后臺運行的類似程序,為了不干擾前臺程序的運行界面和不顯示不必要的窗口,應使程序運行時的主窗口不可見。同時將一個圖標顯示在任務欄右端靜態(tài)通告區(qū)中并響應用戶的鼠標動作。下面介紹Visual C++開發(fā)這類程序的設計方法。

    一、隱藏程序的主窗口

    首先,要使程序的主窗口不可見,并且不在任務欄上出現(xiàn)任務按鈕,要做到這兩點,需分別設置主邊框窗口的風格和擴展風格:

    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
     cs.style =WS_POPUP;//使主窗口不可見
     cs.dwExStyle |=WS_EX_TOOLWINDOW;//不顯示任務按鈕
     return CFrameWnd::PreCreateWindow(cs);
    }

    二、將表示程序運行的圖標加入任務欄

    在主框架窗口的CMainFrame::OnCreate()函數(shù)中調(diào)用上述函數(shù),就可以在任務條上顯示圖標這一步是利用系統(tǒng)API函數(shù)Shell_NotifyIcon()將一個圖標顯示在任務欄的通告區(qū)中。該函數(shù)的原型為:在調(diào)用該函數(shù)之前,需要確定其參數(shù)的取值。其中Shell_NotifyIcon()函數(shù)的第一個參數(shù)是一個預定義的消息,可以取如下值之一:NIM_ADD、NIM_DELETE或NIM_MODIFY,分別表示添加圖標、刪除圖標或修改圖標。另一個參數(shù)為指向NOTIFYICONDATA類型的指針。其原型為:

    typedef struct _NOTIFYICONDATA {
     DWORD cbSize;
     HWND hWnd;
     UINT uID;
     UINT uFlags;
     UINT uCallbackMessage;
     HICON hIcon;
     charszTip[64]; }
    NOTIFYICONDATA

    在該結(jié)構(gòu)的成員中,cbSize為該結(jié)構(gòu)所占的字節(jié)數(shù),hWnd為接受該圖標所發(fā)出的消息的窗口的句柄(鼠標在任務欄上程序圖標上動作時圖標將發(fā)出消息,這個消息用戶要自己定義),uID為被顯示圖標的ID,uFlags指明其余的幾個成員(hIcon、uCallBackMessage和szTip)的值是否有效,uCallbackMessage為一個用戶自定義的消息,當用戶在該圖標上作用一些鼠標動作時,圖標將向應用程序的主框架窗口(hWnd成員中指定的窗口)發(fā)出該消息,。hIcon為將在任務欄上被顯示圖標的句柄,szTip鼠標停留在該圖標上時顯示的字符串。

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
     NOTIFYICONDATA tnd;
     tnd.cbSize=sizeof(NOTIFYICONDATA);
     tnd.hWnd=this->m_hWnd;
     tnd.uID=IDR_MAINFRAME;
     tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
     tnd.uCallbackMessage=WM_MYMESSAGE;
     file://用戶自定義的消息,即鼠標在任務欄上程序圖標上動作時圖標發(fā)送的消息
     tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
     strcpy(tnd.szTip,"測試程序");//圖標提示為"測試程序"
     Shell_NotifyIcon(NIM_ADD,&tnd);//向任務欄添加圖標
    }

    三、用戶與程序交互的實現(xiàn)

    用戶進行交互,也就是當用戶在該圖標上單擊或雙擊鼠標左鍵或右鍵時要執(zhí)行相應的操作,至少也要響應用戶終止該程序的意愿。上面已經(jīng)提到,當用戶在圖標上進行鼠標動作時,將向hWnd成員中指定的窗口發(fā)出自定義的消息,該消息為uCallbackMessage成員所指定的WM_MYESSAGE,取值為WM_USER+101(如何自定義消息,我就不多說了)。我們要實現(xiàn)任務就是在hWnd窗口中響應該自定義消息:

    void CMainFrame::OnMYMESSAGE(WPARAM wParam,LPARAM lParam)
    {
     UINT uID;//發(fā)出該消息的圖標的ID
     UINT uMouseMsg;//鼠標動作
     POINT pt;
     uID=(UINT) wParam;
     uMouseMsg=(UINT) lParam;
     if(uMouseMsg==WM_RBUTTONDOWN)//如果是單擊右鍵
     {
      switch(uID)
      {
      case IDR_MAINFRAME://如果是我們的圖標
       GetCursorPos(&pt);//取得鼠標位置
       AfxGetApp( )-> m_pMainWnd->ShowWindow(SW_SHOWNORMAL);//顯示程序窗口
       break;
       default:
      }
     }
     return;
    }

    四、程序結(jié)束時刪除程序圖標

    當程序結(jié)束時,需要刪去通告區(qū)中的圖標,這時還應該調(diào)用Shell_NotifyIcon函數(shù),只不過第一個參數(shù)是表示刪除圖標的NIM_DELETE了:

    void CMainFrame::~CmainFrame()
    {
     NOTIFYICONDATA tnid;
     tnid.cbSize=sizeof(NOTIFYICONDATA);
     tnid.hWnd=this->m_hWnd;
     tnid.uID=IDR_MAINFRAME;//保證刪除的是我們的圖標
     Shell_NotifyIcon(NIM_DELETE,&tnid);
    }

    上述實現(xiàn)步驟可以實現(xiàn)托盤程序,筆者在開發(fā)的IC卡程序中就應用了以上技術(shù),希望可以對朋友們有所幫助。
    相關文章
    本頁查看次數(shù):