怎么设置程序启动后最小化到托盘? 50
设了个自启动的程序,运行方式最小化,也设置了最小化到托盘。但启动后会先最小化到桌面下方,要打开在点击最小化才会到托盘。怎么设置程序启动后自动最小化到托盘?...
设了个自启动的程序,运行方式最小化,也设置了最小化到托盘。但启动后会先最小化到桌面下方,要打开在点击最小化才会到托盘。怎么设置程序启动后自动最小化到托盘?
展开
2个回答
展开全部
要实现将程序最小化到托盘,就要截获WM_SIZE消息,并作出相应的消息响应。(WM_SIZE在窗口大小改变时被抛出)
可以重载OnSize()方法,实现托盘图标。
数据结构NOTIFYICONDATA用来储存托盘图标的信息,结构如下:
typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
WCHAR szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;
首先要在对话凳绝升框类中加入NOTIFYICONDATA变量枣老:
NOTIFYICONDATA nid;
然后要在OnInitDialog()中对nid进行一些初始化:
nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA); //数据的大小
nid.hWnd = this->GetSafeHwnd(); //获取当前窗口句宏并柄
nid.uID = 100; //指定该nid的ID
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ; //定义图标的属性:图标有效|自定义消息有效|鼠标指向显示文字有效
nid.uCallbackMessage = WM_TRAYICON_RESTORE; //定义CALLBACK消息名称,用来响应对托盘图标的操作
nid.hIcon = m_hIcon; //指定显示的图标
wcscpy(nid.szTip, _T("TrayIcon")); //鼠标指向图标时的提示框
当然在头文件中要定义好WM_TRAYICON_RESTORE,
#defined WM_TRAYICON_RESTORE WM_USER+101 //这个值一般要大于100
重载OnSize()方法,假如对话框类是CTrayIconDlg;
void CTrayIconDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (nType==SIZE_MINIMIZED) //如果事件为最小化
{
Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标
ShowWindow(SW_HIDE); //隐藏主窗口
}
}
运行程序,最小化窗口,是不是成功将窗口藏到系统托盘了。
现在还不能让程序窗口还原,无论单击,双击小图标都没反应,那是因为没有对其消息进行处理。
首先在CTrayIconDlg类中加入方法:
afx_msg LRESULT OnRestore(WPARAM wParam, LPARAM lParam);
实现如下:
LRESULT CTrayIconDlg::OnRestore(WPARAM wParam, LPARAM lParam)
{
if( lParam == WM_LBUTTONDOWN ) //如果在图标中单击左键则还原
{
ShowWindow(SW_SHOWNORMAL); //显示主窗口
this->SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//使窗口总是在最前面
//Shell_NotifyIcon(NIM_DELETE,&nid); //若加入这行,则在窗口还原后删除托盘图标,否则保留托盘图标
}
return 0;
}
把该方法加入消息映射表:
将ON_MESSAGE(WM_TRAYICON_RESTORE, OnRestore)插到映射表中
BEGIN_MESSAGE_MAP(CForexDemoDlg, CDialog)
...
...
ON_MESSAGE(WM_TRAYICON_RESTORE, OnRestore)
END_MESSAGE_MAP()
可以重载OnSize()方法,实现托盘图标。
数据结构NOTIFYICONDATA用来储存托盘图标的信息,结构如下:
typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
WCHAR szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;
首先要在对话凳绝升框类中加入NOTIFYICONDATA变量枣老:
NOTIFYICONDATA nid;
然后要在OnInitDialog()中对nid进行一些初始化:
nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA); //数据的大小
nid.hWnd = this->GetSafeHwnd(); //获取当前窗口句宏并柄
nid.uID = 100; //指定该nid的ID
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ; //定义图标的属性:图标有效|自定义消息有效|鼠标指向显示文字有效
nid.uCallbackMessage = WM_TRAYICON_RESTORE; //定义CALLBACK消息名称,用来响应对托盘图标的操作
nid.hIcon = m_hIcon; //指定显示的图标
wcscpy(nid.szTip, _T("TrayIcon")); //鼠标指向图标时的提示框
当然在头文件中要定义好WM_TRAYICON_RESTORE,
#defined WM_TRAYICON_RESTORE WM_USER+101 //这个值一般要大于100
重载OnSize()方法,假如对话框类是CTrayIconDlg;
void CTrayIconDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (nType==SIZE_MINIMIZED) //如果事件为最小化
{
Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标
ShowWindow(SW_HIDE); //隐藏主窗口
}
}
运行程序,最小化窗口,是不是成功将窗口藏到系统托盘了。
现在还不能让程序窗口还原,无论单击,双击小图标都没反应,那是因为没有对其消息进行处理。
首先在CTrayIconDlg类中加入方法:
afx_msg LRESULT OnRestore(WPARAM wParam, LPARAM lParam);
实现如下:
LRESULT CTrayIconDlg::OnRestore(WPARAM wParam, LPARAM lParam)
{
if( lParam == WM_LBUTTONDOWN ) //如果在图标中单击左键则还原
{
ShowWindow(SW_SHOWNORMAL); //显示主窗口
this->SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//使窗口总是在最前面
//Shell_NotifyIcon(NIM_DELETE,&nid); //若加入这行,则在窗口还原后删除托盘图标,否则保留托盘图标
}
return 0;
}
把该方法加入消息映射表:
将ON_MESSAGE(WM_TRAYICON_RESTORE, OnRestore)插到映射表中
BEGIN_MESSAGE_MAP(CForexDemoDlg, CDialog)
...
...
ON_MESSAGE(WM_TRAYICON_RESTORE, OnRestore)
END_MESSAGE_MAP()
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询