zoukankan      html  css  js  c++  java
  • 托盘程序开发

    托盘程序

    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();
    }
    
    
  • 相关阅读:
    Big Data Resources on the AWS Knowledge Center[Classic]
    New AWS Certification Specialty Exam for Big Data [Classic]
    什么是数据湖?【经典】What is Data Lake? [Classic]
    Build a Data Lake Foundation with AWS Glue and Amazon S3
    如何优雅的关闭Java线程池
    聊聊jstack的工作原理
    类成员变量在哪里分配
    内存那点事
    Java Class文件格式详解
    一个多年互联网从业者,对刚入职场人最真诚的忠告
  • 原文地址:https://www.cnblogs.com/17bdw/p/10354679.html
Copyright © 2011-2022 走看看