c++ - 如何在 WinAPI 中创建额外的控件?只有第一个控件有效?

标签 c++ winapi button

我最近开始研究 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/

相关文章:

c++ - 如何访问派生类中的 protected 成员?

c++ - 使用可变参数编号调用模板函数指针

winapi - 如何将命名空间添加到 msxml DOMDocument?

c++ - 使用 WinApi 函数计算文件中的数字

javascript - 如何在 JavaScript 中触发按钮单击 Enter

Android 应用程序在按下后退按钮时退出,而不是导航到上一个屏幕 - Flutter

c++ - 如何将 VARIANT* 与 dynamicCall 一起使用?

c++ - 当 SetDIBitsToDevice 返回错误代码 (0) 时,如何找到错误原因

windows - Windows 的 ImpersonateLoggedOnUser() + RevertToSelf() 与 Unix 的 seteuid() + setegid() 的速度

button - 将 "filter view"附加到谷歌表格中的按钮