怎样使应用程序在不通分辨率下正常工作?(200分)

F

fookk

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样使应用程序在不通分辨率下正常工作?
比如:我在800×600分辨率下编译的程序,在1024×768分辨率下运行用户界面变得很难看,
和编译是的布局有很大改变;反之依然如此。
请各位高手指点。。。。谢!!!【详】
(另外,我在win98和winxp或win2000编译的程序【分辨率均相同】,在不同的环境运行出现
和以上相似的现象。这使的,win98下编译的程序只能在win98环境中运行,而不能在winxp
或在win2000环境下运行【只是用户界面不美观,界面布局有很大改变和文字显示】)
请各位高手指点。。。。谢!!!【详】
 
把Form的Scaled属性设为False就不会有这样的问题
 
来迟了。楼上的说得对。
 
如果在MDI主窗口中设置了图片,将scaled设为false会导致图片无法显示。
把form的font属性中的字符集设为Chinese_Gb2312,字体设为宋体,字号9,可最大限度
防止2000与98下字体的不同。其它控件的Parentfont设为true,如要另设font,字符集
仍要按上述设置。
 
楼上说得对,chinese_GB很重要。

另外有一段小程序,改变scale的。
const
originHeight=600;
originWidth=800;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
if (screen.Width <>originwidth) then
begin
height:=longint(height)*longint(screen.height) div originheight;
width:= longint(width)*longint(screen.width) div originwidth;
end;
changescale(screen.Height,originheight);
end;
 
在以往的资料中找找,有一个能帮你在比同分辨率下自动调整控件位置的大小的控件
 
字符集用DEFAULT_CHARSET就行了
DEFAULT_CHARSET: Font is chosen based solely on Name and Size.
If the described font is not available on the system, Windows will
substitute another font.

>如果在MDI主窗口中设置了图片,将scaled设为false会导致图片无法显示
没有遇到这回事。 Scaled属性只是表明Form及其上的控件是否根据系统的参数自动调整
而已,应该不会导致图片无法显示的问题。由此可知,跟FONT及CharSet的选择也没有关系。
 
用控件:PerfectSize,可使界面较好的适应不同分辨率,并且调整form大小,各控件相对位置
也相应调整。
 
我的做法是用Panel控件和Splitter控件相结合的方法(就像资源管理器一样)。

1、首先用Panel控件将窗口分成几个相对独立的功能区域
2、再加入Splitter控件作为Panel的分割
3、然后调整Panel的Align属性,使其充满整个窗体
4、状态条控件可以和Panel控件共存,且不影响相互关系
5、然后在各个Panel中加入相应控件,并调整其Anchors属性,使其的右边或下边能随Panel的变化移动
6、至此一个可以随窗口变化而变化的界面就基本完成了,应付一般操作应该没有问题了

比如3个Panel和2个Splitter:Panel1.Align为alTop,Panel2.Align为alLeft,Panel3.Align为alClient
则可以实现上下结构的设计,其中下边又分为左右结构的两个。还可以嵌套Panel,以满足复杂屏幕布局的要求。

关于字体我没什么经验,不过好像一般宋体9号或12号是比较规范的,英文字体之间的差别就比较大。

 
补充一下:上面的方法基本思路就是让Panel随着Form或用户的喜好而变化,具体控件(Text等)随着Panel的变化而变。象TreeView, ListView, StringGrid, Memo等本来高度或宽度就比较自由的控件可以用在Panel变化时最受影响的位置,如最下方,最右方。
 
也可以先改变系统分辨率为你设定的分辨率,程序退出时再修改回去。
或者按照屏幕显示的大小动态改变一下控件的长宽也可以。
或者干脆用align统统对齐了事
 
以下为石家庄王俊关于此问题的答复,希望对你有所帮助。

我 们 知 道, 屏 幕 分 辨 率 的 设 置 影 响 着 表 单 布 局, 假 设 你 的 机 器 上 屏 幕 分
辨 率 是800*600, 而 最 终 要 分 发 应 用 的 机 器 分 辨 率 为640*480, 或1024*768, 这 样 你
原 先 设 计 的 表 单 在 新 机 器 上 势 必 会 走 样。 这 时 你 一 定 希 望 表 单 能 自 己 适 应
不 同 的 分 辨 率, 下 面 就 有 两 种 方 法 可 供 你 参 考。

---- 一、 根 据 新 的 分 辨 率 自 动 重 画 表 单 及 控 件

---- 先 在 表 单 单 元 的Interface 部 分 定 义 两 个 常 量, 表 示 设 计 时 的 屏 幕 的 宽 度 和 高
度( 以 像 素 为 单 位)。 在 表 单 的Create 事 件 中 先 判 断 当 前 分 辨 率 是 否 与 设 计 分
辨 率 相 同, 如 果 不 同, 调 用 表 单 的SCALE 过 程 重 新 能 调 整 表 单 中 控 件 的 宽 度
和 高 度。

Const
Orignwidth=800;
Orignheight=600;

procedure TForm1.FormCreate(Sender: TObject);
begin
scaled:=true;
if (screen.width<>orignwidth) then
begin
height:=longint(height)*longint
(screen.height) div orignheight;
width:=longint(width)*longint
(screen.width) div orignwidth;
scaleby(screen.width , orignwidth);
end;
end;
---- SCALE 过 程 在 调 整 控 件 宽 度 和 高 度 的 同 时, 也 自 动 调 整 控 件 字 体 的 大 小,
以 适 应 新 的 分 辨 率, 但 美 中 不 足 的 是 它 并 不 改 变 控 件 的 顶 点 坐 标 位 置, 也
就 是 说, 该 过 程 不 改 变 控 件 之 间 的 相 对 位 置 关 系。 要 想 调 整 控 件 之 间 的 选
队 相 对 位 置, 还 需 要 自 己 编 程 实 现, 有 兴 趣 的 读 者 可 试 一 试。


---- 二、 将 机 器 分 辨 率 更 改 为 设 计 时 的 分 辨 率

---- 这 种 方 法 不 改 变 表 单 本 身, 而 是 将 屏 幕 分 辨 率 更 改 为 与 表 单 设 计 时 用 到
的 分 辨 率 相 同。 它 需 要 用 到WINDOWS API 函 数EnumDisplaySettings 和ChangeDisplaySettings, 前
者 取 当 前 显 示 模 式 信 息, 后 者 则 更 改 显 示 设 置, 具 体 参 数 的 含 义 请 参 见
DELPHI 帮 助。 设 计 时 宽 度 常 量 和 高 度 常 量 的 定 义 如 方 法 一。

procedure TForm1.FormCreate(Sender: TObject);
var
devmode:tDevicemode;
begin
if screen.width<>orignwidth then
begin
if EnumDisplaySettings(nil,0,devmode) then
begin
devmode.dmfields:=dm_pelswidth OR dm_pelsheight ;
devmode.dmpelswidth:=orignwidth; {宽度}
devmode.dmpelsheight:=orignheight;{高度}
ChangeDisplaySettings(devmode,0); {更改设置}
end;
end;
end;
---- 以 上 两 种 方 法 在WINDOWS 95+DELPHI 3.0 环 境 下 均 已 通 过, 二 者 相 比, 前 者 是
主 动 适 应, 后 者 则 是 被 动 适 应。
 
可以几种方法一起使用的,效果也好.
 
多人接受答案了。
 
顶部