这个 CreateWindowEx 函数有啥问题?

Posted

技术标签:

【中文标题】这个 CreateWindowEx 函数有啥问题?【英文标题】:What's wrong with this CreateWindowEx function?这个 CreateWindowEx 函数有什么问题? 【发布时间】:2011-09-13 21:43:47 【问题描述】:

好的,首先简要概述一下我正在尝试做什么.. 我正在尝试在主父窗口中创建 3 个子窗口,并使用 EnumChildWindowEnumChildProc 枚举它们,我想创建 3 个与父窗口高度相同但宽度为 1/3 的子窗口,并将它们对齐在另一个之后..

所以,我捕获了WM_CREATE 消息来创建这些子窗口,并使用WM_SIZE 移动并使用MoveWindow 对齐它们,除了没有创建子窗口之外,一切都很好。当我调试它时,我发现(在 Visual Studio 2008 的自动窗口中,调试时)我的 CreateWindowEx 语句没有被执行(自动窗口显示“无法评估表达式。”

声明如下:

CreateWindowEx(0, (LPCWSTR)("childClass"), (LPCWSTR)NULL, WS_CHILD | WS_BORDER, 0, 0, 0, 0, hWnd, (HMENU) (int) (ID_FIRSTCHILD + 1), hInst, NULL);

当然,我在 for 循环中使用它来创建 3 个窗口,但这是另一回事... 那么,任何人都可以帮助/指导/建议我这里发生了什么吗?还是我做错了什么?

ps:我正在阅读这本电子书,我是从那里获得此代码和所有内容的,所以请不要要求我采用其他方法或其他方法,比如将 Child 创建代码放在其他地方……因为我不是制作任何程序,但只是按照一本书的例子...... :)

【问题讨论】:

您是否也从那本书中复制了(LPCWSTR)("childClass")?真的有用吗? 是的,书上是这样的,但我也尝试将其更改为与父级相同的类,即Visual Studio默认为主窗口创建的szWindowClass,但是它也没有任何好处.. 我不太确定,但我觉得这很奇怪。尝试将其替换为L"childClass"... VS 创建的默认类 szWindowClass 是否不适合那些子窗口,因为它的 .lpfnWndProc 设置为 WndProc 而 Proc 将处理这些子窗口window 是EnumChildProc,如果是这样,我需要为子窗口创建一个新类并注册它吗? 我确实试过_T("ChildClass")... 【参考方案1】:

我的通灵能力建议您需要将 WS_VISIBLE 样式传递给上面的 CreateWindow 调用以用于您的子窗口 - 这样您就可以看到它们。 :)

我的开发经验建议如下:

CreateWindowEx 的返回值是多少?您是否将返回值分配给变量。如果是这样,您是否在调试器的该行上设置了断点?如果 CreateWindow 的返回值为 NULL,那么 GetLastError 是什么(您可以在调试器中将其评估为“@err”)。

在您的主窗口弹出后(子窗口不可见),您是否运行 Spy++ 来查看子窗口是否存在?他们的状态是什么?

否则,您是否验证了您的子窗口类的 WndProc 的 WM_CREATE 回调正在被调用?

【讨论】:

是的,我在调试器中检查了调用返回 NULL,然后我检查了 @err 它返回了 1407,在谷歌搜索中,我发现这表明 CreateWindowEx 中指定的窗口类未注册.另外,如果我注册这个类,因为我将为子窗口注册这个类,我应该在 WndClassEx::lpfnWndProc 方法中指定什么?因为在父类中它的值是WndProc。那么对于这种情况应该是相同的还是不同的呢?那么我必须注册这个“ChildClass”吗?之前我只是将此文本字符串放在代码中,但实际上并没有指定任何内容。 同一个窗口类的所有实例都会有相同的wndproc回调函数。您可能需要两个窗口类。一个用于父窗口,一个用于子窗口(每个窗口类都有一个单独的 wndproc 函数回调)。在应用程序启动时注册这两个窗口类。如果它们的行为不同,请使用 CreateWindow 的 lpParam 参数将初始化数据传递给每个窗口。

以上是关于这个 CreateWindowEx 函数有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

windows API 关于CreateWindowEX CreateThread和获取windows时间等问题

CreateWindowEx创建模态窗口,父窗口还是可以响应消息,求解决方案!

CreateWindowEx(摘自搜狗百科)

vs2010 MFC中利用CreateWindowEx手动创建工具栏后,想点击这个工具栏上的某个按钮,该如何做?

为啥 CreateWindowEx 返回 0

vc下关于CreateWindowEx的问题