function ChangeDisplaySettingsW(var lpDevMode: TDeviceModeW; dwFlags: DWORD): Longint; stdcall;                             external 'user32.dll' name 'ChangeDisplaySettingsW' index 31;

解决方案 »

  1.   

    改辨率的
    function ChangeDisplay(width,height:word) :BOOL ;
    var
        lpDevMode :TDEVICEMODe ;
    begin
        result := EnumDisplaySettings(Nil ,0 ,lpDEVMode) ;
        if result then
        begin
            lpDevmode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT ;
            lpdevmode.dmPelsWidth := width ;
            lpdevmode.dmPelsHeight := height ;
            result := ChangeDisplaySettings(lpdevmode ,CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL ;
        end;
    end;上面的代码,在2000下执行,刷新频率为最低,所以必改刷新频率,才够。。//获得当前系统显示刷新频率
    function GetDispSet():integer;
    var
      DeviceMode: TDeviceMode;
    begin
       result:=0;
       EnumDisplaySettings(nil, Cardinal(-1), DeviceMode);
       result:=DeviceMode.dmDisplayFrequency;
    end;//改变系统显示刷新频率
    function ChangeDispSet(iFrequency:integer):integer;
    var
      DeviceMode:TDeviceMode;
    begin
       result:=0;
       EnumDisplaySettings(nil,Cardinal(-1), DeviceMode);
       DeviceMode.dmDisplayFrequency:=Cardinal(iFrequency);
       result:=ChangeDisplaySettings(DeviceMode,CDS_UPDATEREGISTRY);
    end;
      

  2.   

    最好的方法,可能就是程序启动时首先检测系统分辨率,如果不符合要求,就更改为符合要求的。比如你的分辨率是1024X768,用户是800X600。那就在程序启动的时候把系统分辨率更改。在程序退出的时候再把分辨率修改回原来状态。我觉得这样可能是最好,最完美,最省事的方法了。
    我的方法根据高手的指点定义两个全局变量。SCREENX,SCREENY:INTEGER;
    procedure Tmainwinform.FormCreate(Sender: TObject);
    var
      sx, sy: Integer;
      DevMode: TDeviceMode;
    begin
      sx := GetSystemMetrics(SM_CXSCREEN); //分辨率宽
      sy := GetSystemMetrics(SM_CYSCREEN); //分辨率高
      //用于在程序结束时把分辨率 改回原始状态
      screenx := sx; //分辨率宽
      screeny := sy; //分辨率高
      if (sx <> 1024) and (sy <> 768) then
      begin
        DevMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
        DevMode.dmPelsWidth := 1024;
        DevMode.dmPelsHeight := 768;
        ChangeDisplaySettings(DevMode,0); //设置新的显示参数
      end;
    程序关闭时把分辨率修改为原来状态:
    procedure Tmainwinform.FormClose(Sender: TObject;
      var Action: TCloseAction);
    var
      sx, sy: Integer;
      DevMode: TDeviceMode;
    begin
             sx := GetSystemMetrics(SM_CXSCREEN); //分辨率宽
             sy := GetSystemMetrics(SM_CYSCREEN); //分辨率高
            if (sx <> screenx) and (sy <> screeny) then
            begin
               DevMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
               DevMode.dmPelsWidth := screenx;
               DevMode.dmPelsHeight := screeny;
               ChangeDisplaySettings(DevMode,0); //设置新的显示参数
            end;
        actiON:=cafree;
    end;//本代码编在1024×768,运行时自动将分辨率设为800×600,适应大小,参考一下吧。
    procedure TForm1.FormCreate(Sender: TObject);
    const
      orignwidth = 800;
      orignheight = 600;
    var
    devmode:tDevicemode;
    begin
    if screen.width<>orignwidth then
        begin
        if EnumDisplaySettings(nil,0,devmode) then
    begin
      devmode.dmfields:=dm_pelswidth OR dm_pelsheight
                                     OR dm_DisplayFrequency;
      devmode.dmpelswidth:=orignwidth; {宽度}
      devmode.dmpelsheight:=orignheight;{高度}
      devmode.dmDisplayFrequency:= 75;  {刷新率}
      ChangeDisplaySettings(devmode,0); {更改设置}
    end;
    end;
    end;
    其中两个全局参数很重要。
    屏幕中的控件自适应大小:假设你在800*600的分辨率下设计的form,第一步:
    inplementation
    const
      ScreenWidth: LongInt = 800; {I designed my form in 800x600 mode.}
      ScreenHeight: LongInt = 600;{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    begin
      scaled := true;
      if (screen.width <> ScreenWidth) then
      begin
        height := longint(height) * longint(screen.height) div ScreenHeight;
        width := longint(width) * longint(screen.width) div ScreenWidth;
        scaleBy(screen.width, ScreenWidth);
      end;
    end;下一步,要让每个子控制的字体改变到合适的大小:
    type
      TFooClass = class(TControl); { needed to get at protected }
                                   { font property }var
      i: integer;
    begin
      for i := ControlCount - 1 downto 0 do
        TFooClass(Controls[i]).Font.Size :=
            (NewFormWidth div OldFormWidth) *
            TFooClass(Controls[i]).Font.Size;
    end;
    设置刷新频率EnumDisplaySettings我想要的是最匹配值,也就是800*600能否上到100Hz,1024*768能否上到85Hzprocedure GetDisplayFrequency(List: TStrings);
    var
      DeviceMode: TDeviceMode;
      Index: Integer;
    begin
      Index := 0;
      while EnumDisplaySettings(nil, Index, DeviceMode) do
      with DeviceMode do
      begin
        List.Append(Format('色深=%d,显示宽度=%d,显示高度=%d,显示频率=%d',
                    [dmBitsPerPel,dmPelsWidth,dmPelsHeight,dmDisplayFrequency]));    Inc(Index);
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      GetDisplayFrequency(Memo1.Lines);
    end;uses
      Windows, SysUtils; ... // 这个函数返回的显示刷新率是以Hz为单位的 
    function GetDisplayFrequency: Integer; 
    var
      DeviceMode: TDeviceMode; begin
      EnumDisplaySettings(nil, Cardinal(-1), DeviceMode);
      Result := DeviceMode.dmDisplayFrequency; 
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
            current:string;
            dm:DEVMODE;
    begin
            dm.dmSize:=sizeof(DEVMODE);
            EnumDisplaySettings(nil,DWORD(-1),dm);
            current:=format('%s at %dx%d %dbpp %dHz',
    [dm.dmDeviceName,
    dm.dmPelsWidth,
    dm.dmPelsHeight,   
    dm.dmBitsPerPel,
    dm.dmDisplayFrequency]);        showmessage(current);
    end;Delphi程序设计界面的动态调整施江杰 --------------------------------------------------------------------------------
     如何设计美观的程序一直是程序员的一大难题,很多程序员可以写出很好的程序,但往往困于拙劣的外观。其中如何使美观的程序能在不同的环境下一样美观也同样困扰着我们,我在一些程序的制作中掌握了一些使程序在不同环境同样美观的方法,希望给大家一点启示。 
    不同环境一般有不同的色彩数和不同的分辨率等等,我只对这两种环境进行说明。 
    一. 不同的色彩数 
    对于不同的色彩数我们可以用启动时加以判断并选择相应的配色/图片方案。可在窗口建立时加入程序如下: 
    procedure TForm1.FormCreate(Sender: TObject); 
    var 
    colorbits:Integer; 
    begin 
    colorbits :=GetDeviceCaps( h, BITSPIXEL ); 
    case colorbits of 
    1: //黑白配色方案; 
    .... 
    4: //16色配色方案; 
    .... 
    8: //256色配色方案; 
    .... 
    16: //16位色配色方案; 
    .... 
    24: //24位色配色方案; 
    .... 
    32: //32位色配色方案; 
    .... 
    end; 
    end; 
    这样就可以在不同的颜色环境下使用不同的配色方案,不同的图标/图片/色彩均在设计者的控制下,可制作出比较好的图片/彩色环境,而不至于在真彩时很不错,而在16色时一塌糊涂。 
    二. 不同的分辨率 
    不同的分辨率下原来的窗口界面可能变得面目全非,对于这种问题,我一般采取以下方式: 
    先取得分辨率方法有如下: 
    procedure TForm1.FormCreate(Sender: TObject); 
    var 
    sx,sy:Integer; 
    begin 
    sx := GetSystemMetrics(SM_CXSCREEN); //分辨率宽 
    sy := GetSystemMetrics(SM_CYSCREEN); //分辨率高 
    end; 
    也可以用Screen.width/Screen.Height来取得 
    也可以用Var DevMode:TDeviceMode; 
    Begin 
    EnumDisplaySettings(nil,0,DevMode)  
    sx := DevMode.dmPelsWidth  
    sy := DevMode.dmPelsHeight 来取得 
    end 
    也可以用sx := GetDeviceCaps(GetDC(Form1.Handle), HORZRES) 
    sx :=GetDeviceCaps(GetDC(Form1.Handle), VERTRES) 来取得而后有以下几种方法: 
    1. 判断分辨率并选择相应的分辨率方案; 
    (对每种分辨率设计一套控件/字体的大小方案用于在不同分辨率下选择) 
    2. 固定窗口大小; 
    procedure TForm1.FormResize(Sender: TObject); 
    begin 
    width:=640; height:=480; 
    left:=0; top:=0; 
    end; 
    3. 使用procedure ScaleBy(M, D: Integer)这个过程来对可视控件进行大小调节(此过程不调节窗口大小,也不变动控件的left和top,对控件的大小按M/D比例来调节),具体如下: 
    procedure TForm1.FormCreate(Sender: TObject); 
    //假设原来的设计环境为800x600 
    var 
    FWidth:integer; 
    begin 
    if(Screen.width<> 800)then 
    begin 
    FWidth:=Width; 
    Scaled:=TRUE; 
    Font.Size:=(Width DIV FWidth)*Font.Size;//字体大小调整 
    ScaleBy(Screen.Width,800); //控件大小调整 
    Height:=longint(Height)*longint(Screen.Height)DIV 600;  
    Width:=longint(Width)*longint(Screen.Width)DIV 800;//窗口大小调整 
    end; 
    end; 
    用此种方法比较实用,而且使用比较简单,基本能适应大多数环境。 
    4. 调节分辨率到所需的分辨率(即设计时的分辨率,此法对要求封闭的系统比较有用,如工控、触摸屏等等) 
    procedure TForm1.FormCreate(Sender: TObject); 
    var 
    FWidth:integer; 
    DevMode:TDeviceMode; 
    begin 
    if(Screen.width<> 800)then 
    begin 
      Result:=EnumDisplaySettings(nil,0,DevMode); //取得旧的显示参数 
      if Result then 
      begin 
      DevMode.dmFields:=DM_PELSWIDTH Or DM_PELSHEIGHT; 
     DevMode.dmPelsWidth:=800; 
      DevMode.dmPelsHeight:=600; 
    ChangeDisplaySettings(DevMode,0); //设置新的显示参数 
    end; 
    end; 
    当然,我们还可以使用Delphi的法宝第三方控件,我找的有ResScale 控件,此控件能够适应多种不同屏幕分辨率,自动改变TForm上控件位置及尺寸的控件,控件位置会储存于.INI文件或注册表中。你还可以找到更好的控件或者方法,找到的话告诉我一下mail me: [email protected]
      

  3.   

    谢,不过老实说不是我要,我自己重不改res