这个 CreateWindowEx 函数有啥问题?
Posted
技术标签:
【中文标题】这个 CreateWindowEx 函数有啥问题?【英文标题】:What's wrong with this CreateWindowEx function?这个 CreateWindowEx 函数有什么问题? 【发布时间】:2011-09-13 21:43:47 【问题描述】:好的,首先简要概述一下我正在尝试做什么..
我正在尝试在主父窗口中创建 3 个子窗口,并使用 EnumChildWindow
和 EnumChildProc
枚举它们,我想创建 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创建模态窗口,父窗口还是可以响应消息,求解决方案!