MFC桌面右下角弹窗不抢当前窗口焦点同时不抢父窗口焦点

来源:互联网 发布:excel筛选特定数据求和 编辑:程序博客网 时间:2024/05/02 04:54

    资源下载页面:http://download.csdn.net/detail/panshiqu/5839805

    这段时间还是在新公司写小程序练手,我的水平是菜鸟中的菜鸟那种水平。

    现在需要写的功能我简单说一下,类似腾讯QQ右下角弹出的新闻框那种,有两点细节我特别强调一下,仅有父窗口时不能抢父窗口焦点,父窗口不在而运行的其他程序的焦点也不能抢

        解决方案来自:http://bbs.csdn.net/topics/370139807

        我这里也重复一下原文的意思:子对话框的Create操作和带SW_SHOW参数的ShowWindow操作都会把激活状态从父窗口那里抢过来,ShowWindow(SW_SHOWNOACTIVATE)只能避免其中的一次子窗口激活,不能避免Create的激活,所以在父窗口显示前先把子窗口Create,由于父窗口显示时会自动激活,因此就不会受到影响了

        不废话直接上代码试验:

    1.创建单文档应用程序,View类继承CHtmlView类(偷工减料,焦点更明显,请往后看)将View类中OnInitialUpdate()做如下改动

Navigate2(_T("http://www.baidu.com"),NULL,NULL);

    2.插入对话框,IDD_POP_DIALOG,添加CPopupDlg类继承CDialog类,CMainFrame头文件和原文件做如下改动

#include "PopupDlg.h" //别忘记了// Attributespublic:CPopupDlg* m_pDlg;

CMainFrame::CMainFrame(){// TODO: add member initialization code herem_pDlg = NULL;m_pDlg = new CPopupDlg(this);m_pDlg->Create(CPopupDlg::IDD);}CMainFrame::~CMainFrame(){delete m_pDlg;}

    3.现在模拟弹窗焦点正在搜索的输入框中,直接用定时器吧,在CMainFrame的OnCreate()里创建定时器

SetTimer(1, 5000, NULL);

    4.接下来就要响应OnTimer()啦

    if (nIDEvent == 1)    {        m_pDlg->ShowWindow(SW_SHOWNOACTIVATE);        KillTimer(1);    }

    5.现在运行一下,发现好像没有弹出窗口,呵呵,不是的,只是被主窗口挡住了,这是就要在CPopupDlg类中重载OnInitDialog()函数,让他在最上面就好

SetWindowPos(&CWnd::wndTopMost, 400, 400, 500, 500, SWP_NOACTIVATE);

    看看现在是不是完成了呢,打开程序,弹出窗口虽然能挡住单文档,但是焦点还在单文档上面。现在再去测试一下,打开程序,隐藏单文档,顺便打开浏览器或是什么软件都好,看看窗口弹出的时候抢走了焦点没有

    如果想让程序有下角显示呢,无非是把那几个数字改变下定个位,如下替换OnInitDialog()的内容

// 获得桌面大小CRect rectWorkArea;SystemParametersInfo(SPI_GETWORKAREA, 0, &rectWorkArea, SPIF_SENDCHANGE);  // 获得对话框大小CRect rectDlg;GetWindowRect(&rectDlg);int nW = rectDlg.Width();int nH = rectDlg.Height();// CWnd::SetWindowPos See from MSDNSetWindowPos(&CWnd::wndTopMost, rectWorkArea.right-nW-5, rectWorkArea.bottom-nH-5, nW, nH, SWP_NOACTIVATE); // 窗口置顶不激活

    如果还想让他缓慢升起呢,当然第一时间可以考虑的是AnimateWindow(),但是我做过测试了,在XP系统中缓慢升起正常,但是在WIN7中就有点问题了,弹窗的框一开始就显示,只是弹窗的内容区域缓慢升起,我也疑惑了好长时间想找解决办法,在WIN7中个性化中改变主题为 Windows 经典 这种缓慢升起就好了,想想可能是WIN7本来就给每个对话框的边框加着特效呢,例如半透明呀,才导致这样的情况发生,解决方法肯定是有,只是我还没有找到针对AnimateWindow()的解决方案,如果高手看到这个文章,心中有想法请告诉我哦,其实我有个麻烦的解决方案,还不知道可行性,那就是自绘窗体,呵呵,够麻烦吧。

    其实关于不抢焦点,我原本找到的解决方案并不是这个,而是:http://blog.csdn.net/fengge8ylf/article/details/8220927  这个实现起来也不麻烦,只是记录一下弹窗之前的焦点所在窗口的句柄,我也按照他的方法实现了,但是它会抢父窗口的焦点,就放弃了,作为学习阶段的我们,大家也不妨试试这个方法,全当练习了

    关于这方面的问题,就说这么多吧,毕竟我对太多东西都还不是很透彻,也不敢说太多,写这篇文章就是记录一下自己的学习历程。


原创粉丝点击