taskbar的东西,搞不定,急需帮忙

jlqidan 2002-07-30 05:25:10
void TrayMessage (HWND hWnd, UINT message)
{
NOTIFYICONDATA tnd;
tnd.cbSize = sizeof (NOTIFYICONDATA);
tnd.uFlags =NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnd.uID = (UINT)IDR_MAINFRAME;
tnd.hWnd = hWnd;
//tnd.uCallbackMessage = TrayCallBack();
tnd.hIcon =::LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
::Shell_NotifyIcon (message, &tnd);
}

void CCadoDemoView::OnTask()
{
// TODO: Add your command handler code here
TrayMessage (NULL, NIM_ADD);
}
我点击了名为ID_TASK的按钮触发程序,但奇怪的是,任务栏出现一块空白,但并未显示程序图标,并且我的程序退出后,那块空白不消失,要重起后才恢复.不知什么原因
另:
我想通过点击窗体标题栏的最小化按钮触发程序,怎么做?我没找到相应的消息可以映射呀.
...全文
34 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
GoogleGeek 2002-08-06
  • 打赏
  • 举报
回复

你的消息映射函数怎么具有UINT类型的返回值呢?他的返回值应该是VOID

1、
CadoDemoView.h:
...
//}}AFX_MSG
afx_msg void TrayCallBack(WPARAM wParam,LPARAM lParam);

2、
CadoDemoView.CPP:
....
#define MYWM_NOTIFYICON WM_USER+100
...
BEGIN_MESSAGE_MAP(..,...)

//{{AFX_MSG_MAP()
...
//}}AFX_MSG_MAP
ON_MESSAGE( MYWM_NOTIFYICON,TrayCallBack)
...
END_MESSAGE_MAP()

void CCadoDemoView::TrayCallBack(WPARAM wParam,LPARAM lParam)
{
UINT uid;
UINT uMessage;
uid=UINT(wParam);
uMessage=UINT(lParam);
if(uMessage==WM_LBUTTONDOWN){
if(uid==IDI_ICON4)
{AfxMessageBox("This sure is fun!");}
}

return;
}
GoogleGeek 2002-08-06
  • 打赏
  • 举报
回复
当然要映射消息: MYWM_NOTIFYICON,否则系统怎么知道将你的WM_LBUTTONDOWN消息,发送给哪个窗口的哪那个函数进行处理呢?
jlqidan 2002-08-05
  • 打赏
  • 举报
回复
CadoDemoView.h:
...
//}}AFX_MSG
afx_msg UINT TrayCallBack(WPARAM wParam,LPARAM lParam);

DECLARE_MESSAGE_MAP()
...
CadoDemoView.cpp :
void TrayMessage (HWND hWnd, UINT message)
{
...
tnd.uCallbackMessage = MYWM_NOTIFYICON;
...
}
UINT CCadoDemoView::TrayCallBack(WPARAM wParam,LPARAM lParam)
{
UINT uid;
UINT uMessage;
uid=UINT(wParam);
uMessage=UINT(lParam);
if(uMessage==WM_LBUTTONDOWN){
if(uid==IDI_ICON4)
{AfxMessageBox("This sure is fun!");}
}

return(::DefWindowProc(NULL,uMessage,wParam,lParam));
}
上面三个函数,我想要实现taskbar图标响应左键单击的事件,可是没有一点反映,难道callback message MYWM_NOTIFYICON要进行消息映射给TrayCallBack()函数?
jlqidan 2002-08-05
  • 打赏
  • 举报
回复
WM_LISTEN消息需要映射吗?
yaotang 2002-08-01
  • 打赏
  • 举报
回复
珍藏先
GoogleGeek 2002-08-01
  • 打赏
  • 举报
回复
1。该问题不太可能出现!你到底对你的任务栏图标响应了什么消息?
你在什么地方调用了函数:
Shell_NotifyIcon(NIM_DELETE,&tnid);
否则,怎么可能自动地删除图标呢?
2。不需要相应消息:
WM_MOUSEMOVE
只要在创建任务栏图表示指定创建标志为:NIF_TIP即可!
例如:
.....
tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
....
3。当然可以是全局函数!
我这样做的目的是为了使用的方便!
我是在CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中创建任务揽图表的!
4。我的本意是为了直接的退出应用程序!
现在看来是多此一举!
可以改为如下:

void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
NOTIFYICONDATA tnid;
tnid.cbSize=sizeof(NOTIFYICONDATA);
tnid.hWnd=m_hWnd;
tnid.uID=IDR_MAINFRAME;//保证删除的是我的图标
Shell_NotifyIcon(NIM_DELETE,&tnid);

CMDIFrameWnd::OnClose();
}

5、m_hWnd is the handle of CMainFrame,it is public member fo the class CWnd!
jlqidan 2002-07-31
  • 打赏
  • 举报
回复
图标可以显示了,但当鼠标一放在它上边,它就退出了.怎么回事呢?
jlqidan 2002-07-31
  • 打赏
  • 举报
回复
看了你的回答,很感谢,有几个疑问:
1。“我的鼠标怎么一放在图标上,图标就退出去了呢?怎样能让它保持住呢?“
增加一个删除的函数是就可以解决这个问题吗?
2。“当鼠标悬浮在图标上时,提示的字是怎么显示的呢?“
图标保持住了,就可以自动显示提示了吗?因为没有看到你有相应消息
WM_MOUSEMOVE的函数
3。你所列的函数是CMainFrame类的,难道不应该是全局函数吗?我在msdn看的例
子都是全局函数呀
4。
void CMainFrame::OnClose()
{
。。。
PostQuitMessage(WM_QUIT);
CMDIFrameWnd::OnClose();//这两句是什么意思?都分别退出哪部分程序
}

5。OnListen函数:
::SetForegroundWindow( m_hWnd); //m_hWmd哪来的?


不好意思,问题是多了点,我又加了点分

GoogleGeek 2002-07-31
  • 打赏
  • 举报
回复
你需要响应特定自定义的消息!
例如在:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
......
//实现任务栏的托盘区
//------------------------------------------
NOTIFYICONDATA tnd;
tnd.cbSize=sizeof(NOTIFYICONDATA);
tnd.hWnd=this->m_hWnd;
tnd.uID=IDR_MAINFRAME;
tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
//this is the user_defined message ID:WM_LISTEN
tnd.uCallbackMessage=WM_LISTEN;
tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_MAINFRAME));
//This is the tooltips!
strcpy(tnd.szTip,"测试程序!宋业文。");
Shell_NotifyIcon(NIM_ADD,&tnd);
....
}
相应自己的消息:
void CMainFrame::OnListen(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;
}
}
if(uMouseMsg==WM_LBUTTONDBLCLK)
{
this->OnDisplayMe();
}

return;
}

增加一个一个删除图标的函数:
void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
NOTIFYICONDATA tnid;
tnid.cbSize=sizeof(NOTIFYICONDATA);
tnid.hWnd=m_hWnd;
tnid.uID=IDR_MAINFRAME;//保证删除的是我们的图标
Shell_NotifyIcon(NIM_DELETE,&tnid);
PostQuitMessage(WM_QUIT);
CMDIFrameWnd::OnClose();
}
----------------------
Run&Enjoy it!
jlqidan 2002-07-31
  • 打赏
  • 举报
回复
我的鼠标怎么一放在图标上,图标就退出去了呢?怎样能让它保持住呢?当鼠标悬浮在图标上时,提示的字是怎么显示的呢?
FFXI 2002-07-30
  • 打赏
  • 举报
回复
1. 图标没有显示可能是因为 IDR_MAINFRAME 没有16x16的小图标,要在Resource Editor中检查一下。


2. 增加一个移除函数,可以用按钮或在程序退出是调用:

void CCadoDemoView::OnRemoveTask()
{
TrayMessage (NULL, NIM_DELETE);
}

3. 最小化按钮触发,重载WM_SYSCOMMAND(OnSysCommand() for MFC);

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧