如何动态改变屏幕的分辨率?(100分)

  • 主题发起人 主题发起人 3.14
  • 开始时间 开始时间
3

3.14

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用API ChangeDisplaySetting可以动态改变屏幕的分辨率,但是有一个问题,改变分辨率以后taskbar位置会乱,比如640*480变到800*600后taskbar位置会走到屏幕中间。怎么解决这个问题?
 
我没有碰到这个问题,有一个例程,你要吗?
 
Chxn,好了,不过最好放在此处让大家也能看到。<br>如果不方便的话,可以email我:s314@163.net
 
最好动态改变taskbar的位置。<br>这样的话,便一切Ok啦。<br>
 
&gt;最好动态改变taskbar的位置。<br>如何作呢?<br><br>
 
这个问题刚结束怎么又出现了,斑竹应该注意,这是个极其令大家困惑的问题.<br>介绍一个'捣浆糊'的办法:多用Panel,一个Form主要是上下结构的,用两个Panel<br>一个altop,另一个albottom,创建Form时<br>&nbsp; Panel2.Height:=Screen.Height-Panel1.Height;<br>左右结构的亦然,至少充满整个屏幕.<br>
 
拷贝下面的代码<br><br>unit Unit1;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br>&nbsp; StdCtrls;<br><br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; Button1: TButton;<br>&nbsp; &nbsp; Button2: TButton;<br>&nbsp; &nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp; &nbsp; procedure Button2Click(Sender: TObject);<br>&nbsp; &nbsp; procedure FormCreate(Sender: TObject);<br>&nbsp; &nbsp; procedure FormClose(Sender: TObject; var Action: TCloseAction);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; swidth,sheight:integer;<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br><br>implementation<br><br>{$R *.DFM}<br><br><br>function DynamicResolution(X, Y: word): BOOL;var &nbsp;lpDevMode: TDeviceMode;begin<br>&nbsp; Result := EnumDisplaySettings(nil, 0, lpDevMode); &nbsp;if Result then &nbsp;begin<br>&nbsp; &nbsp; lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT;<br>&nbsp; &nbsp; lpDevMode.dmPelsWidth := X; &nbsp; &nbsp;lpDevMode.dmPelsHeight := Y;<br>&nbsp; &nbsp; Result := ChangeDisplaySettings(lpDevMode, 0) = DISP_CHANGE_SUCCESSFUL;<br>end;<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>//if DynamicResolution(640, 480) then &nbsp; &nbsp;ShowMessage('Now is 640*480');<br>DynamicResolution(640, 480)<br>end;<br><br>procedure TForm1.Button2Click(Sender: TObject);<br>begin<br>//if DynamicResolution(800, 600) then &nbsp; &nbsp;ShowMessage('Now is 800*600');<br>DynamicResolution(800, 600)<br>end;<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br>swidth:=screen.width;<br>sheight:=screen.height;<br><br>if (screen.width&lt;&gt;800) and (screen.height&lt;&gt;600) then<br>DynamicResolution(800,600);<br>end;<br><br>procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);<br>begin<br>DynamicResolution(swidth, sheight);<br>end;<br><br>end.
 
好象要向Taskbar发布一个消息,宣布其位置应该改变.<br>另外,应该有个广播消息通知所有的程序屏幕分辨率改<br>了.因为在屏幕分辨率改变时不仅仅影响Taskbar.
 
多谢各位的帮助。<br>注意:如何改变分辨率我知道怎么作,最重要的问题是改变屏幕分辨率后taskbar位置不正常。<br>我只有条件试两台机。环境都是Pwin98+IE4。taskbar设为总在最前,自动隐藏。<br>应该与delphi无关,因为我用VB同样的方法也是这样的结果。<br>壹平,thanks,你的代码我试了,同样有taskbar问题。<br>
 
我用的是WIN97+IE5没发现有这样的问题!不过你可以用DELPHIX控件来实现!<br>DELPHIX控件中有一个DXDraw.试一下吧!!
 
试试EnumDisplaySettings() 与 ChangeDisplaySettings 这两个 WinAPI. <br>function DynamicResolution(X, Y: word): BOOL;<br>var<br>&nbsp; lpDevMode: TDeviceMode;<br>begin<br>&nbsp; Result := EnumDisplaySettings(nil, 0, lpDevMode);<br>&nbsp; if Result then<br>&nbsp; &nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp;lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT;<br>&nbsp; &nbsp; &nbsp;lpDevMode.dmPelsWidth := X;<br>&nbsp; &nbsp; &nbsp;lpDevMode.dmPelsHeight := Y;<br>&nbsp; &nbsp; &nbsp;Result := ChangeDisplaySettings(lpDevMode, 0) = DISP_CHANGE_SUCCESSFUL; <br>&nbsp; &nbsp; &nbsp;end;<br>&nbsp; &nbsp; &nbsp;end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>if DynamicResolution(640, 480) then<br>&nbsp; &nbsp;ShowMessage('Now is 640*480');<br>end;<br><br>procedure TForm1.Button2Click(Sender: TObject);<br>begin<br>if DynamicResolution(800, 600) then<br>&nbsp; ShowMessage('Now is 800*600');<br>end;<br>
 
datoncg老兄,多谢了。<br>不过前面我已经说的很清楚了,我知道用changedisplaysettings可以改,并且已成功了,关键是taskbar位置不对。据说pwin97下没问题,但我在pwin98+ie4下就是有问题。
 
这个问题也在困扰在下,<br>由于分辨率等种种原因,自己的程序<br>到别人机器上老是走样.<br>上面的方法动态改变分辨率,好像效果不太理想<br>还有屏幕拖放的时候,控件没法自适应,<br>挺丑陋的,那位大虾初一下手?
 
&nbsp; 我也是遇到这个问题好久了,上面的方法<br>好象也没有彻底解决,主要是自己编写的程序<br>到别人的机子上运用时,一般都要变得面目全<br>非。要么变大,要么变小了。
 
&nbsp; 我以前用VC编写果DirectDraw的程序,可以动态改变分辨率,而且没有你说的位置<br>不对的问题.你可以试一下.
 
Form 有变形是因为某些机器设置了大字体,Delphi4 中可以将<br>Form的Scaled设为False,可以解决大字体的影响。
 
我也遇到了这种问题,不过动态改变屏幕分辩率确实不好搞,<br>希望在这里听听大家的想法
 
3.14:<br><br>&nbsp; &nbsp; 关于位置,可以事先将各个控件的位置参数记录下来,写在配置文件中,程序执行中表单显示时在定位,速度没有什么影响,而且控制灵活,做到控制与应用程序无关也有好处。或许是笨方法,但直接实用,我试过。
 
Windows提供给我们两个API函数,可以动态调整显示器的分辨率,他们是EnumDisplaySettings() 和ChangeDisplaySettings(),下面这个例子就是了<br><br>function DynamicResolution(X, Y: word): BOOL;<br>var<br>lpDevMode: TDeviceMode;<br>begin<br>Result := EnumDisplaySettings(nil, 0, lpDevMode);<br>if Result then<br>begin<br>lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT;<br>lpDevMode.dmPelsWidth := X;<br>lpDevMode.dmPelsHeight := Y;<br>Result := ChangeDisplaySettings(lpDevMode, 0) = DISP_CHANGE_SUCCESSFUL;<br>end<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>if DynamicResolution(640, 480) then<br>ShowMessage('Now is 640*480');<br>end;<br><br>procedure TForm1.Button2Click(Sender: TObject);<br>begin<br>if DynamicResolution(800, 600) then<br>ShowMessage('Now is 800*600');<br>end;
 
TASKBAR 是WINDOWS桌面的最底部的任务栏!可见的应用程序在这个任务栏上有显示!<br><br>我期待着答案,因为我也遇见过同样的问题!
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部