为什么我的对话框创建失败了?菜鸟错误1

为什么我的对话框创建失败了?菜鸟错误1

作者:BlogUpdater |  时间:2023-12-19 |  浏览:186 |  评论已关闭 条评论

对话框中的资源要么被定义为一个整数,要么被定义为一个字符串。

仅仅一个简单的错误将会将其中的一个类型错误的变成另一个类型。我们来看一个例子。

你是否能发现其中的两处 “菜鸟级错误” ?

如果先获取资源文件并发送给预处理器,可能会更容易发现这个问题。

对 DialogBox 的第一次调用将 TEXT(“DLG_OPEN”) 作为资源名称传递。但请注意,没有具有该名称的资源。由于头文件中的第 #define DLG_OPEN 1 行,预处理器将 DLG_OPEN 变为 1。因此,对 DialogBox 的调用失败,因为没有名为 DLG_OPEN 的对话框。所需的对话框采用整数名称 1。

DialogBox(hInstance, MAKEINTRESOURCE(DLG_OPEN), hwnd, OpenDialogProc);

第二个错误更微妙。请注意,第二个对话框的名称拼写不一致。头文件称其为 DLG_WARN_REMOVEABLE,但资源文件称其为 DLG_WARN_REMOVABLE。因此,不会调用预处理器宏,结果是字符串名称为 TEXT(“DLG_WARN_REMOVABLE”) 的对话框。但是,代码会请求 MAKEINTRESOURCE(DLG_WARN_REMOVEABLE),该资源不存在。

要解决第二个问题,您首先必须确定您真正想要什么。您可能需要一个整数对话框资源,在这种情况下,解决方法是更正资源文件:

DLG_WARN_REMOVEABLE DIALOG 32, 32, 267, 73

另一方面,如果你真的希望对话框是一个命名资源(注意:这是非常罕见的),那么你需要按名称请求它:

DialogBox(hInstance, TEXT(“DLG_WARN_REMOVABLE”), hwnd, WarnRemoveableDialogProc);

在接下来的几天里,我们将再看看一些 “菜鸟错误”。

总结

请谨慎修改工程的资源定义文件(.rc文件),最好还是交给开发环境来自动维护。
机器在这方面(“老老实实的工作”)比人强。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Why can’t I create my dialog box? Rookie mistake #1》

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

评论已关闭。