C++ 什么';CreateWindowEx函数有什么问题?

C++ 什么';CreateWindowEx函数有什么问题?,c++,visual-studio-2008,winapi,api,visual-c++,C++,Visual Studio 2008,Winapi,Api,Visual C++,好的,首先让我们简单介绍一下我正在做的工作。 我试图在主父窗口中创建3个子窗口,并使用EnumChildWindow和EnumChildProc枚举它们,我想创建3个子窗口,其高度与父窗口相同,但宽度为1/3,并将它们逐个对齐 因此,我捕获了WM_CREATEmsg来创建这些子窗口,并WM_SIZE来使用MoveWindow移动和对齐它们,除了没有创建子窗口之外,一切都很好。当我调试它时,我发现(在Visual Studio 2008的Autos窗口中,调试时)我的CreateWindowEx语

好的,首先让我们简单介绍一下我正在做的工作。
我试图在主父窗口中创建3个子窗口,并使用
EnumChildWindow
EnumChildProc
枚举它们,我想创建3个子窗口,其高度与父窗口相同,但宽度为1/3,并将它们逐个对齐

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

声明如下:

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:我正在阅读这本电子书,从那里我得到了这些代码和所有内容,所以请不要要求我采取其他方法或其他什么,比如说把儿童创建代码放在其他地方或其他地方……因为我没有制作任何程序,只是按照一本书的例子……:)

我的灵力建议您需要将WS_VISIBLE样式传递给上面为您的子窗口调用的CreateWindow,以便您可以查看它们。:)

我的发展经验表明:

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

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


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

您是否也从该书中复制了
(LPCWSTR)(“childClass”)
?这真的有效吗?是的,书中是这样写的,但我也尝试将其更改为与parent相同的类,即visual studio默认为主窗口创建的
szWindowClass
,但也没有任何好处..我不确定,但我觉得这很奇怪。尝试将其替换为
L“childClass”
…是否VS创建的默认类
szWindowClass
不适合这些子窗口,因为它将
.lpfnWndProc
设置为
WndProc
,而处理这些子窗口的进程是
EnumChildProc
,如果是这样,我需要为子窗口创建一个新类并注册它吗?我确实尝试了
\T(“ChildClass”)
…是的,我在调试器中检查了它。调用返回NULL,然后我检查了@err it return 1407,在谷歌搜索时,我发现这表明
CreateWindowEx
中指定的窗口类未注册。另外,如果我注册这个类,因为我将为子窗口注册这个类,那么我应该在WndClassEx::lpfnWndProc方法中指定什么?原因在父类中,其值为
WndProc
。那么这种情况应该是相同的还是不同的呢?那么我必须注册这个“儿童班”吗?前面我只是将这个文本字符串放在代码中,但实际上它没有指定任何内容。同一窗口类的所有实例都将具有相同的wndproc回调函数。您可能需要两个窗口类。一个用于父窗口,一个用于子窗口(每个窗口类都有一个单独的wndproc函数回调)。在应用程序启动时注册两个窗口类。如果每个窗口的行为不同,请使用lpParam参数CreateWindow将初始化数据传递给每个窗口。