我最近开始研究 WinAPI。在浏览了关于它的教程的大约 10 个热门搜索结果后,我仍然感到困惑,您在哪里为每个窗口添加多个控件的代码?例如,如果我想添加第二个按钮,需要什么样的代码以及将代码放在哪里?
当我#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;
第一个按钮显示正常,但第二个按钮不显示(坐标也不同)。我在这里做错了什么?谢谢!
编辑:
我将代码中的 hIns2
替换为 hIns
。
最佳答案
hButton2=CreateWindow("Second","Press here",WS_CHILD|WS_VISIBLE,...);
让我们从核心来解决这个问题。您做错的根本是完全忽略了检查错误的需要。 CreateWindow() 失败时返回 NULL。 GetLastError() 然后返回指示问题的错误代码。在带有“@err”伪变量的调试器中也可以看到相同的错误代码。
然后您很快就会发现您遇到了错误 1407,在 WinError.h SDK header 中的描述如下:
//
// MessageId: ERROR_CANNOT_FIND_WND_CLASS
//
// MessageText:
//
// Cannot find window class.
//
#define ERROR_CANNOT_FIND_WND_CLASS 1407L
这清楚地表明您在 CreateWindow() 调用中弄错了类名。
永远不要跳过错误检查,尤其是当您刚开始使用 winapi 编程时。当用户的机器出现问题时,让程序优雅地失败不仅有用,而且诊断代码中的错误显然也非常有用。
关于c++ - 如何在 WinAPI 中创建额外的控件?只有第一个控件有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14379736/