如何实现动画托盘?

legendhui 2006-04-19 06:25:39
参考了一下vckbase上面的文章,用Shell_NotifyIcon(NIM_DELETE, &nd);和Shell_NotifyIcon(NIM_ADD, &nd);删除了再添加,这样会让任务栏出现闪烁。如何让它不闪烁?我用了Shell_NotifyIcon(NIM_MODIFY, &tnid);但是不替换我想显示的图标
...全文
229 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
legendhui 2006-04-20
  • 打赏
  • 举报
回复
哦,谢谢!
striking 2006-04-20
  • 打赏
  • 举报
回复
至于为什么这样, 我也不知道为什么, msdn上有个例子, 就是写这个托盘的,

它在构造函数这样写.

// Initialize NOTIFYICONDATA
memset(&m_nid, 0 , sizeof(m_nid));
m_nid.cbSize = sizeof(m_nid);
m_nid.uID = uID; // never changes after construction <- 就是这句 m_notifyHook.m_pTrayIcon = this; // notification window hook
m_parentHook.m_pTrayIcon = this; // parent window hook // Use resource string as tip if there is one
AfxLoadString(uID, m_nid.szTip, sizeof(m_nid.szTip));

其它的没有什么说明了. :)
legendhui 2006-04-20
  • 打赏
  • 举报
回复
striking(硬撑者) ( ) 信誉:109
我没有做类的原因是感觉这个很简单,不需要再封装了

你的第一条是对的,不需要改tnid.uID,能具体说不需要改的原因吗
sunj_study 2006-04-20
  • 打赏
  • 举报
回复
study
rageliu 2006-04-20
  • 打赏
  • 举报
回复
没做过动化的,来长点经验
striking 2006-04-20
  • 打赏
  • 举报
回复
1.tnid.uID 这个初始化后就不要变了. 你的 目的应该是需要的时候才更新图标的吧, 在OnTimer刷新图标的时候, 不需要更改到tnid.uID .
2.我认为你应该把托盘的相关操作封装到一个类. vckbase上的例子不是都有封装吗?
3.以下是一段切换图标的函数.仅供参考:)

BOOL CShellTrayIcon::SetIcon(HICON hicon, LPCTSTR lpTip)
{
UINT msg;
m_nid.uFlags = 0;

// Set the icon
if (hicon) {
// Add or replace icon in system tray
msg = m_nid.hIcon ? NIM_MODIFY : NIM_ADD;
m_nid.hIcon = hicon;
m_nid.uFlags |= NIF_ICON;
} else { // remove icon from tray
if (m_nid.hIcon==NULL)
return TRUE; // already deleted
msg = NIM_DELETE;
}

// Use the tip, if any
if (lpTip)
_tcsncpy(m_nid.szTip, lpTip, countof(m_nid.szTip));
if (m_nid.szTip[0])
m_nid.uFlags |= NIF_TIP;

// Use callback if any
if (m_nid.uCallbackMessage && m_nid.hWnd)
m_nid.uFlags |= NIF_MESSAGE;

// Do it
BOOL bRet = Shell_NotifyIcon(msg, &m_nid);
if (msg==NIM_DELETE || !bRet)
m_nid.hIcon = NULL; // failed
return bRet;
}
相信lz很聪明, 应该知道怎么用.
legendhui 2006-04-20
  • 打赏
  • 举报
回复
我在定时器里tnid.hIcon = NULL;只是同一幅图片的闪烁显示

要不用tnid.hIcon = NULL;那就是一幅位图不变了
legendhui 2006-04-20
  • 打赏
  • 举报
回复
m_nIcon++;
if(m_nIcon>3)
m_nIcon=0;
// NOTIFYICONDATA tnid;
tnid.hIcon = NULL;
Shell_NotifyIcon(NIM_MODIFY, &tnid);
switch(m_nIcon)
{
case 0:
tnid.uID = IDR_MAINFRAME;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
break;
case 1:
tnid.uID = IDI_ICON13;
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON13);
break;
case 2:
tnid.uID = IDI_ICON14;
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON14);
break;
case 3:
tnid.uID = IDI_ICON15;
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON15);
break;
default:
tnid.uID = IDR_MAINFRAME;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
break;
}
SetIcon(m_hIcon, TRUE); // Set big icon
// SetIcon(m_hIcon, FALSE); // Set small icon
tnid.hIcon = m_hIcon;
Shell_NotifyIcon(NIM_MODIFY, &tnid);
InvalidateRect(NULL,TRUE);//刷当前程序界面
CFrameWnd::OnTimer(nIDEvent);
奶糖人五号 2006-04-20
  • 打赏
  • 举报
回复
mark
MuseIn 2006-04-19
  • 打赏
  • 举报
回复
vb 的:http://developer.ccidnet.com/art/322/20021015/27669_2.html


c#
http://ewebapp.cnblogs.com/articles/255339.html
xuzheng318 2006-04-19
  • 打赏
  • 举报
回复
http://www.copathway.com/vchelp/zart/ani_show_wnd.asp?type_id=71&class_id=1&cata_id=2&article_id=58
xuzheng318 2006-04-19
  • 打赏
  • 举报
回复
timer +Shell_NotifyIcon

http://www.copathway.com/vchelp/zart/ani_show_wnd.asp
vcmute 2006-04-19
  • 打赏
  • 举报
回复
不改不大可能,试试看向左或向右移几个像素的图标
striking 2006-04-19
  • 打赏
  • 举报
回复
会让任务栏出现闪烁???好像不太明白.

我用了Shell_NotifyIcon(NIM_MODIFY, &tnid);但是不替换我想显示的图标
-----> 还是不明白.

我有弄过, 你说的闪烁我感觉不会丫.

你把那段切换图标的代码贴出来看看.

16,467

社区成员

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

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

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