zoukankan      html  css  js  c++  java
  • 显示窗口时不激活窗口的方法

    今天有幸翻到一篇博客里面提供了一种可行的办法,简单说就是让子窗口的Create操作在父窗口的OnInitDialog中执行,然后在需要打开子对话框的时候,用dlg->ShowWindow(SW_SHOWNOACTIVATE);即可,虽然这导致子对话框必须提前建好,不过确实是不闪了。


    原理估计是这样:子对话框的Create操作和带SW_SHOW参数的ShowWindow操作都会把激活状态抢过来,ShowWindow(SW_SHOWNOACTIVATE)只能避免其中的一次子窗口激活,不能避免Create的激活,所以在父窗口显示前先把子窗口Create,由于父窗口显示时会自动激活,因此也不会受到影响。

    都不知道作者咋想出这么YD的方法,有点小nb。感谢大家回了这么多,也把那个博客贴出来,散粉了
    http://blog.sina.com.cn/s/blog_45a78d510100qbo5.html

     MFC桌面右下角弹窗不抢当前窗口焦点同时不抢父窗口焦点_panshiqu的专栏-程序员宅基地 - 程序员宅基地 (cxyzjd.com)

    1. 如果是启动一个新的进程显示一个窗口,可以如下实现:

     STARTUPINFO si = {0};
     si.cb = sizeof si;
     si.dwFlags = STARTF_USESHOWWINDOW;
     si.wShowWindow = SW_SHOWNOACTIVATE;
     PROCESS_INFORMATION pi = {0};
     TCHAR path[MAX_PATH] = _T("notepad.exe");
     CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

    2. 如果是在当前程序显示一个非模态的对话框而不激活该窗口的话。

    假设当前项目是一个对话框程序,CTestDlg类为主对话框,当点击CTestDlg的确定按钮的时候显示不激活的对话框CNoActiveDlg,则:

    在CTestDlg类中定义CNoActiveDlg *m_dlgNoActive

    在CTestDlg的OnInitDialog()中创建对话框:

    m_dlgNoActive = new CNoActiveDlg();
    m_dlgNoActive->Create(IDD_DLG_NO_ACTIVE);

    在CTestDlg的OnOk()中:

    m_dlgNoActive->ShowWindow(SW_SHOWNOACTIVATE);

    这样当点击CTestDlg的确定按钮时,就会显示CNoActiveDlg窗口且此窗口未激活,激活窗口依然是CTestDlg。

    注意,之所以在CTestDlg中定义CNoActiveDlg,是因为如果所有的工作都在OnOk中做的话:

    CNoActiveDlg *dlg = new CNoActiveDlg();

    dlg = new CNoActiveDlg();
    dlg->Create(IDD_DLG_NO_ACTIVE);

    dlg->ShowWindow(SW_SHOWNOACTIVATE);

    将无法实现显示CNoActiveDlg窗口且未激活,这么做的结果是CNoActiveDlg窗口会被激活。

  • 相关阅读:
    SiteMap Editor for Microsoft Dynamics CRM 2011 使用说明
    Microsoft Dynamics CRM 2011 如何导入组织
    SQL server 2008数据库的备份与还原(转)
    css列表
    css栅格
    css-排版
    类的操作
    事件的委派
    正则验证手机号和电子邮件
    div跟随鼠标移动
  • 原文地址:https://www.cnblogs.com/zhangmo/p/15292142.html
Copyright © 2011-2022 走看看