- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
什么?
我有一个从资源 DLL 加载的 DLGTEMPLATE,如何以编程方式在运行时更改分配给控件的字符串?
我希望能够在创建对话框之前执行此操作,这样我就可以知道显示的字符串来自资源 DLL,而不是初始化对话框时对 SetWindowText 的调用。
谷歌已经找到了在代码中创建 DLGTEMPLATE 的例子,或者摆弄简单的样式位,但没有在内存中编辑字符串。
如何?
我通过 Hook 对话框/属性表创建 API 来做到这一点。这使我可以在创建实际对话框之前以及在具有 HWND 之前访问 DLGTEMPLATE。
为什么?
我希望能够进行运行时本地化和本地化测试。我已经为加载字符串(包括 MFC 7.0 包装器)、菜单和加速器表实现了这个,但我正在努力处理对话框/属性表的创建。
代码示例将是完美的答案,理想情况下是一个环绕 DLGTEMPLATE 的类,如果我制定出自己的解决方案,我会发布它。
最佳答案
您无法编辑内存中的字符串。 DLGTEMPLATE 结构是资源 dll 的相关字节的直接文件映射。那是只读的。
您将需要处理整个 DLGTEMPLATE 结构并用更改后的长度字符串写出一个新结构。
坦率地说,与构建 DLGTEMPLATE 编写器相比,通过与控件交互来 Hook WM_INITDIALOG 并更改字符串会更容易。因为周围的人不多。除非您有额外的要求将更改的对话框资源作为原始 .res 文件实际保存到磁盘(或尝试就地修改 .dll),否则我真的建议您避免这种方法。
你说你已经在为加速器表和菜单字符串做这件事——如果你能保证修补的字符串会更短,那么只需制作 DLGTEMPLATE 结构的二进制副本,并编写查找所需的非平凡扫描代码每个字符串,以便您可以将副本修补到位。
关于winapi - 如何以编程方式操作 DLGTEMPLATE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/204334/
什么? 我有一个从资源 DLL 加载的 DLGTEMPLATE,如何以编程方式在运行时更改分配给控件的字符串? 我希望能够在创建对话框之前执行此操作,这样我就可以知道显示的字符串来自资源 DLL,而不
我是一名优秀的程序员,十分优秀!