什么?
我从资源DLL加载了DLGTEMPLATE,如何在运行时以编程方式更改分配给控件的字符串?
我希望能够在创建对话框之前执行此操作,这样我就可以知道显示的字符串来自资源DLL,而不是初始化对话框时来自对SetWindowText的调用。
Google找到了一些示例,这些示例可以在代码中创建DLGTEMPLATE,或旋转简单的样式位,但是在编辑内存中的字符串时没有任何帮助。
怎么样?
我是通过钩住对话框/属性表创建API来实现的。这使我可以在创建实际对话框之前和拥有HWND之前访问DLGTEMPLATE。
为什么?
我希望能够进行运行时本地化和本地化测试。我已经实现了用于加载字符串(包括MFC 7.0包装器),菜单和加速器表的实现,但是我正在努力处理对话框/属性表的创建。
代码示例将是一个完美的答案,理想情况下是一个包装DLGTEMPLATE的类,如果我制定自己的解决方案,我将其发布。
最佳答案
您无法编辑内存中的字符串。 DLGTEMPLATE结构是资源dll的相关字节的直接文件映射。多数民众赞成在只读。
您将需要处理整个DLGTEMPLATE结构,并使用更改后的长度字符串写出一个新的结构。
坦率地说,仅挂接WM_INITDIALOG并通过与控件交互来更改字符串比构建DLGTEMPLATE编写器要容易得多。因为周围没有很多。除非您有其他要求将更改后的对话框资源实际保存为原始.res文件(或尝试就地修改.dll),否则Id确实建议您避免这种方法。
您说您已经对加速器表和菜单字符串进行了此操作-如果可以保证在字符串中打补丁的字符串会更短,则只需对DLGTEMPLATE结构进行二进制复制,并编写非平凡的扫描代码即可找到每个字符串,以便您可以将副本修补到位。