• 托盘程序开发


    托盘程序

    OninitDialog()

    在主界面的OninitDialog()函数里添加代码

    
    BOOL CMFC07trayiconDlg::OnInitDialog()
    {
    
    	// TODO: 在此添加额外的初始化代码
    	NOTIFYICONDATA m_tnid;
    
    	m_tnid.cbSize = sizeof(NOTIFYICONDATA);//设置结构大小// 
    	m_tnid.hWnd = this->m_hWnd;//设置图标对应的窗口 
    	m_tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;//图标属性 
    	m_tnid.uCallbackMessage = WM_ICON_NOTIFY;//应用程序定义的回调消息ID
    
    	CString szToolTip;
    	szToolTip = _T("INeed 客户端程序");
    	_tcscpy_s(m_tnid.szTip, szToolTip);//帮助信息 
    	m_tnid.uID = IDR_MAINFRAME;//应用程序图标  
    	m_tnid.hIcon = m_hIcon;//图标句柄 
    	PNOTIFYICONDATA m_ptnid = &m_tnid;
    	::Shell_NotifyIcon(NIM_ADD, m_ptnid);//增加图标到系统盘
    
    
    }
    
    

    定义一个自定义的消息。代码放在主界面【.CPP】文件顶部。

    #define		WM_ICON_NOTIFY	WM_USER+100
    

    关闭程序后自动关闭托盘

    在主界面对话框中的【属性】-【消息】选项卡里的【WM_CLOSE】添加一OnClose()函数,在程序关闭后,关闭托盘。

    
    void CMFC07trayiconDlg::OnClose()
    {
    
    	// TODO: Add your message handler code here and/or call default
    
    	NOTIFYICONDATA   nd = { 0 };
    	nd.cbSize = sizeof(NOTIFYICONDATA);
    	nd.hWnd = m_hWnd;
    	nd.uID = IDR_MAINFRAME;
    	nd.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    	nd.uCallbackMessage = WM_ICON_NOTIFY;
    	nd.hIcon = m_hIcon;
    	Shell_NotifyIcon(NIM_DELETE, &nd);
    	
    	CDialogEx::OnClose();
    }
    

    托盘最小化支持

    在【属性】-【Minimize Box】设置为【True】。设置为支持最小化按钮。

    在OnSyscommand()函数里,在最后的位置加入

    	if(nID == SC_MINIMIZE)
    	{
    		ShowWindow(FALSE); //隐藏窗口
    	}
    

    OnSysCommand()代码。

    void CMFC07trayiconDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialogEx::OnSysCommand(nID, lParam);
    	}
    	if (nID == SC_MINIMIZE)
    	{
    		ShowWindow(FALSE); //隐藏窗口
    	}
    }
    

    定义消息,托盘菜单实现

    在MFC主界面的CPP文件代码里找到【BEGIN_MESSAGE_MAP(CMFC07trayiconDlg, CDialogEx)】这个宏,往里面添加【ON_MESSAGE(WM_ICON_NOTIFY, OnTrayNotification)】,实现之前自定义消息的宏。

    BEGIN_MESSAGE_MAP(CMFC07trayiconDlg, CDialogEx)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_WM_CLOSE()
    	ON_MESSAGE(WM_ICON_NOTIFY, OnTrayNotification)  // 添加的代码
    END_MESSAGE_MAP()
    

    在主界面的【.h】文件里声明函数OnTrayNotification()

    LRESULT OnTrayNotification(WPARAM wParam, LPARAM lParam);
    

    定义代码:

    响应鼠标的左键和右键消息。

    LRESULT CMFC07trayiconDlg::OnTrayNotification(WPARAM wParam, LPARAM lParam)
    {
    	switch (lParam)
    	{
    	case WM_LBUTTONDOWN:
    	{
    		AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
    		SetForegroundWindow();
    		break;
    	}
    	case WM_RBUTTONUP:
    	{
    		POINT point;
    		HMENU hMenu, hSubMenu;
    		GetCursorPos(&point); //鼠标位置
    		hMenu = LoadMenu(NULL,
    			MAKEINTRESOURCE(IDR_MENU_TRAY)); // 加载菜单
    		hSubMenu = GetSubMenu(hMenu, 0);//得到子菜单(因为弹出式菜单是子菜单)
    		SetForegroundWindow(); // 激活窗口并置前
    
    		TrackPopupMenu(hSubMenu, 0,
    			point.x, point.y, 0, m_hWnd, NULL);
    
    	}
    	}
    	return LRESULT();
    }
    

    IDR_MENU_TRAY是加载了一个菜单,所以要自己自定义【恢复 ID_TRAY_RESTORE】、【退出 ID_TRAY_EXIT】

    【恢复 ID_TRAY_RESTORE】,OnTrayRestore()

    void CmyfirstmfcDlg::OnTrayRestore()
    {
    	AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
    	SetForegroundWindow();
    }
    

    【退出 ID_TRAY_EXIT】,OnTrayExit()

    
    void CMFC07trayiconDlg::OnTrayExit()
    {
    	// TODO: 在此添加命令处理程序代码
    	OnClose();
    }
    
    
  • 相关阅读:
    IOS-在ARC项目中使用非ARC框架或者类库
    IOS-Social.framework
    IOS- 单例
    IOS-二维码的实现
    IOS-JSON & XML解析
    SCOI2011 地板 (BZOJ2331)
    Formula 1(URAL1519)
    Tour in the Castle(ZOJ3256 矩阵加速插头dp)
    Tony's tour(poj1739,男人题之一,插头dp)
    POJ3133(插头dp)
  • 原文地址:https://www.cnblogs.com/17bdw/p/10354679.html
Copyright © 2020-2023  润新知