在VS6.0工程中创建系统状态栏图标显示?

VS6.0工程中创建系统状态栏图标显示?

第一步:创建自定义消息

a、在CMainFrame类的 .cpp文件中定义消息名称

#define WM_TRAY WM_USER + 103

b、在CMainFrame类的 .cpp 文件中声明消息映射

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

      //{{AFX_MSG_MAP(CMainFrame)

           // NOTE - the ClassWizard will add and remove mapping macros here.

           //    DO NOT EDIT what you see in these blocks of generated code !

      ON_WM_CREATE()

      //}}AFX_MSG_MAP

      ON_MESSAGE(WM_TRAY, OnTrayNotification)

END_MESSAGE_MAP()

c、在CmainFrmae类中手动添加 OnTrayNotification 函数的定义及实现

头文件中做函数定义

protected:

      //{{AFX_MSG(CMainFrame)

      afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

           // NOTE - the ClassWizard will add and remove member functions here.

           //    DO NOT EDIT what you see in these blocks of generated code!

      //}}AFX_MSG

      DECLARE_MESSAGE_MAP()

      LONG OnTrayNotification(WPARAM wparam, LPARAM lparam);

};

.cpp文件中做实现代码

//系统状态栏显示程序图标

LONG CMainFrame::OnTrayNotification(WPARAM wparam, LPARAM lparam)

{

      switch ( lparam )

    {

      case WM_RBUTTONDOWN:

           {

                 // 用户在托盘图标上单击鼠标右键,弹出上下文菜单隐藏/显示对话框。

                 CMenu oMenu;

                 if (oMenu.LoadMenu(IDR_MENU_TRAY))       

                 {

                       CMenu* pPopup = oMenu.GetSubMenu(0);

                       ASSERT(pPopup != NULL);

                       CPoint oPoint;

                       GetCursorPos( &oPoint );

                       SetForegroundWindow();

                       pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,oPoint.x, oPoint.y, this);

                 }

           }

            break;

      case WM_LBUTTONDBLCLK:      // 单击/双击鼠标左键均显示出对话框

      case WM_LBUTTONDOWN:

            Show();

            break;

    }

    return 0;

}

第二步:此时编译工程会提示:

D:/工作室/PDT3000系统/PDT30001/DCMS3000Main/MainFrm.cpp(125) : error C2065: 'IDR_MENU_TRAY' : undeclared identifier

D:/工作室/PDT3000系统/PDT30001/DCMS3000Main/MainFrm.cpp(138) : error C2065: 'Show' : undeclared identifier

aIDR_MENU_TRAY 是菜单资源,在ResourceView中添加新Menu,属性设置为 IDR_MENU_TRAY,可以创建相应的菜单项,如果用户右击会弹出菜单,注:如果在ID_MENU_TRAY菜单中,创建的子项ID与主菜单ID一致,便可执行同样的操作

bShow函数主要用来控制主程序的显示与隐藏,添加函数即可,实现代码如下:

void CMainFrame::Show()

{

      if ( !IsWindowVisible() )

      {

            ShowWindow(SW_SHOW);

      }

      else

      {

            ShowWindow(SW_HIDE);

      }

}

第三步:在CMainFrameOnCreate中加入下述代码,实现图标显示

      //实现系统图标的系统状态栏显示.......................................

      //

    NOTIFYICONDATA IconData;

      IconData.cbSize  =  sizeof(NOTIFYICONDATA);

      IconData.hWnd    =  this->m_hWnd;

      IconData.uID     =  IDR_MAINFRAME;

      IconData.uFlags  =  NIF_MESSAGE|NIF_ICON|NIF_TIP;

      IconData.uCallbackMessage =  WM_TRAY;

      IconData.hIcon           

           = LoadIcon(AfxGetInstanceHandle(),

            MAKEINTRESOURCE(IDR_MAINFRAME));

      strcpy(IconData.szTip, "数据采集映射子系统 3.3/n版权归 (C) 优化佳");

      ::Shell_NotifyIcon(NIM_ADD, &IconData);

//

第四步:在适当位置中加入下述代码,实现图标删除,我是在CMainFrameWM_CLOSE消息中添加的下述代码

      //在系统状态栏中删除系统托盘图标

      NOTIFYICONDATA IconData;

      IconData.cbSize  =  sizeof(NOTIFYICONDATA);

      IconData.hWnd    =  this->m_hWnd;

      IconData.uID     =  IDR_MAINFRAME;

      ::Shell_NotifyIcon(NIM_DELETE, &IconData);

 

你可能感兴趣的:(工作,优化,shell,delete,menu,macros)