首页 > 基于Dialog的MFC程序在启动时隐藏为托盘程序(四)

基于Dialog的MFC程序在启动时隐藏为托盘程序(四)

这部分说一下如何加menu。。如果做小气球。。



mfc的menu确是不如C#活着java那么easy..



首先在rc里添加menu资源。。然后在ui界面里先设置一下你的菜单。。



在第(二)部分已经简单知道了怎么取得tray的鼠标左右点击事件。。下面我们就把左右点击事件分开。。



ContractedBlock.gifExpandedBlockStart.gifCode

 1LRESULT CDesktopDlg::OnNotifyIcon(WPARAM wParam,LPARAM lParam)

 2ExpandedBlockStart.gifContractedBlock.gif{

 3    switch (lParam)

 4ExpandedSubBlockStart.gifContractedSubBlock.gif    {

 5    case WM_LBUTTONDOWN:

 6                // 切换dialog状态。。

 7        if (dialogStatus)

 8ExpandedSubBlockStart.gifContractedSubBlock.gif        {

 9            dialogToTray();

10        }


11        else

12ExpandedSubBlockStart.gifContractedSubBlock.gif        {

13            trayToDialog();

14        }


15        break;

16

17    case WM_RBUTTONDOWN:

18                // 添加menu

19        CMenu pMenu;        

20

21        if (pMenu.LoadMenu(IDR_MENU1)) // IDR_MENU1就是我们添加的menu的id

22ExpandedSubBlockStart.gifContractedSubBlock.gif        {

23            CMenu* pPopupMenu = pMenu.GetSubMenu(0);

24            ASSERT(pPopupMenu != NULL); 

25            CPoint point; 

26            GetCursorPos(&point);

27            SetForegroundWindow();

28

29            pPopupMenu->TrackPopupMenu(

30                TPM_LEFTALIGN | TPM_RIGHTBUTTON,

31                point.x, point.y, this);

32        }


33        break;

34    }


35

36    return 0;

37}


ok,测试一下发现菜单运行良好。。不过这里还有个问题我有点疑问。。不知道是不是只有我的电脑有这个问题。。我在点右键的时候有一定概率把任务栏的那个菜单点出来。。不知道问什么。。



我们继续。



菜单是出来了。。下面开始添加事件。。



// .h

1afx_msg BOOL OnCommand(WPARAM wParam, LPARAM lParam);


// .cpp

ContractedBlock.gifExpandedBlockStart.gifCode

BOOL CDesktopDlg::OnCommand(WPARAM wParam, LPARAM lParam)

{

    
switch (wParam)

    {

        
// 这几个id是在rc里面定义的。。

    case ID_TRAYMENU_32771:

        trayToDialog();

        
break;

    
case ID_TRAYMENU_32772:

        dialogToTray();

        
break;

    
case ID_TRAYMENU_32773:

        OnExit();

        
break;

    
case ID_TRAYMENU_32774:

        showAboutDlg();

        
break;

        
// 添加这个command之后。。原来的button事件不管用了。。

        
// 经测试在这里好用。。原因不明。。

    case IDOK:

        OnBnClickedOk();

        
break;

    
case IDCANCEL:

        OnBnClickedCancel();

        
break;

    }



    
return true;

}


ok..现在再运行一下。。可以菜单就可以用了。。



下面来添加一下小气球的提示。。其实很简单。。写一个方法:

ContractedBlock.gifExpandedBlockStart.gifCode

 1BOOL CDesktopDlg::ShowBalloonTip(LPCTSTR szMsg,LPCTSTR szTitle, UINT uTimeout, DWORD dwInfoFlags)

 2ExpandedBlockStart.gifContractedBlock.gif{

 3

 4    m_notifyIcon.cbSize=sizeof(NOTIFYICONDATA);

 5    m_notifyIcon.uFlags = NIF_INFO;

 6    m_notifyIcon.uTimeout = uTimeout;

 7    m_notifyIcon.dwInfoFlags = dwInfoFlags;

 8    strcpy(m_notifyIcon.szInfo,szMsg ? szMsg : _T(""));

 9    strcpy(m_notifyIcon.szInfoTitle,szTitle ? szTitle : _T(""));

10

11    return Shell_NotifyIcon(NIM_MODIFY, &m_notifyIcon);

12}
  


然后在init的时候或者任何你需要的时候调用就可以了。。但是气球还是不要用太多为好。。或者像msn似的。。添加一下鼠标点击事件。。然后下回就再也不自动提示了。。当然这个可能就要借助注册表了。。



这四部份实际上是为了完成一个叫做女巫店 - 每周运程的一个小东东。。也是我第一次做mfc程序。。感觉还挺简单的。。程序分享出来吧。。就是通过网络连接nownow的女巫店。。然后读取rss文件(nownow..我要向你抗议。。你现在的文件格式我很难解析。。)。。然后到本地显示。。方便查询。。



ps.附上这个小东西。。顺便支持一下nownow。。你弄得这玩意太准了。。够意思的话一定要教教我。。嘿嘿。。



女巫店-桌面版



ok,关于托盘程序的mfc就此告一段落。。尽管写的很颓。。就这样吧。。:)











转载于:https://www.cnblogs.com/hudo/archive/2009/08/19/1549973.html

更多相关:

  • 事件原由为编辑器的自动缩进,当 case 换行后不自动缩进。 于是在在想可以可否在 case 后面再大括号,让其自动缩进。 查了资料,发现 case 是可以加大括号的,相当于代码块。 而且还有另外一个用途,可以代码块头部定义变量。 如下: 1 switch(ucKeySec) 2 { 3 case 1: 4 { 5...

  • 下面是复习java基础知识的时候,发现的一些点,总结下,备忘 int a=345;switch (a) {case 23:System.out.println("23"); // break;case 345://条件符合,下面的case条件不会在判断,直接执行;System.out.println("345");//...

  • 2019独角兽企业重金招聘Python工程师标准>>> 对于流程控制中的switch-case语句,一直是我的一个弱项. 每当考试或者面试笔试的时候,总是丈二和尚摸不着头脑,我想这应该是我基础太差的原因吧! 为了彻底解决这个心病,不得不花点功夫了! 首先从原理上来阐述这个问题: switch(表达式) { case 常量表...

  • 在AS3中,键盘事件是由KeyboardEvent类来处理的,属于flash.events包里面,有两种类型的键盘事件:KeyboardEvent.KEY_DOWN 和 KeyboardEvent.KEY_UP,对于键的代码获得我们通过keyCode这个属性 其实键盘事件使用起来还是相当方便,下面直接看实例: 建立一个新的AS文件ma...

  • 非常抱歉地跟各位说一下,因为老家并没有拉宽带,所以春节期间无法进行更新。虽然说我可以背着笔记本回家,然后再到朋友处蹭一下网络。但想到一年365天,能回家的就那么几天,只是想好好陪陪父母,伴伴自己的老婆,找找久未谋面的朋友聊聊天。在深圳的日子,每天都和代码打交道,过年期间只想好好休息一下,不想去考虑什么架构,不去想什么BUG,哪怕只是文...