导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

启动任务栏上操作问题(高分)

liken218 2002-08-02 05:26:02
我把应用程序图标缩在启动任务栏上,但无法操作,如重新打开和退出,即click mouse的右键就会出现操作菜单,哪位高手指导一下小弟一条路走走?

原程序如下:

应用程序的App的InitInstance()中增加下面的代码

NOTIFYICONDATA tnd;
tnd.cbSize=sizeof(NOTIFYICONDATA);
tnd.hWnd=m_pMainWnd->m_hWnd; //设置与图标相联的窗口
tnd.uID=IDR_MAINFRAME; //设置要显示的图标为主帧窗口图标
tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP; //设置标志,使其余的值有效
tnd.uCallbackMessage=WM_TRAY; //设置窗口响应消息为WM_TRAY
tnd.hIcon=LoadIcon(MAKEINTRESOURCE(IDR_MAINFRAME)); //设置图标句柄
strcpy(tnd.szTip,"我的程序"); //设置提示信息
::Shell_NotifyIcon(NIM_ADD,&tnd); //在托盘上加上图标
m_pMainWnd->ShowWindow(SW_HIDE);//隐藏主窗口
m_pMainWnd->UpdateWindow();

...全文
11 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
GoogleGeek 2002-08-03
to:csdnmem
在你的CMainFrame::OnClose()
{
NOTIFYICONDATA tnid;
tnid.cbSize=sizeof(NOTIFYICONDATA);
tnid.hWnd=m_hWnd;
tnid.uID=IDR_MAINFRAME;//保证删除的是我的图标
Shell_NotifyIcon(NIM_DELETE,&tnid);
PostQuitMessage(WM_QUIT)
}
回复
csdnmem 2002-08-03
但是关闭程序时,tray不会更新
大家怎么都没注意呢?
回复
s_phoenix 2002-08-03
gz
回复
dnyz 2002-08-02
我有一个程序用到系统托盘的,你要吗,把你的email留言给我.

然后给点分,呵呵 :)
回复
GoogleGeek 2002-08-02
正常的思路同Xeroo(初来乍到,多多关照)
响应WM_TRAY消息!

void CYourApp::OnTray(WPARAM wParam,LPARAM lParam)
{
//The example of how to process the message!
UINT uID;//发出该消息的图标的ID
UINT uMouseMsg;//鼠标动作
POINT pt;
//获得消息的ID
uID=(UINT) wParam;
//获得当前的消息
uMouseMsg=(UINT) lParam;

if(uMouseMsg==WM_RBUTTONDOWN)//如果是单击右键
{
switch(uID)
{
case IDR_MAINFRAME://如果是我的图标
GetCursorPos(&pt);//取得鼠标位置
::SetForegroundWindow( m_hWnd); //将窗口推向前台
CMenu menu;
menu.LoadMenu(IDR_MENU_NEW);
//显示右键菜单
menu.GetSubMenu(0)->TrackPopupMenu(TPM_RIGHTBUTTON|TPM_LEFTALIGN,pt.x,pt.y,this);
//但鼠标离开右键菜单时,即使地删除右键菜单!
//(因为主窗口不可见,这样做只是进行一下简单的模拟)
::PostMessage( m_hWnd, WM_NULL, 0, 0 );
break;
}
}
return;
}
回复
howtotell 2002-08-02
#define TASKBAR_ICON WM_USER+0x111
#define FLOADMENU WM_USER+0x112

除了你写出来的还要在类视图中右键添加以下的虚函数.
DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
我的程序中是这样的.
LRESULT CIllpcView::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_USER + 100:
if(lParam == WM_LBUTTONDOWN)
{
if(!m_IsShow)
{
::AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
BringWindowToTop();
m_IsShow = TRUE;
}
else
{
::AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);
m_IsShow = FALSE;
}
}
if(lParam == WM_RBUTTONDOWN)
{
CMenu menu;
if(!menu.LoadMenu(IDR_SAVE_PIC)) break;
CMenu* pSubMenu = menu.GetSubMenu(0);

CPoint pos;
GetCursorPos(&pos);
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,pos.x,pos.y, this, NULL);
menu.DestroyMenu();
}
if(lParam == WM_LBUTTONDBLCLK)
{
MessageBox(m_desIP,"Destination",MB_OK);
}
break;
}
return CFormView::DefWindowProc(message, wParam, lParam);

}
回复
FFXI 2002-08-02
按楼上的方法就可以了。
回复
Xeroo 2002-08-02
在文件的开头添加#define WM_TRAY (WM_APP+100)
然后在消息映射里添加ON_MESSAGE(WM_TRAY,OnTray)
再添加成员函数
void ***::OnTray()
{
UINT uID=(UINT)wParam;
UINT uMouseMsg=(UINT)lParam;
if(uID==IDR_MAINFRAME)
{
switch(uMouseMsg)
{
case WM_RBUTTONDOWN:
...
case WM_LBUTTONDBLCLK:
...
case ...
}
}
}
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……