c – 如何在不将焦点转移到另一个窗口的情况下显示MFC对话框

我有ShowWindow显示的对话框(hWnd,SW_SHOWNOACTIVATE);
但它不起作用,新的对话仍然是重点,为什么呢?

这是我程序中的一些代码片段,QueryWindow是与对话框链接的MFC对话框类:

QueryWindow window;
//window.DoModal();
window.Create(QueryWindow::IDD);
window.ShowWindow(SW_SHOWNOACTIVATE);

解决方法

有几种方法可以跳过对话以获得专注:

>让OnInitDialog()返回零值.例:

BOOL QueryWindow::OnInitDialog()
{
    CDialog::OnInitDialog();

    return FALSE; // return 0 to tell MFC not to activate dialog window
}

这是最好,最正确的解决方案.
>将WS_EX_NOACTIVATE样式添加到对话框窗口.您可以编辑对话框资源属性或在运行时更改它:

BOOL QueryWindow::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.dwExStyle |= WS_EX_NOACTIVATE;

    return CDialog::PreCreateWindow(cs);
}

副作用:您可以在窗口上使用控件,但看起来它没有被激活.
>最后一种方法是在创建对话框之前保存前景窗口
并在最后设置前景窗口:

BOOL QueryWindow::Create(LPCTSTR lpszTemplateName,CWnd* pParentWnd)
{
    CWnd* pForeground = GetForegroundWindow();

    const BOOL bRes = CAlertDialog::Create(lpszTemplateName,pParentWnd);

    if(pForeground)
        pForeground->SetForegroundWindow();
    return bRes;
}

这是值得的解决方案,因为可能会有闪烁.

重要!

不要忘记控制以下API调用

> ShowWindow – 您可以使用SW_SHOWNOACTIVATE,但不能使用SW_SHOW> SetwindowPos – 添加标志SWP_NOACTIVATE

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...