您也可以使子视窗被启用或者不被启用。在内定情况下,视窗是被启用的。您可以通过下面的呼叫使视窗不被启用:
对於按钮控制项,这具有使按钮字串变成灰色的作用。按钮将不再对滑鼠输入和键盘输入做出回应,这是表示按钮选项目前不可用的最好方法。
您可以通过下面的呼叫使子视窗再次被启用:
您还可以使用下面的呼叫来确定子视窗是否被启用:
按钮和输入焦点
我在本章前面已经提到过,当用滑鼠单击按钮、核取方块、单选框和拥有者绘制按钮时,它们接收到输入焦点。这些控制项使用文字周围的虚线来表示它拥有了输入焦点。当子视窗控制项得到输入焦点时,其父视窗就失去了输入焦点;所有的键盘输入都进入子视窗控制项,而不会进入父视窗中。但是,子视窗控制项只对Spacebar键作出回应,此时Spacebar键的作用就如同滑鼠按键一样。这种情形导致了一个明显的问题:您的程式失去了对键盘处理的控制项。让我们看看我们对此能做一些什么。
我在第六章中已经提到过,当Windows将输入焦点从一个视窗(例如一个父视窗)转换到另一个视窗(例如一个子视窗控制项)时,它首先给正在失去输入焦点的视窗发送一个WM_KILLFOCUS讯息,wParam参数是接收输入焦点的视窗的代号。然後,Windows向正在接收输入焦点的视窗发送一个WM_SETFOCUS讯息,同时wParam是还在失去输入焦点的视窗的代号(在这两种情况中,wParam值可能为NULL,它表示没有视窗拥有或者正在接收输入焦点)。
通过处理WM_KILLFOCUS讯息,父视窗可以阻止子视窗控制项获得输入焦点。假定阵列hwndChild包含了所有子视窗的视窗代号(它们是在呼叫CreateWindow来建立视窗的时候储存到阵列中的)。 NUM是子视窗的数目:
在这段程式码中,当父视窗获知它正在失