我想让程序判断当前显示器是否800*600,如果不是则强行设置为800*600请教各位了!帮帮忙啊!

解决方案 »

  1.   

    DELPHI 中 自 适 应 表 单 的 实 现 
    石 家 庄 军 械 工 程 学 院 五 系 王 俊 
    ---- 我 们 知 道, 屏 幕 分 辨 率 的 设 置 影 响 着 表 单 布 局, 假 设 你 的 机 器 上 屏 幕 分
    辨 率 是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 环 境 下 均 已 通 过, 二 者 相 比, 前 者 是
    主 动 适 应, 后 者 则 是 被 动 适 应。 
      

  2.   

    {设置显示器分辨率的过程-------------------------------------------------}
    procedure SetScreenSize(W,H: Integer);
    var
      DevMode: TDevMode;
    begin
      if (w<640) or (h<480) then exit;
      if EnumDisplaySettings(nil,0,DevMode) then 
      begin
        with DevMode do 
        begin
          dmPelsWidth := W;
          dmPelsHeight := H;
          dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
        end;
        ChangeDisplaySettings(DevMode, 0);
      end;
    end;
      

  3.   

    得到显示器分辨率GetSystemMetrics(SM_CXSCREEN);
    GetSystemMetrics(SM_CYSCREEN);
      

  4.   

    把goomoo(古木) 朋友的代码改一点儿就行了
    procedure SetScreenSize(W,H: Integer);
    var
      DevMode: TDevMode;
    begin
      if (w<640) or (h<480) then exit;
      if EnumDisplaySettings(nil,0,DevMode) then
      begin
        with DevMode do
        begin
          dmPelsWidth := W;
          dmPelsHeight := H;
          dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_DISPLAYFREQUENCY;
          dmDisplayFrequency := 85;
        end;
        ChangeDisplaySettings(DevMode, 0);
      end;
    end;
      

  5.   

    我的是这么写的:*******************************************************************************
    *   过程名:SetScreen
    *   过程说明:    修改屏幕的分辨率,使屏幕软件在运行时不会因为分辨率的问题而失真
    *
    *   参数说明:
    *   OldWidth,OldHeight:   使过程返回系统原有的屏幕的分辨率(分别为宽与高)
    *   NewWidth,NewHeight:   想要设置的屏幕的分辨率(分别为宽与高)
    *******************************************************************************)Procedure  TForm1.SetScreen(NewWidth,NewHeight,NewFreq:Integer; Var OldWidth,OldHeight,OldFreq:Integer);{实现的代码}
    Procedure  TForm1.SetScreen(NewWidth,NewHeight,NewFreq:Integer; Var OldWidth,OldHeight,OldFreq:Integer);
    Var
      DevMode: TDeviceMode;
    begin
      OldWidth:=  GetSystemMetrics(SM_CXSCREEN);
      OldHeight:= GetSystemMetrics(SM_CYSCREEN);  if (OldWidth <> NewWidth) and (OldHeight <> NewWidth) then
      begin
        DevMode.dmSize:=  sizeof(TDeviceMode);
        EnumDisplaySettings(nil, DWORD(-1), DevMode);
        DevMode.dmFields:=  DM_PELSWIDTH or DM_PELSHEIGHT or DM_DISPLAYFREQUENCY;
        DevMode.dmPelsWidth:= NewWidth;
        DevMode.dmPelsHeight:=  NewHeight;
        OldFreq:= DevMode.dmDisplayFrequency;
        DevMode.dmDisplayFrequency:=  NewFreq;
        ChangeDisplaySettings(DevMode,0);
      end;
    end;调用:在FORM的CREATE事件中写:  SetScreen(1024,768,65,Screenx,Screeny,TheFreq);在FORM的DESTROY事件中写:
      SetScreen(Screenx,Screeny,TheFreq,Screenx,Screeny,TheFreq);
      

  6.   

    Drate(鸟窝里的虫):
    你的代码里 原刷新率OldFreq如何得到呢?
      

  7.   

    OldWidth:=  GetSystemMetrics(SM_CXSCREEN);
      OldHeight:= GetSystemMetrics(SM_CYSCREEN);
      
      Oldfreq:=????
     
    麻烦帮忙把?号补充一下啦,谢谢