您的位置:首页 > 其它

MFC程序最小化托盘显示

2013-11-17 02:16 316 查看
以单文档为例:

在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);
}
即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MFC