0

我最近开始研究 WinAPI。在浏览了大约十个关于它的教程的热门搜索结果之后,我仍然感到困惑,你在哪里为每个窗口添加多个控件的代码?例如,如果我想添加第二个按钮,需要什么样的代码以及将代码放在哪里?

当我#define IDC_BUTTON WM_USER + 1,添加HINSTANCE hIns;HWND hButton;回调,然后调用这个:

case WM_CREATE:
    hIns=((LPCREATESTRUCT)lParam)->hInstance;
    hButton=CreateWindow("Button","Click Me",WS_CHILD|WS_VISIBLE,70,60,150,30,hwnd,(HMENU)IDC_BUTTON,hIns,0);
break;

它工作,按钮出现在窗口中。但是当我尝试添加第二个时,即使更改了名称,也没有出现任何内容:

#define IDC_BUTTON2 WM_USER + 2
+
HINSTANCE hIns;
HWND hButton2;

case WM_CREATE:
   hIns=((LPCREATESTRUCT)lParam)->hInstance;
   hButton=CreateWindow("Button","Click Me",WS_CHILD|WS_VISIBLE,70,60,150,30,hwnd,(HMENU)IDC_BUTTON,hIns,0);
   hButton2=CreateWindow("Second","Press here",WS_CHILD|WS_VISIBLE,170,160,250,130,hwnd,(HMENU)IDC_BUTTON2,hIns,0);
   break;

第一个按钮显示正常,但第二个按钮不正常(坐标也不同)。我在这里做错了什么?谢谢!

编辑:我替换hIns2hIns代码中的。

4

2 回答 2

3
 hButton2=CreateWindow("Second","Press here",WS_CHILD|WS_VISIBLE,...);

让我们从核心解决这个问题。您做错的根本原因是完全忽略了检查错误的需要。CreateWindow() 失败时返回 NULL。GetLastError() 然后返回指示问题的错误代码。在带有“@err”伪变量的调试器中也可以看到相同的错误代码。

然后,您很快就会发现出现错误 1407,在 WinError.h SDK 标头中描述如下:

//
// MessageId: ERROR_CANNOT_FIND_WND_CLASS
//
// MessageText:
//
// Cannot find window class.
//
#define ERROR_CANNOT_FIND_WND_CLASS      1407L

这清楚地表明您在 CreateWindow() 调用中弄错了类名。

永远不要跳过错误检查,尤其是当您刚开始使用 winapi 编程时。当用户机器出现问题时让程序优雅地失败不仅有用,而且诊断代码中的错误显然也非常有用。

于 2013-01-17T15:39:30.063 回答
0

首先,"SECOND除非你已经定义了一个类名,否则没有调用类名,所以如果你想说 10 个按钮,CreateWindow函数中的第一个参数将在所有这些按钮中,如果你想要一个可编辑的文本"BUTTON",你也可以将其更改为"EDIT"盒子或者"STATIC"如果你蚂蚁放一个静态盒子。其次,如果您遵循以下说明,您可以更轻松地添加按钮:

#define IDB_BUTTON WM_USER + 2 而不是通过制作然后将其IDB_BUTTON插入CreateWindow函数来定义按钮, 因为(HMENU)IDB_BUTTON 您可以简单地写入(HMENU)<any number of your choice>CreateWindow 函数,就像(HMENU) 2不需要使用预定义该数字#define,然后当您想在按下按钮时进行操作时,您可以只需在具有 switch 的 switch 语句的情况下传递该数字(LOWORD(wParam))

这似乎令人困惑,但请查看代码以了解我的意思

您的程序中的完整代码:

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch(Msg)
{
case WM_CREATE:
hButton=CreateWindow("Button","Click Me",WS_CHILD|WS_VISIBLE,70,60,150,30,hWnd,(HMENU) 1,NULL,NULL);
hButton2=CreateWindow("BUTTON","Press here",WS_CHILD|WS_VISIBLE,170,160,250,130,hwnd,(HMENU) 2,NULL,NULL);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case 1:
//What will the first button do?write it here
break;
case 2:
//What will the second button do?write it here
break;
}
    break;
}
return 0;
}

祝你在学习win32 c++的道路上好运

;)

于 2017-04-21T16:18:30.983 回答