【问题标题】:How to let the parent window of a child window (a.k.a. owned window) stay active with winapi?如何让子窗口(又名拥有的窗口)的父窗口与 winapi 保持活动状态?
【发布时间】:2011-11-09 04:44:44
【问题描述】:

我正在使用 winapi 编写一个小型 C 应用程序。我有一个带有子窗口(工具箱)的窗口。我可以将其保留在此窗口中等等,但我的问题是:如果子窗口获得焦点,如何保持主窗口处于活动状态?

此时主窗口变灰。

窗口由以下人员创建:

hMainWindow = DialogBoxParam(.......);
hChildWindow = CreateDialogParam(..., hMainWindow, ...); 
ShowWindow (hChildWindow, SW_SHOW);

这里是两个窗口行为的小图:

【问题讨论】:

  • AFAIK 活动窗口是有焦点的窗口,所以如果孩子有焦点,那么主窗口也不能有焦点。
  • 也许不是这样,但我知道其他应用程序,比如 - 你可能知道 - Paint.NET 是可能的。
  • 您可能想要定义您所说的“活跃”是什么意思?你在使用 MDI 窗口吗?
  • 我没有使用 MDI 窗口。 (不知道如何在 C 中做到这一点)并且“活动”= 不像非活动窗口那样灰显。
  • 如果看到 Paint.NET 执行此操作。讨厌的黑客,它过滤 Windows 消息以说服窗口它仍然处于活动状态,因此它不会重新绘制标题栏。我不记得确切的细节足以在这里重现它。源代码不再可用,也许您可​​以在某处挖掘旧副本。考虑一个无标题的工具窗口,而不是在客户区域中绘制一个模拟的标题栏。

标签: c winapi parent


【解决方案1】:

将子窗口创建为无模式对话框而不是模式对话框。所以不要使用DialogBox,而是使用CreateDialog

【讨论】:

  • 我已经这样做了。 hPanel = CreateDialogParam(......); ShowWindow (hPanel, SW_SHOW);
  • 那么我不明白我猜的问题。您只能有一个“活动”窗口。最上面的窗口始终是焦点窗口。
  • @Mike Kwan 的回答一直对我有用。你的意思是你根本不能选择父窗口?或者您的意思是您根本不希望子窗口在创建时获得焦点?
  • 我对它做了一些小动作。愿你现在更好地理解这个问题。 :)
【解决方案2】:

抱歉,这正是 Windows 的工作方式:一次只有一个活动窗口。

如果您将“查找和替换”作为工具窗口调出,您可以在 Visual Studio 中看到这一点,您会看到它被激活,而 VS 主窗口变为非活动状态。

试图同时让它们都处于活动状态可能会混淆用户和屏幕阅读器等辅助工具。

【讨论】:

  • 是的,你是对的,我可以把它做成一个面板,但是在 C 语言中的一个面板我会以同样的方式做,作为一个无标题的窗口。所以问题依然存在。还是有其他可能性?
【解决方案3】:

我发现只需将其创建为 WS_CHILD 并明确 NOTWS_POPUP 即可解决此问题。它还将绝对窗口坐标转换为相对坐标,这样我就不必再通过移动父窗口来关心窗口位置了。

// 解决了

【讨论】:

    猜你喜欢
    • 2012-05-22
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多