MFC基于对话框中, 怎么去让它最小化到系统托盘运行,点击图标后会显示出主界面?
展开全部
1:在XXXDlg.h中增加成员变量
NOTIFYICONDATA nid;
增加消息函数声明,就放在其他很多的afx_msg系列函数一起就行:
afx_msg void OnNotifyIcon(WPARAM, LPARAM);
2:在cpp中修改如下内容:
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
在以上内容段下面增加如下自定义消息定义
#define WM_NOTIFY_ICON WM_USER + 101
BEGIN_MESSAGE_MAP(CNotifyIconDlg, CDialog)
//{{AFX_MSG_MAP(CNotifyIconDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_NOTIFY_ICON, OnNotifyIcon) 在这段函数中增加这句消息映射
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
找到这段函数,并修改成这样
void CNotifyIconDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
if (nID == SC_MINIMIZE)
{
ShowWindow(SW_HIDE);
ZeroMemory(&nid, sizeof(nid));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
nid.hWnd = m_hWnd;
strcpy(nid.szTip, "提示信息");
nid.uCallbackMessage = WM_NOTIFY_ICON;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
Shell_NotifyIcon(NIM_ADD, &nid);
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
}
cpp文件末尾增加如下函数:
void CNotifyIconDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
if (lParam == WM_LBUTTONDOWN || lParam == WM_RBUTTONDOWN)
{
ShowWindow(SW_SHOW);
}
}
这个函数通过编译器的向导生成框架,并增加Shell_NotifyIcon这句
BOOL CNotifyIconDlg::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
Shell_NotifyIcon(NIM_DELETE, &nid);
return CDialog::DestroyWindow();
}
以上是VC++6.0实现
NOTIFYICONDATA nid;
增加消息函数声明,就放在其他很多的afx_msg系列函数一起就行:
afx_msg void OnNotifyIcon(WPARAM, LPARAM);
2:在cpp中修改如下内容:
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
在以上内容段下面增加如下自定义消息定义
#define WM_NOTIFY_ICON WM_USER + 101
BEGIN_MESSAGE_MAP(CNotifyIconDlg, CDialog)
//{{AFX_MSG_MAP(CNotifyIconDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_NOTIFY_ICON, OnNotifyIcon) 在这段函数中增加这句消息映射
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
找到这段函数,并修改成这样
void CNotifyIconDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
if (nID == SC_MINIMIZE)
{
ShowWindow(SW_HIDE);
ZeroMemory(&nid, sizeof(nid));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
nid.hWnd = m_hWnd;
strcpy(nid.szTip, "提示信息");
nid.uCallbackMessage = WM_NOTIFY_ICON;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
Shell_NotifyIcon(NIM_ADD, &nid);
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
}
cpp文件末尾增加如下函数:
void CNotifyIconDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
if (lParam == WM_LBUTTONDOWN || lParam == WM_RBUTTONDOWN)
{
ShowWindow(SW_SHOW);
}
}
这个函数通过编译器的向导生成框架,并增加Shell_NotifyIcon这句
BOOL CNotifyIconDlg::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
Shell_NotifyIcon(NIM_DELETE, &nid);
return CDialog::DestroyWindow();
}
以上是VC++6.0实现
追问
是成功了, 可是,可是当我想把它点出来时,鼠标放到那里 还没点 那个图标就消失了。 也不知道是不是退出了,进程里面也没有显示运行。 我是想最小化到托盘后,还可以点出来。 帮帮忙啊。 谢谢 呵呵
追答
你的通知区域的图标是自动隐藏的吗?
如果不是隐藏了,那可能是有其他的问题了,我这里测试是可以重新点出来的
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询