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窗口会被激活。

  • 相关阅读:
    HDU 4069 Squiggly Sudoku
    SPOJ 1771 Yet Another NQueen Problem
    POJ 3469 Dual Core CPU
    CF 118E Bertown roads
    URAL 1664 Pipeline Transportation
    POJ 3076 Sudoku
    UVA 10330 Power Transmission
    HDU 1426 Sudoku Killer
    POJ 3074 Sudoku
    HDU 3315 My Brute
  • 原文地址:https://www.cnblogs.com/zhangmo/p/15292142.html
Copyright © 2011-2022 走看看