笔下有余

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

//在Form的OnCreate事件中注册 WM_TASKBARCREATED 消息,并在托盘区添加图标
    WM_TASKBARCREATED=RegisterWindowMessage("TaskbarCreated");
    lIconMessage=RegisterWindowMessage("IconNotify");

 

//添加图标

 

void TForm2::AddTrayIcon()
{
    NOTIFYICONDATA IconData={0};   //结构体,包含系统需要的用来传递托盘区域消息的信息
    IconData.cbSize=sizeof(NOTIFYICONDATA);     //结构体的大小
    IconData.hWnd=this->Handle;          //窗口的句柄
    IconData.uID=0;                    //应用程序定义的任务栏图标的标识符
    IconData.uFlags=NIF_INFO | NIF_ICON | NIF_TIP | NIF_MESSAGE;   //此成员表明具体哪些其他成员为合法数据
    IconData.hIcon=Application->Icon->Handle;        //hIcon成员起作用
    lstrcpy(IconData.szTip,TEXT("http://www.cnblogs.com/missu"));     //指向一个以\0结束的字符串的指针
    IconData.uCallbackMessage=lIconMessage;     //应用程序定义的消息标示
    Shell_NotifyIcon(NIM_ADD,&IconData);      //此函数用来向任务栏托盘区域发送消息,nim-add向托盘添加图标

}

 

修改图标

void TForm2::ModifyTrayIcon()             //修改图标,在切换时
{
    NOTIFYICONDATA IconData={0};
    IconData.cbSize=sizeof(NOTIFYICONDATA);
    IconData.hWnd=this->Handle;
    IconData.uID=0;
    IconData.uFlags=NIF_INFO | NIF_ICON | NIF_TIP | NIF_MESSAGE;    //
    IconData.hIcon=Application->Icon->Handle;
    //-----------------------------------------------------------------------
    lstrcpy(IconData.szTip,TEXT("http://www.cnblogs.com/missu"));
    lstrcpy(IconData.szInfoTitle,TEXT("欢迎访问笔下有余的博客"));      //这2行为跳出信息
    lstrcpy(IconData.szInfo,TEXT("欢迎访问笔下有余的博客"));
    //-----------------------------------------------------------------------
    IconData.uTimeout=0.5;// 泡泡停留时间          10-30自动消除
    IconData.dwState=NIS_SHAREDICON;            //图标的状态,隐藏或共享NIS_HIDDEN
    IconData.dwStateMask=0;              //指明dwState成员的那些位可以被设置或者访问
    IconData.dwInfoFlags=1;   //添加Title图标  , 设置此成员用来给气球提示框增加一个图标  1为info
    IconData.uCallbackMessage=lIconMessage;
    Shell_NotifyIcon(NIM_MODIFY,&IconData);
}

 

 

    //删除图标

void TForm2::RemoveTrayIcon()         {
    NOTIFYICONDATA icondata;
    memset(&icondata,0,sizeof(icondata));
    icondata.cbSize=sizeof(icondata);
    icondata.hWnd=this->Handle;
    Shell_NotifyIcon(NIM_DELETE,&icondata);
}

 

 

 

//结合应用程序最小化时候的图标操作

void __fastcall TForm2::ApplicationEvents1Minimize(TObject *Sender) //最小化时候
{              //applicationevent组件,与系统挂钩,执行minimize程序
    if(bHide)
    {
        ShowWindow(Application->Handle,SW_SHOW);
        SendMessage(Application->Handle,WM_SYSCOMMAND,SC_RESTORE,0);
        bHide=false;
    }
    else
    {
        ShowWindow(Application->Handle,SW_HIDE);
        SendMessage(Application->Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);
        ModifyTrayIcon();
        bHide=true;
    }
}

 

//其他

void __fastcall TForm2::WndProc(Messages::TMessage& Message)
{                 //重载WndProc,响应系统消息
   if(Message.Msg==lIconMessage)
    {
        if(Message.LParam==WM_LBUTTONDBLCLK) //双击图标的事件
        {
            if(bHide)
            {
                ShowWindow(Application->Handle,SW_SHOW);   //该函数设置指定窗口的显示状态
                SendMessage(Application->Handle,WM_SYSCOMMAND,SC_RESTORE,0);    //该函数将指定的消息发送到一个或多个窗口
                bHide=false;                  //设置图标状态    SC_RESTORE是恢复状态
            }
            else
            {
                ShowWindow(Application->Handle,SW_HIDE);
                SendMessage(Application->Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);
                ModifyTrayIcon();        //当最小化时
                bHide=true;
            }
        }
        if(Message.LParam==WM_RBUTTONDOWN)
        {
      TPoint pos;
      GetCursorPos(&pos);
            this->PopupMenu2->Popup(pos.x,pos.y);
            //小图标popup
        }
    }
    if(Message.Msg==WM_TASKBARCREATED) //任务栏重建消息
    {
        AddTrayIcon(); //重新添加图标
    }
    TForm::WndProc(Message);//对于其他的消息,调用基础类的WndProc函数让Windows进行缺省处理。
}

 

//popup
 void __fastcall TForm2::PopupMenu2Popup(TObject *Sender)
{
   SetForegroundWindow(this->Handle);
}

posted on 2009-12-15 14:40  笔下有余  阅读(859)  评论(0)    收藏  举报