在这下的汉化版http://bbs.pediy.com/showthread.php?...Explorer+Suite
感谢netprodiag

之前就下了但一直没用上,不知道其他人有没有这种情况,打开个文件后表格里的文字全是显示不完的,
试了原版也是这样,表格能拖拉的还好,不行的话基本上什么也看不到,就一直没用,今天要用到它,实在
找不到解决办法,就动手改了下.

开始以为是字体问题,它的表格查了下是用的MFCGridCtrl,百度后有人说是画出来的,于是找到
CreateFontIndirectW把字体全改成9号,谁知道表格也跟着缩小了,直接晕到.

换方法,找到程序里的DrawTextW函数下断,果然在00502872处不停断下,看下面代码和堆栈
0050284B   .  50            push eax
0050284C   .  8D4D 14       lea ecx,dword ptr [ebp+14]
0050284F   .  E8 8CE7F7FF   call 00480FE0
00502854   .  50            push eax
00502855   .  6A FF         push -1
00502857   .  8B85 F0FEFFFF mov eax,dword ptr [ebp-110]
0050285D   .  8B10          mov edx,dword ptr [eax]
0050285F   .  8B8D F0FEFFFF mov ecx,dword ptr [ebp-110]
00502865   .  8B42 38       mov eax,dword ptr [edx+38]
00502868   .  FFD0          call eax
0050286A   .  50            push eax                                 ; |Text
0050286B   .  8B4D 08       mov ecx,dword ptr [ebp+8]                ; |
0050286E   .  8B51 04       mov edx,dword ptr [ecx+4]                ; |
00502871   .  52            push edx                                 ; |hDC
00502872   .  FF15 EC165800 call dword ptr [<&USER32.DrawTextW>]     ; \DrawTextW

堆栈:
0012D780   C6013366  |hDC = C6013366
0012D784   00CCD208  |Text = "属性"
0012D788   FFFFFFFF  |Count = FFFFFFFF (-1.)
0012D78C   0012D8D8  |pRect = 0012D8D8 {8.,8.,113.,14.}
0012D790   00008824  \Flags = DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX|DT_END_ELLIPSIS

这里明显就是把所有文字不停的刷新
插句话,在这之前还试了改pRect,指针里的数分别是左,上,右,下,心想把上和下改小点就应该能显示完了吧,
最后发现改这没用,只是文字的相对位置而已

查了下函数原型:
int DrawText(HDC hdc, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat);
主要看这个
uFormat:指定格式化正文的方法。它可以下列值的任意组合,各值描述如下:
具体可以参考
http://baike.baidu.com/view/1023733.htm
发现个重要的
DT_NOCLIP:无裁剪绘制当DT_NOCLIP使用时DrawText的使用会有所加快。

备注:函数DrawText用设备环境中的字体选择、正文颜色和背景颜色来写正文,除非DT_NOCLIP被使用,
DrawText裁剪正文,所以它不会出现在指定矩形的外面,除DT_SINGLELINE格式化,其余的格式都认为
正文有多行。如果选择的字体对指定的矩形而言太大,DrawText不会试图去换成一种小字体。

看上面堆栈并没这个标志,于是手动加上,大功告成.

下面动手改程序.
先查下得到DT_NOCLIP = $100;那么只要把0012D790里的 8824 Or 100就OK了
改的地方不多,直接在DrawTextW前处理一下参数就行了,程序后部有不少空间,那就直接跳过去处理吧

00502854   .  50                   push eax
00502855   .  6A FF                push -1
00502857   .  8B85 F0FEFFFF        mov eax,dword ptr [ebp-110]
0050285D   .  8B10                 mov edx,dword ptr [eax]
0050285F   .  8B8D F0FEFFFF        mov ecx,dword ptr [ebp-110]
00502865   .  8B42 38              mov eax,dword ptr [edx+38]
00502868   .  FFD0                 call eax
0050286A   .  50                   push eax
0050286B   .  E9 20DB0700          jmp 00580390
00502870      90                   nop
00502871   >  52                   push edx                                 ; |hDC
00502872   .  FF15 EC165800        call dword ptr [<&USER32.DrawTextW>]     ; \DrawTextW
....

00580390   > \814C24 0C 00010000   or dword ptr [esp+C],100
00580398   .  8B4D 08              mov ecx,dword ptr [ebp+8]
0058039B   .  8B51 04              mov edx,dword ptr [ecx+4]
0058039E   .^ E9 CE24F8FF          jmp 00502871

检查一下,这里的堆栈就变成这样了
0012D780   DA0139E5  |hDC = DA0139E5
0012D784   00CCD710  |Text = "属性"
0012D788   FFFFFFFF  |Count = FFFFFFFF (-1.)
0012D78C   0012D8D8  |pRect = 0012D8D8 {8.,8.,113.,14.}
0012D790   00008924  \Flags = DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_NOCLIP|DT_NOPREFIX|DT_END_ELLIPSIS

至此完工,因为没对参数做判断,所以说是临时的解决方法,难以保证不出问题,不过据观察,好像参数没变过,如果有
其它更好的方法,请告之,谢谢.


                                                                                Sam.com[CCG] 2009年7月23日

效果图: