2011-09-02 153 views
3

我正在写一个使用winapi的小型C应用程序。在那里我有一个带有子窗口的窗口(工具箱)。我可以将它保存在这个窗口内,等等,但我的问题是:如果子窗口聚焦,如何保持主窗口处于活动状态?如何让一个子窗口(也叫做拥有窗口)的父窗口在winapi中保持活动状态?

主窗口在此刻变灰。

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

在这里,两个窗口的行为有点像:

The behaviour of the windows

+1

AFAIK该活动窗口具有焦点,所以如果孩子有重点,然后在主窗口不能同时具有焦点之一。 –

+0

也许不是这样,但我知道其他应用程序 - 你可能知道 - Paint.NET是可能的。 –

+0

您可能想要定义“活动”的意思吗?你在使用MDI窗口吗? – jweyrich

回答

3

我发现简单地将其创建为WS_CHILD,并明确地将作为作为WS_POPUP解决了这个问题。它还将绝对窗口坐标转换为相对窗口坐标,以便通过移动父窗口不必再关心窗口位置。

//解决

1

创建子窗口为无模式对话框,而不是

窗户得到由创建莫代尔。因此,使用DialogBox,而不是使用CreateDialog

+0

我已经这样做了。 hPanel = CreateDialogParam(......); ShowWindow(hPanel,SW_SHOW); –

+0

那么我不明白我猜的问题。您只能有一个“活动”窗口。最上面的窗口始终是关注的窗口。 –

+0

@Mike Kwan的回答一直对我有用。你的意思是你根本无法选择父窗口?或者你的意思是你只是不想让子窗口在创建时全部关注? – 2011-09-02 16:17:25

1

对不起,这只是Windows的工作方式:一次一个活动窗口。

你可以在Visual Studio中看到这个,如果你打开Find and Replace作为一个工具窗口,你会看到它被激活并且主VS窗口变为非活动状态。

试图让它们同时处于活动状态可能会混淆用户和可访问性工具,如屏幕阅读器。

+0

是的你是对的,我可以让它成为一个小组,但是C中的一个小组我会以同样的方式做,就像一个无字幕的窗口。所以问题依然存在。还是有其他可能性? –