一款老旧定制应用程序,使用VC6.0在WinXP平台开发,一直运行于WinXP SP1操作系统。
原来运行的计算机硬盘坏掉之后,更换了新计算机,安装了WinXP SP3,运行该定制程序发现程序主界面(模态对话框窗口)按键贴图与按键响应位置存在较大偏差,导致按键的点击操作与界面显示的按键(贴图)位置不一致,严重影响正常使用。
初步分析觉得,图片尺寸是不会变的,图片在显示贴图过程中的处理逻辑也不会改变,应该是对话框显示尺寸发生了变化,导致对应的按钮等操作控件位置随之发生变动,最终使得显示的按钮与对应的操作位置(按钮控件实际的显示位置)发生了错位。
调整系统界面字体和字号,错位量变化,但均达不到二者完全对应的程度。咨询一位资深大佬,大佬答复也应该是这个原因。反复调整无果。
考虑更换系统。应用程序与硬件相关的只有一个多串口卡,而且找到了多串口卡的Windows7 x86_64驱动(这个厂商值得表扬,各型号板卡各种平台各种版本的驱动官网上均提供了下载,它就是MOXA),重装系统为Windows7 x86_64 旗舰版,安装硬件驱动一次通过,运行应用程序,现象依旧。
准备从源代码下手修正这个偏差,幸而源代码在十多年后的今天竟然找到了,但需要安装老旧的Visual Studio 6,幸好手头存有一份(自我表扬一下),免除了网上百般down千般试的劳顿。
安装过程中提示VS6与Win7不兼容,一路忽略这种提示,直至安装完成。
将源代码另复制一份作为试验品(要给自己留足后悔药!!!)。
运行VS6,正常进入,打开应用程序的.dsw文件,编译,报错:
“...\..\... ... ...\AFXMEM.CPP 没有发现。”
以关键字“AFXMEM.CPP”问度娘,出现的只有关于 afxmem.obj 的答案。
以关键字“AFXMEM.H”问度娘,亦然。
看来AFXMEM基本不会出现问题。
灵机一动,是不是与编译环境设置中的路径参数相关?
菜单 -> Tools -> Options
弹出对话框,选择Directories标签,如下图,有路径设置(此图是修改路径后的)
路径显示为 C:\Program Files (x86) \...
想起来,VS6是32位程序,操作系统为64位Windows7,自动安装路径为C:\Program Files (x86) \下,
但估计 VS6 开发较早,其认为自己的安装路径为C:\Program Files\ 下,这里出现了差错。
关闭VS6,将VS6所在的整个文件夹从C:\Program Files (x86) \ 下剪切到C:\Program Files\ 下,
运行VS6,打开工程,将所有与 C:\Program Files (x86) \ 有关的路径参数都修改为 C:\Program Files\
具体见下图,红框内的4中类别都要检查修改:
打开应用程序工程,编译通过。
注:此时开始菜单中的VS6相关入口保存的仍是 C:\Program Files (x86) \ 路径下的快捷方式,虽然点击也可以运行,但显示不出程序图标,看着不爽,逐一右键,修改路径为新路径 C:\Program Files\,程序图标可以正常显示。
回头再看应用程序对话框资源相关设置,按钮贴图和实际响应位置错位的主对话框设定的字体为“幼圆”字号8,但当前系统中没有幼圆字体,更改为系统中已有的“宋体”,字号不变,重新编译运行,按钮贴图和响应位置一致。问题原因找到。
逐一检查所有的对话框,问题解决。
事件回顾 >>>>>>
基本情况:应用程序采用VC6开发,主界面为模态对话框,为了界面美观,采用贴图方式,进行美化。
该对话框选择了开发机上有的“幼圆”字体,并在此字体及所选择的字号下设定了对话框尺寸及所包含的按钮等控件的位置,以与设计的贴图保持位置上的对应。
隐含前提:如果系统不存在“幼圆”字体,系统会自动寻找最相近的字体进行替代。如果替代字体与原设定字体“幼圆”在相同字号下的大小有别,对话框会相应的自动调整尺寸,导致错位。
如果事先知道是缺少所需的字体导致的,只需在目标计算机上安装所需要的字体文件即可。
绕了一大圈,找到了原因,也算是个有益的体验。
身为码农,不得不慎重、不得不缜密,谁知道哪个地方有虫子在等着看码农的笑话呢 :)