CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

在delphi中如何修改显示器的分辩率与刷新频率?

楼主feng_zi(二度程序员)2002-03-15 14:02:13 在 Delphi / VCL组件开发及应用 提问

 
  劳烦各位大侠,小弟有一事请教,在delphi中如何修改显示器的分辩率与刷新频率?用什么样的API函数呢?最好能给出例程,先谢了! 问题点数:100、回复次数:11Top

1 楼boby(......)回复于 2002-03-15 14:16:07 得分 25

function   Resolution(X,Y:word):boolean;  
   var  
    DevMode:TDeviceMode;  
    begin  
    Result:=EnumDisplaySettings(nil,0,DevMode);  
    if   Result   then  
   begin  
    DevMode.dmFields:=DM_PELSWIDTH   Or   DM_PELSHEIGHT;  
    DevMode.dmPelsWidth:=X;  
    DevMode.dmPelsHeight:=Y;  
    Result:=ChangeDisplaySettings(DevMode,0)=DISP_CHANGE_SUCCESSFUL;  
   end;  
  end;  
  Top

2 楼TechnoFantasy((VB MVP)www.applevb.com)回复于 2002-03-15 14:17:15 得分 25

procedure   SetRes(XRes,   YRes:   DWord);  
  var  
    lpDevMode   :   TDeviceMode;  
  begin  
    EnumDisplaySettings(nil,   0,   lpDevMode);  
    lpDevMode.dmFields:=DM_PELSWIDTH   or   DM_PELSHEIGHT;  
    lpDevMode.dmPelsWidth:=XRes;  
    lpDevMode.dmPelsHeight:=YRes;  
    ChangeDisplaySettings(lpDevMode,   0);  
  end;  
  Top

3 楼feng_zi(二度程序员)回复于 2002-03-15 14:17:48 得分 0

小弟要实现的是,先前的系统是在800*600下做的,开发工具为developer2000,现在在客户的17寸显示器都是1024*768了,显示非常难看,而要developer2000没有自己扩展的功能,如果整个系统重做的话,工作量非常之巨大,所以就想做一个调用程序,调用时将分辩率改为8000*600,退出后再改回。  
    如果大家有更好的方法,请给思路!Top

4 楼feng_zi(二度程序员)回复于 2002-03-15 14:19:31 得分 0

小弟要实现的是,先前的系统是在800*600下做的,开发工具为  
  developer2000,现在在客户的17寸显示器都是1024*768了,显示  
  非常难看,而要developer2000没有自己扩展的功能,如果整个系统  
  重做的话,工作量非常之巨大,所以就想做一个调用程序,调用时将  
  分辩率改为8000*600,退出后再改回。  
    如果大家有更好的方法,请给思路!Top

5 楼feng_zi(二度程序员)回复于 2002-03-15 14:26:15 得分 0

多谢boby(风之痕迹),TechnoFantasy(www.applevb.com)  
       分辩率是可以改变了,但改了之后整个显示面变得错位了,并且屏幕闪动,又与刷新频率有关,反正那样做,效果不是很好,你们有没有更好的方法呢?Top

6 楼jiaorg(jiaorg)回复于 2002-03-15 14:39:21 得分 25

Example   1  
   
   
  {...}  
   
  type  
      TForm1   =   class(TForm)  
          Button1:   TButton;  
          ListView1:   TListView;  
          procedure   Button1Click(Sender:   TObject);  
          procedure   FormCreate(Sender:   TObject);  
          {   05/31/99   -   added   TListView.OnDblClick   event   }  
          procedure   ListView1DblClick(Sender:   TObject);  
      private  
          {   Private   declarations   }      
          {   05/31/99   -   moved   here   for4m   TButton.OnClick  
                                    event   as   an   array   so   we   can   use  
                                    the   array   to   get   the   TDevMode   for  
                                    the   selected   one   from   the   TListView   }  
          DevMode   :   array[0..20]   of   TDevMode;  
      public  
          {   Public   declarations   }    
      end;    
   
  {...}  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
      {   set   viewstyle   to   vsReport   }  
      ListView1.ViewStyle   :=   vsReport;  
   
      {   set   rowselect   to   TRUE   }  
      ListView1.RowSelect   :=   TRUE;  
   
      {add   our   columns   ans   set   their   values   }  
      ListView1.Columns.Add;  
      ListView1.Columns.Add;  
      ListView1.Columns[0].Caption   :=   'Width   x   Height';  
      ListView1.Columns[0].Width       :=   100;  
      ListView1.Columns[1].Caption   :=   'Colors';  
      ListView1.Columns[1].Width       :=   100;  
  end;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      {   moved   to   be   a   private   array   so   we   can   use  
          the   array   to   get   the   TDevMode   for   the  
          selected   one   from   the   TListView   }  
      {   DevMode         :   TDevMode;   }  
      tmpStr1,  
      tmpStr2         :   String;  
      tmpDC             :   HDC;  
      x,  
      Selection,  
      cxScreen,  
      cyScreen,  
      Resolution   :   Integer;  
  begin  
      {   get   our   color   mode   }  
      tmpDC   :=   getDC(Handle);  
      try  
          cxScreen       :=   GetSystemMetrics(SM_CXSCREEN);  
          cyScreen       :=   GetSystemMetrics(SM_CYSCREEN);  
          Resolution   :=   GetDeviceCaps(tmpDC,   BITSPIXEL);  
      finally  
          ReleaseDC(Handle,   tmpDC);  
      end;  
   
      ListView1.Items.Clear;  
      x   :=   0;  
   
      {   05/31/99   -   changed   DevMode   to   an   array   to  
                                hold   all   the   TDevMode   values   to   be  
                                easily   selected   on   a   TListView  
                                OnDblClick   event   }  
      {   enumerate   all   possible   display   settings   }  
      while   EnumDisplaySettings(nil,x,DevMode[x])   do  
      begin  
   
          {   screen   width   and   height   }  
          tmpStr1   :=   IntToStr(DevMode[x].dmPelsWidth)+  
                                'x'+  
                                IntToStr(DevMode[x].dmPelsHeight);  
   
          {   colors   }  
          case   DevMode[x].dmBitsPerPel   of  
              4     :   tmpStr2   :=   '16   Colors';  
              8     :   tmpStr2   :=   '256   Colors';  
              16   :   tmpStr2   :=   'High   Color   (16   Bit)';  
              32   :   tmpStr2   :=   'True   Color   (32   Bit)';  
          end;  
   
          {   add   resolution   to   out   tlistbox   }  
          with   ListView1.Items.Add   do  
          begin  
              Caption   :=   tmpStr1;  
              SubItems.Add(tmpStr2);  
          end;  
   
          {   compare   our   settings   to   the   one   being   added  
              and   set   a   variable   to   be   used   to   visually  
              set   out   display   settings   in   our   tlistview   }  
          if   (   cxScreen       =   DevMode[x].dmPelsWidth     )   and  
                (   cyScreen       =   DevMode[x].dmPelsHeight   )   and  
                (   Resolution   =   DevMode[x].dmBitsPerPel   )   then  
              Selection   :=   x;  
   
          {   inc   to   the   next   display   setting   in   the   array   }  
          inc(x);  
   
          {   05/31/99   -   make   sure   we   do   not   over  
                                  run   our   array   }  
          if   x   =   20   then  
              Break;  
      end;  
   
      {   set   our   tlistview   to   select   our   current   setting  
          according   the   the   compare   done   within   the   above  
          loop   }  
      ActiveControl             :=   ListView1;  
      ListView1.Selected   :=   ListView1.Items.Item[Selection];  
  end;  
   
  {   05/31/99   }  
  procedure   TForm1.ListView1DblClick(Sender:   TObject);  
  var  
      tmpDevMode   :   TDevMode;  
  begin  
      {   get   our   selected   TDevMode   structure   }  
      tmpDevMode   :=   DevMode[ListView1.Items.IndexOf(ListView1.Selected)];  
   
      {   tell   windows   what   seetings   in   the   TDevMode   structure   to   us,   we  
          do   this   by   setting   the   TDevMode.dmFields   flag   }  
      tmpDevMode.dmFields   :=   DM_BITSPERPEL   or  
                                                    DM_PELSWIDTH   or  
                                                    DM_PELSHEIGHT   or  
                                                    DM_DISPLAYFLAGS   or  
                                                    DM_DISPLAYFREQUENCY;  
   
      {   use   the   CDS_TEST   flag   first   to   test   that   the   selected   display  
          setting   will   work   properly,   then   actually   set   the   new   dusplay  
          settings   }  
      if   ChangeDisplaySettings(tmpDevMode,  
                                                        CDS_TEST)   =   DISP_CHANGE_SUCCESSFUL   then  
          ChangeDisplaySettings(tmpDevMode,  
                                                      CDS_UPDATEREGISTRY);  
  end;  
   
  {...}  
  Top

7 楼Liujc(阿聪)回复于 2002-03-15 14:45:21 得分 25

 
  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   ;  
   
  Top

8 楼feng_zi(二度程序员)回复于 2002-03-15 14:55:02 得分 0

多谢大家的帮助,分辩率的改变已经可以实现,但是在改变分辩率的过渡有一阵黑屏,这同样也产生了不良的效果,请问有没有其它方法实现这样的分辩率改变的效果呢?  
    或者有更好的方法,使程序的能满屏显示呢?劳驾各位了!Top

9 楼feng_zi(二度程序员)回复于 2002-03-15 14:56:57 得分 0

多谢大家的帮助,分辩率的改变已经可以实现,但是在改变分辩率的过渡有一阵黑屏,  
  这同样也产生了不良的效果,请问有没有其它方法实现这样的分辩率改变的效果呢?  
    或者有更好的方法,使程序的能满屏显示呢?劳驾各位了!  
   
     
  Top

10 楼feng_zi(二度程序员)回复于 2002-03-15 15:21:40 得分 0

如何能使在修改分辩率时,不产生黑屏呢,绝望大家再帮小弟一下,很急!Top

11 楼redbirdli(火鸟)回复于 2002-03-18 16:39:21 得分 0

gzzTop

相关问题

  • vc中更改显示器分辩率
  • 如何编程实现改变显示器的分辩率?
  • 哪位知道在VB下如何获得显示器的分辩率
  • 显示器刷新率怎么变了?
  • 如何调显示器的刷新率?
  • 如何让窗体在不同分辩率和不同大小的显示器上都居中?
  • 请问:在程序启动时,怎么得到显示器的屏幕分辩率???
  • ★★★★大家讨论一下关于软件界面自动适应显示器分辩率的问题★★★★★★
  • 如何获得当前显示模式的分辩率和刷新率?
  • 一个显示器的刷新频率问题

关键词

  • 显示器
  • 频率
  • 修改
  • devmode
  • tdevmode
  • 分辩率
  • lpdevmode
  • listview
  • tmpdevmode
  • tlistview

得分解答快速导航

  • 帖主:feng_zi
  • boby
  • TechnoFantasy
  • jiaorg
  • Liujc

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo