MFC程序最小化托盘显示

以单文档为例:

在CMainFrame中定义全局变量:

#define WM_MY_MESSAGE (WM_USER+101)

NOTIFYICONDATA  ntf;

消息映射如下:

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_MESSAGE(WM_MY_MESSAGE, OnMessage)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

protected:
	//{{AFX_MSG(CMainFrame)
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//	afx_msg void OnSetFocus(CWnd *pOldWnd);
	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg LRESULT OnMessage(WPARAM wParam, LPARAM lParam);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

自定义消息如下:

CMainFrame::~CMainFrame()
{
	Shell_NotifyIcon(NIM_DELETE,&ntf);
	WriteLog("守护程序已退出!");
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	// create a view to occupy the client area of the frame
	if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
		CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
	{
		TRACE0("Failed to create view window\n");
		return -1;
	}

	AutoStart();

	ntf.cbSize=sizeof(NOTIFYICONDATA);
	ntf.hWnd=this->m_hWnd;
	ntf.uID=IDR_MAINFRAME;
	ntf.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_WDG));//IDR_MAINFRAME));
	strcpy(ntf.szTip,"INMS监控客户端");
	ntf.uCallbackMessage=WM_MY_MESSAGE;
	ntf.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;  

	Shell_NotifyIcon(NIM_ADD,&ntf);
	m_watchThread=AfxBeginThread(WatchThread,(LPVOID)NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);

	return 0;
}

初始化如下:

LRESULT  CMainFrame::OnMessage(WPARAM wparam,LPARAM lparam)
{
	switch(lparam) 
	{
	case WM_LBUTTONDOWN:
		{
			if(wparam==IDR_MAINFRAME)
			{
				POINT pt;
				GetCursorPos(&pt);
				AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
				SetForegroundWindow();
				break;
			}
	} break;
	case WM_RBUTTONUP:
		{
			POINT point;
			HMENU hMenu, hSubMenu;
			GetCursorPos(&point); //鼠标位置
			hMenu = LoadMenu(NULL, MAKEINTRESOURCE(IDR_MENU)); 
			hSubMenu = GetSubMenu(hMenu, 0);//得到子菜单(因为弹出式菜单是子菜单)
			SetMenuDefaultItem(hSubMenu, -1, FALSE);//设置缺省菜单项,-1为无缺省项
			SetForegroundWindow(); // 激活窗口并置前
			
			CMainFrame::m_bAutoMenuEnable=FALSE;     //这句就是用来使用菜单项有效的.
			int n = TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_LEFTALIGN|TPM_RETURNCMD, point.x, point.y, 0, m_hWnd, NULL);
			
			switch(n)            //上面返回的n值,当没有选中任何菜单项时,为0,否则,为被选中项的ID.
			{
			case IDM_EXIT:                                            
				bExitThread=true;
				ExitMyProcess();
				SendMessage(WM_CLOSE,0,0);
				break;
			}
		}
	}
	return 0;
}

void CMainFrame::OnSize(UINT nType, int cx, int cy) 
{
	CFrameWnd::OnSize(nType, cx, cy);
	if (SIZE_MINIMIZED==nType) 
		ShowWindow(SW_HIDE);
}
即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值