为什么使用WS_CHILD在父窗口内编辑控件被禁用?

时间:2018-01-09 16:18:32

标签: c winapi controls

我创建了一个在CreateWindowEx函数中指定WS_CHILD的窗口,如下所示:

HWND newEvent = CreateWindowEx(WS_EX_CONTROLPARENT, NewEventClassName, NewEventTitle, 
                               WS_BORDER | WS_OVERLAPPEDWINDOW | WS_CHILD, 
                               CW_USEDEFAULT, CW_USEDEFAULT, 
                               400, 230, hwnd, NULL, NULL, NULL);

然后,我在其中创建了一个Edit Control:

HWND editCtrlEventName;
editCtrlEventName = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"EVENT_NAME", 
                                   WS_GROUP | WS_CHILD | WS_VISIBLE |
                                   ES_LEFT | ES_UPPERCASE, 110, 10, 130, 20,
                                   newEvent, (HMENU)2001, NULL, NULL);

创建窗口时,会创建编辑控件,但在其中禁用,我无法通过任何方式启用控件。我已经尝试在编辑控件中使用EnableWindow()函数和类似函数,但没有成功。但是,当我从WS_CHILD删除newEvent样式时,它的效果非常好。

我是winapi编程的初学者,这种行为对我来说并不清楚。在子窗口中创建编辑控件有什么问题吗?

1 个答案:

答案 0 :(得分:3)

HWND newEvent = CreateWindowEx(WS_EX_CONTROLPARENT, NewEventClassName, NewEventTitle, 
                               WS_BORDER | WS_OVERLAPPEDWINDOW | WS_CHILD, 
                               CW_USEDEFAULT, CW_USEDEFAULT, 
                               400, 230, hwnd, NULL, NULL, NULL);

上述代码中的错误是将两个互斥的样式组合在一起:WS_OVERLAPPEDWINDOW | WS_CHILDWS_OVERLAPPEDWINDOW是仅适用于顶级窗口的样式,WS_CHILD当然仅适用于子窗口。

此外,CW_USEDEFAULT对子窗口无效。

除此之外,创建编辑控件作为另一个子窗口的子窗口不应该有任何问题。 Windows本身在很多地方使用这种技术,例如组合框具有编辑控件作为子窗口。