一个托盘闪烁的问题:
为什么我托盘的图标不闪烁,而窗口和任务栏上的图标会闪烁?
我的部分代码(每次调用OnTimer()函数,我传入的值是1,2循环):
——————————————————————————————————
void CYDlg::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
switch(i)
{
case 1:
nd.uID = IDI_ICON1;
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON_MY2);
break;
case 2:
nd.uID = IDI_ICON2;
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON_MY1);
break;
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
nd.hIcon = m_hIcon;
Shell_NotifyIcon(NIM_MODIFY, &nd);

InvalidateRect(NULL,TRUE); CDialog::OnTimer(nIDEvent);
}
——————————————————————————————————怎么解决?在网上搜了很多,都一样的方法,但是就是解决不了!!!大家帮帮忙·~!

解决方案 »

  1.   

    如果不要窗口和任务栏图标闪动,就把那2个SetIcon去掉你发的nd的参数不对
    nd.uFlags         = NIF_ICON;
    nid.hIcon         = m_hIcon;
    Shell_NotifyIcon(NIM_MODIFY, &nid);
      

  2.   

    uID不要乱改,要不找不到对应你程序的那个托盘图标了
      

  3.   

    1. InvalidateRect是不需要的,白白增加刷新工作,托盘的绘制和这个没关系
    2. 你i怎么改变的?从代码看,i必须不停变化才能闪烁,你可以把你代码改成如下试试
    void   CYDlg::OnTimer(UINT   nIDEvent)   

    //   TODO:   Add   your   message   handler   code   here   and/or   call   default 
        static int iIcon = 1;
        iIcon=1-iIcon;
        switch(iIcon) 
        { 
             case   0: 
               //nd.uID =   IDI_ICON1;  ID不需要改变 
               m_hIcon   =   AfxGetApp()-> LoadIcon(IDI_ICON_MY2); 
               break; 
             case   1: 
                //nd.uID =   IDI_ICON2; 
                m_hIcon   =   AfxGetApp()-> LoadIcon(IDI_ICON_MY1); 
             break; 
        } 
        SetIcon(m_hIcon,   TRUE); 
        SetIcon(m_hIcon,   FALSE); 
        nd.hIcon   =   m_hIcon; 
        Shell_NotifyIcon(NIM_MODIFY,   &nd);     
        CDialog::OnTimer(nIDEvent); 
    } 当然:定时器必须设置为大概1秒触发一次