|
|
1
5
您不能编辑内存中的字符串。dlgtemplate结构是资源dll的相关字节的直接文件映射。这是只读的。 您将需要处理整个dlgtemplate结构,并用更改后的长度字符串写出一个新的结构。 坦率地说,与构建dlgtemplate编写器相比,只需钩住wm initdialog并通过与控件交互来更改字符串更容易。因为周围的人不多。除非您有实际将更改过的对话框资源作为原始.res文件保存到磁盘的附加要求(或尝试修改.dll就地),否则ID确实建议您避免这种方法。 你说你已经在为加速器表和菜单字符串做这个了-如果你能保证修补后的字符串会变短,那么就做一个dlgtemplate结构的二进制副本,并编写查找每个字符串所需的非普通扫描代码,这样你就可以在适当的地方修补副本。 |
|
|
2
4
有一个名为resfmt.zip的文件(我认为它起源于Microsoft,但我不完全确定),它用一些代码示例解释了这一点。陈瑞蒙在他的博客中也做了一些很好的解释。请注意,DialogEx和Dialog控件的格式不同。 正如其他一些答案中所指出的,您需要从头开始重新创建结构。这还不错,因为你已经掌握了基本信息。添加控件是困难的地方。 基本上,在word*lpin中分配一个较大的内存块。然后把结构加起来。添加对话框的基本信息(请参阅dlgtemplate)和控件非常明显,因为这些信息在msdn中。 您将遇到的两个最大问题是:确保各个部分从路线边界开始,并解释对话框控件的值,尤其是在只添加字符串、字符串或序号时。每个控件都需要从一个偶数边界开始。 对于第一个(从我认为是resfmt.zip的某个地方借来的): WORD *AlignDwordPtr (WORD *lpIn)
{
ULONG ul;
ul = (ULONG) lpIn;
ul +=3;
ul >>=2;
ul
这使得我可以很容易地从代码中组装整个对话框。 |
|
|
3
1
见api函数: EnumChildWindows (HWND、Wndunmproc、Lparam) 您可以在cformView::Create或cdialog::OnInitDialog中调用此函数,以给自己一个替换控件标题的机会。别担心,在你更换之前,旧弦不会闪烁。 在对话框资源中,将控件标题设置为某种字典中的键。如果您正在编译/clr,那么可以使用托管字符串表资源。在回调中,在字典中查找已翻译的字符串,并将控件的标题设置为翻译。/clr和托管字符串表的另一个好处是,您可以通过已经设置了System::Threading::Thread::CurrentThread->CurrentUICulture的Windows(或您)自动查找正确的语言。 像这样的东西
|
|
|
4
1
您必须在表示模板的mem缓冲区中找到要修改的字符串。唯一的方法是遍历整个模板。这不容易。 完成后,如果新字符串比原始字符串长,可以在缓冲区中插入字节。或者,如果新字符串较短,则收缩缓冲区。 正如Chris所写,在wm_InitDialog中修改文本并尝试重新表述您的要求,即您可能不会调用setWindowText(),这会更容易。 |
|
|
5
0
多谢大家,我确实在这个问题上休息了24个小时,然后使用了一个全局Windows钩子过滤wm-initdialog,这是一个非常简单的方法,解决得很好,不需要API钩住,只需要2页代码到几行。 谢谢你的回答。 |