青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

我住包子山

this->blog.MoveTo("blog.baozishan.in")

[一篇VC小文章]VC++制作一個最小化最小托盤的8步驟(Minimize your app to systray in 8 easy steps)翻譯完

Minimize your app to systray in 8 easy steps

By Yasar Arslan. From codeproject




這篇文章內(nèi)容比較基礎(chǔ),最近看到覺得有用,順便翻譯一下
有空可以寫一個自己的TrayIcon類,化簡這些原始的操作。

Introduction

這篇文章解析了 Shell_NotifyIcon 這個函數(shù)用法--用來建立你自己的應(yīng)用程序的系統(tǒng)托盤圖標(biāo).
這篇文章給了基本的縮小到托盤的操作過程并讓你從中了解.
這篇文章提供8個簡單的步驟讓你成功的實現(xiàn)在你的程序中建立系統(tǒng)托盤圖標(biāo).
源代碼提供了一個基于對話框的演示程序.

Tray Icons

為了用托盤圖標(biāo)你需要用一個shell函數(shù) :)

BOOL Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid );

The dwMessage?可選的參數(shù)包括 the NIM_ADD,NIM_DELETE and NIM_MODIFY功能分別是添加刪除以及修改圖標(biāo)于系統(tǒng)圖標(biāo).

PNOTIFYICONDATA 結(jié)構(gòu)包括這些系統(tǒng)需要處理的任務(wù)圖標(biāo)狀態(tài)區(qū)域消息等信息.
typedef??struct _NOTIFYICONDATA {
??? DWORD cbSize;
??? HWND hWnd;
??? UINT uID;
??? UINT uFlags;
??? UINT uCallbackMessage;
??? HICON hIcon;
??? #if (_WIN32_IE < 0x0500)
??????? TCHAR szTip[64];
??? #else
??????? TCHAR szTip[128];
??? #endif??? #if (_WIN32_IE >= 0x0500)
??????? DWORD dwState;
??????? DWORD dwStateMask;
??????? TCHAR szInfo[256];
??????? union {
??????????? UINT? uTimeout;
??????????? UINT? uVersion;
??????? } DUMMYUNIONNAME;
??????? TCHAR szInfoTitle[64];
??????? DWORD dwInfoFlags;
??? #endif??? #if (_WIN32_IE >= 0x600)
??????? GUID guidItem;
??? #endif
} NOTIFYICONDATA, *PNOTIFYICONDATA;

*Note:?更完全的信息可以去參考MSDN

Creating the Application

Create a new VC++ dialog based project and call it TrayMin.
創(chuàng)建一個名叫TrayMin的基于對話框的VC++工程

Step: 1

自定義消息于 TrayMinDlg.h 頭文件.

				#define WM_TRAY_MESSAGE (WM_USER + 1)
		

The WM_USER 常量用來幫助用戶定義自己的消息被用來建立個人的窗口類, 定義時通常用這種格式 WM_USER+X,?這里 X 是一個整形變量.

*更詳細(xì)的看MSDN

Step: 2

現(xiàn)在在Now add the DECLARE_MESSAGE_MAP() 之前添加下面的用戶函數(shù)吧( TrayMinDlg.h file)?? afx_msg void OnTrayNotify(WPARAM wParam, LPARAM lParam);
?


當(dāng)添加一個圖標(biāo)到托盤時這有一個圖標(biāo)的回調(diào)消息,注意到 NOTIFYICONDATA 結(jié)構(gòu)中有uCallbackMessage成員是回調(diào)消息識別的關(guān)鍵,它會被傳給NIM_ADD(我們之后將會見到更詳細(xì)的)。當(dāng)添加托盤圖標(biāo)這個事件發(fā)生時,系統(tǒng)發(fā)送一個回調(diào)函數(shù)到由hWnd成員對象指定的窗口過程(winproc),wParam 參數(shù)可以用來被識別究竟發(fā)生了什么操作。lParam參數(shù)存放發(fā)生事件相關(guān)的鼠標(biāo)或者鍵盤消息。舉個例子,當(dāng)一個鼠標(biāo)指針指向一個托盤圖標(biāo),lParam將包括WM_MOUSEMOVE

Step: 3


現(xiàn)在添加下面的這行在消息宏中(MessageMap)在TrayMinDlg.cpp

ON_MESSAGE(WM_TRAY_MESSAGE,OnTrayNotify)
?

現(xiàn)在應(yīng)該是這樣的.

    BEGIN_MESSAGE_MAP(CTrayMinDlg, CDialog)
      //{{AFX_MSG_MAP(CTrayMinDlg)
      ON_WM_SYSCOMMAND()
      ON_WM_PAINT()
      ON_WM_QUERYDRAGICON()
      ON_MESSAGE(WM_TRAY_MESSAGE ,OnTrayNotify)
      //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

  

Step: 4

現(xiàn)在在TrayMinDlg.cpp 定義OnTrayNotify函數(shù),不要忘記在函數(shù)頭部添加afx_msg。

  afx_msg void CTrayMinDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam)
  {
    UINT uID; 
    UINT uMsg; 
 
    uID = (UINT) wParam;
    uMsg = (UINT) lParam; 
 
  
    if (uID != 1)
      return;
  
    CPoint pt;  
  
  
    switch (uMsg ) 
    { 

    case WM_LBUTTONDOWN:
      GetCursorPos(&pt);
      ClientToScreen(&pt);
      OnTrayLButtonDown(pt);
      break;
  
    case WM_RBUTTONDOWN:
    case WM_CONTEXTMENU:
      GetCursorPos(&pt);
      OnTrayRButtonDown(pt);
      break;

    } 
    return; 
  }
  

Step: 5

現(xiàn)在在TrayMinDlg類添加兩個成員函數(shù)來相應(yīng)鼠標(biāo)事件。

實現(xiàn)鼠標(biāo)左鍵單擊的相應(yīng)

  • 函數(shù)類型:void ?
  • 函數(shù)聲明:?OnTrayLButtonDown(CPoint pt)

實現(xiàn)鼠標(biāo)右鍵單擊的相應(yīng)

  • 函數(shù)類型: void
  • 函數(shù)聲明: OnTrayRButtonDown(CPoint pt)

OnTrayLButtonDown(CPoint pt)的定義如下.

				void CTrayMinDlg::OnTrayLButtonDown(CPoint pt)
    {  
      MessageBox("You have clicked Left mouse Button ");
    }
  

The Declaration of OnTrayRButtonDown(CPoint pt) is as following.

				void CTrayMinDlg::OnTrayRButtonDown(CPoint pt)
    {  
      //m_menu is the member of CTrayMinDlg as CMenu m_menu;
      m_menu.GetSubMenu(0)->TrackPopupMenu(TPM_BOTTOMALIGN|
       TPM_LEFTBUTTON|TPM_RIGHTBUTTON,pt.x,pt.y,this);      
    }
  

Step: 6

Add two member variable to the CTrayMinDlg.
為CTrayMinDlg添加兩個成員變量

  • Variable Type: NOTIFYICONDATA
  • Variable Name: m_TrayData;
  • Variable Type: CMenu
  • Variable Name: m_menu;


現(xiàn)在添加菜單資源

Step: 7

現(xiàn)在畫一個最小化的按鈕在對話框設(shè)計中
并且添加這個按鈕的執(zhí)行函數(shù)
void CShellDlg::OnMinimize() 
  {
    m_TrayData.cbSize = sizeof(NOTIFYICONDATA);
    //Size of this structure, in bytes. 
    
    
    m_TrayData.hWnd  = this->m_hWnd;
    //Handle to the window that receives notification //messages associated with an icon in the taskbar //status area. The Shell uses hWnd and uID to //identify which icon to operate on when //Shell_NotifyIcon is invoked. 
  
    m_TrayData.uID = 1;
    //Application-defined identifier of the taskbar icon.//The Shell uses hWnd and uID to identify which icon //to operate on when Shell_NotifyIcon is invoked. You// can have multiple icons associated with a single //hWnd by assigning each a different uID. 

    m_TrayData.uCallbackMessage  = WM_TRAY_MESSAGE;
    //Application-defined message identifier. The system //uses this identifier to send notifications to the //window identified in hWnd. These notifications are //sent when a mouse event occurs in the bounding //rectangle of the icon, or when the icon is selected //or activated with the keyboard. The wParam parameter //of the message contains the identifier of the taskbar //icon in which the event occurred. The lParam parameter //holds the mouse or keyboard message associated with the// event. For example, when the pointer moves over a //taskbar icon, lParam is set to WM_MOUSEMOVE. 
    


    m_TrayData.hIcon = this->m_hIcon;
    //Handle to the icon to be added, modified, or deleted
    
    strcpy(m_TrayData.szTip,"My Icon");
    //Pointer to a null-terminated string with the text //for a standard ToolTip. It can have a maximum of 64 //characters including the terminating NULL. 
    
    
    m_TrayData.uFlags = NIF_ICON|NIF_MESSAGE;
    //Flags that indicate which of the other members contain 
    valid data.  
  

    BOOL bSuccess = FALSE;
    BOOL BSus = FALSE;

    BSus = m_menu.LoadMenu(IDR_MENU1);
    if(!(BSus))
      MessageBox("Unabled to Loa menu");

    bSuccess = Shell_NotifyIcon(NIM_ADD,&m_TrayData);

    if(!(bSuccess))
      MessageBox("Unable to Set Tary Icon");
    else
    {
      this->ShowWindow(SW_MINIMIZE);
      this->ShowWindow(SW_HIDE);

    }
  }
  
  

Step: 8


在退出菜單的執(zhí)行函數(shù)寫下如下

Shell_NotifyIcon(NIM_DELETE,&m_TrayData);
? DestroyWindow();


現(xiàn)在可以運行程序,并且嘗試最小化按鈕的使用(他會最小化導(dǎo)系統(tǒng)托盤)。
現(xiàn)在盡情發(fā)揮,完善這些步驟,完成自己的系統(tǒng)托盤圖標(biāo)吧!

Yasar Arslan

posted on 2007-03-06 19:06 Gohan 閱讀(1905) 評論(0)  編輯 收藏 引用 所屬分類: C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜精品国产精品大乳美女| 久久精品国产久精国产爱| 久久久久久色| 欧美亚洲一区在线| 国内成人精品一区| 另类春色校园亚洲| 欧美不卡高清| 一区二区三区视频在线观看| 亚洲欧洲精品一区| 欧美日韩中文字幕在线视频| 亚洲尤物在线视频观看| 午夜精品一区二区三区在线| 国产亚洲二区| 欧美高清视频在线| 国产精品成人一区二区三区夜夜夜 | 久久国产婷婷国产香蕉| 久久www免费人成看片高清| 亚洲大胆人体在线| 亚洲美女中文字幕| 国产原创一区二区| 91久久精品美女高潮| 国产精品s色| 久久一区视频| 欧美日韩国产另类不卡| 久久国产精品亚洲va麻豆| 久久久亚洲人| 亚洲综合色网站| 久久综合久久综合这里只有精品| 日韩一二三在线视频播| 亚洲欧美成人精品| 亚洲久久成人| 欧美在线影院| 宅男噜噜噜66一区二区66| 欧美中文字幕精品| 亚洲新中文字幕| 久久一区二区视频| 欧美亚洲综合在线| 欧美精品一区二区视频| 久久精品国内一区二区三区| 欧美日韩国产黄| 免费久久精品视频| 国产日本欧美视频| 99精品视频免费观看| 在线观看欧美亚洲| 欧美一级大片在线免费观看| 一区二区三区高清不卡| 久久久久久久一区二区| 欧美亚洲一区二区在线| 欧美精品一区三区| 老司机精品视频网站| 国产精品亚洲综合天堂夜夜| 亚洲精品视频在线观看免费| 在线成人激情| 久久精品一区二区三区四区 | 一区二区三区三区在线| 久久综合九色综合欧美就去吻| 亚洲欧美日韩综合国产aⅴ| 欧美超级免费视 在线| 毛片av中文字幕一区二区| 国产精品色婷婷| 中日韩视频在线观看| 在线一区二区三区四区五区| 欧美成人一区二免费视频软件| 另类综合日韩欧美亚洲| 国产在线精品二区| 性做久久久久久免费观看欧美| 亚洲字幕在线观看| 欧美午夜电影网| 一区二区三区精品视频| 亚洲婷婷综合久久一本伊一区| 欧美精品久久一区二区| 亚洲精品1区| 亚洲视频免费观看| 欧美视频日韩| 亚洲欧美日韩综合aⅴ视频| 欧美一级播放| 国产一区视频在线看| 久久久久国产一区二区三区| 久久综合九色欧美综合狠狠| 在线欧美日韩| 欧美激情精品久久久久久蜜臀 | 久久男人av资源网站| 久久综合色天天久久综合图片| 在线观看日韩欧美| 美女图片一区二区| 日韩五码在线| 性伦欧美刺激片在线观看| 国产亚洲电影| 久久香蕉国产线看观看网| 亚洲国产欧美日韩另类综合| 一本色道久久99精品综合| 国产精品国产三级欧美二区| 午夜视频在线观看一区| 男女激情久久| 亚洲色诱最新| 极品尤物av久久免费看| 欧美日韩国产在线播放网站| 亚洲午夜91| 欧美 日韩 国产 一区| 99精品久久久| 国产午夜精品麻豆| 欧美精品激情在线观看| 亚洲欧美精品在线观看| 欧美国产日韩免费| 亚洲欧美日韩国产中文 | 国产精品久久久久久久9999| 欧美亚洲一区二区在线| 亚洲人成人一区二区在线观看| 欧美一级欧美一级在线播放| 亚洲第一精品夜夜躁人人躁| 欧美日韩在线第一页| 久久久九九九九| 一区二区三区av| 欧美国产日韩视频| 久久精品论坛| 亚洲一区二区四区| 91久久久亚洲精品| 国产综合在线看| 国产精品久久久91| 欧美精品大片| 久久手机精品视频| 欧美一区二区三区四区在线| 亚洲人成久久| 欧美福利视频在线观看| 欧美主播一区二区三区| 一本色道久久88精品综合| 在线精品一区| 韩日视频一区| 国产亚洲成av人片在线观看桃 | 欧美福利一区二区三区| 久久精品国产精品亚洲| 亚洲欧美另类综合偷拍| 99亚洲伊人久久精品影院红桃| 亚洲摸下面视频| 久久亚洲综合色| 久久精品毛片| 亚洲视频在线一区| 精品成人一区二区三区四区| 免费美女久久99| 久久久91精品国产| 欧美在线精品一区| 亚洲欧美www| 亚洲欧美在线视频观看| 亚洲一区视频| 亚洲一级特黄| 亚洲摸下面视频| 亚洲欧美精品伊人久久| 午夜精品视频在线观看| 亚洲一级二级| 欧美一区二区三区视频| 欧美一区二区三区久久精品茉莉花 | 欧美精品一区三区| 欧美精品免费在线观看| 欧美激情精品久久久久久免费印度| 久久久久久黄| 国产精品网站在线观看| 欧美日本国产| 国产精品福利久久久| 国产精品久久久久久久浪潮网站| 欧美日韩的一区二区| 欧美午夜电影在线观看| 国产精品高清一区二区三区| 国产精品久久亚洲7777| 国产日韩一区二区三区| 国内精品美女在线观看| 亚洲东热激情| av成人老司机| 久久精品99久久香蕉国产色戒| 久久久精彩视频| 亚洲电影在线看| 一本色道久久综合亚洲91| 亚洲欧美视频在线观看| 狼狼综合久久久久综合网| 欧美精品国产一区二区| 国产九区一区在线| 亚洲黄色一区二区三区| 亚洲午夜久久久久久尤物| 久久精品日韩一区二区三区| 男女av一区三区二区色多| 日韩一区二区精品| 欧美一区二区在线视频| 欧美精品成人91久久久久久久| 国产精品丝袜xxxxxxx| 在线 亚洲欧美在线综合一区| 一区二区成人精品| 久久免费一区| 日韩视频一区二区三区| 久久久www免费人成黑人精品 | 久久久一区二区| 欧美日韩精品在线视频| 狠狠久久亚洲欧美专区| 亚洲视频一区在线| 欧美ed2k| 欧美一区国产在线| 国产精品久久久久永久免费观看| 在线观看日韩一区| 久久成人精品电影| 中日韩视频在线观看| 欧美大片在线观看一区| 韩国在线一区|