对话框中的资源要么被定义为一个整数,要么被定义为一个字符串。
仅仅一个简单的错误将会将其中的一个类型错误的变成另一个类型。我们来看一个例子。
>> 请移步至 www.topomel.com 以查看图片 <<
你是否能发现其中的两处 “菜鸟级错误” ?
如果先获取资源文件并发送给预处理器,可能会更容易发现这个问题。
>> 请移步至 www.topomel.com 以查看图片 <<
对 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》