自动调整窗体的分辨率? ( 积分: 100 )

  • 主题发起人 主题发起人 qipima1
  • 开始时间 开始时间
Q

qipima1

Unregistered / Unconfirmed
GUEST, unregistred user!
想知道下面的实现的具体的代码:运行时,Delphi获得系统的屏幕分辨率,并将结果保存在应用程序的Screen对象的PixelsPerInch属性中,然后,使用这个属性的值将窗体调整到当前分辨率。
 
急啊,有没有人能告诉我啊[:(][red][/red]
 
设置屏幕分辨率和颜色
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;

******************

设置屏幕颜色深度

procedure Toggle;

var

i : LongInt;

b : LongInt;

DevM : TDEVMODE;

h: HDC;

w: HWND;

IsToggled: Boolean;

PreviousBitsPerPixel: Integer;

begin

IsToggled := not IsToggled;

w:=GetDesktopWindow;

h:=GetDC(w);

try

if IsToggled then

begin {change to 8 bit}

PreviousBitsPerPixel := GetDeviceCaps(h, BITSPIXEL);

i := -1;

Repeat

Inc(i);

Until EnumDisplaySettings(pchar(0), i, DevM) = False;

DevM.dmFields := DM_BITSPERPEL;

DevM.dmBitsPerPel := 8;

b := ChangeDisplaySettings(DevM, 0);

if ((GetDeviceCaps(h, RASTERCAPS) and RC_PALETTE) = 0) or

(b <> DISP_CHANGE_SUCCESSFUL) then

begin

showmessage('can''t use palettes');

IsToggled := False;

end

end else {Change mform to palette values and perform desired 8 bit display}

else begin {change back value}

i := -1;

Repeat

Inc(i);

Until EnumDisplaySettings(pchar(0), i, DevM) = False;

DevM.dmFields := DM_BITSPERPEL;

DevM.dmBitsPerPel := PreviousBitsPerPixel;

b := ChangeDisplaySettings(DevM, 0);

if b <> DISP_CHANGE_SUCCESSFUL then showmessage( 'Error restoring origional display');

end;

finally

ReleaseDC(w,h);

end;

end;

不下一下超级猛料放家里,到处找什么呀
 
boy2002,我的意思是现在的电脑都是宽屏的,所以在1024*768下做的全屏,拿到1280*800下就出问题了,窗体全屏可布局没有变,要是拿到800*600下,边缘部分根本就显示不出来了啊,你的这个设置屏幕分辨率可以解决吗?
 
帮我解决一下啦,大哥啊!!!
 
帮帮忙啊
 
前辈们,来帮帮忙啊
 
我原来做过这样的东西,具体实现比较复杂,要用到窗体流属性。思路就是把设计时的分辨率保存到所有设计的窗体流属性中,在显示时取出来后按比例调整成当前分辨率,你可以自己网上搜索类似的代码。
 
其实比较简单,程序运行时将远屏幕的窗口属性值保存到配置文件中,结束后在调用不就完成了,应当是比较简单的.
 
怎么有人说简单,有人说复杂啊?
我是不会啊,谁还可以告诉我啊?
 
我觉得你的问题应该可以简单的处理一下,在formshow的方法里使用
SetBounds(screen.WorkAreaLeft, screen.WorkAreaTop, screen.WorkAreaWidth, screen.WorkAreaHeight);
或者
SetBounds(0, 0, screen.Width, screen.Height);
 
然后可以通过程序或者控件的属性来决定界面中各个元素的位置。
 
收藏此貼。
 
teclick,用元素去控制各控件的位置怎么实现啊?
我想看看代码怎么实现?
 
我说的元素其实是界面上的可视化的控件,或者你通过API直接创建的窗口,screen里面有桌面的大小,而你的应用程序的大小你也知道,可以通过换算关系来决定你的应用程序的窗口内各个可视化的控件的相对位置,你可以写个通用的方法,或者设置控件的属性,anchors属性可以不用写代码,来决定你的窗口发生变化后,它的位置如何变化。
 
你说的我还是不太懂,我做的都是全屏的,可是我还是不知道怎样用screen去控制的具体代码,第一次接触分辨率的概念...你能给我段代码吗?有关元素控制的
 
SetBounds(screen.WorkAreaLeft, screen.WorkAreaTop, screen.WorkAreaWidth, screen.WorkAreaHeight);
这样一句就可以了吗?
 
晚上还等你[:D]
 
每一个控件都有anchors 属性可以设置当窗体改变时当前控件的相对位置要发生那些改变
akleft:当窗体宽度变化时保持left值不变
aktop:当窗体高度变化时保持top值不变
akright:当窗体宽度变化时保持 from.width-控件.width=定值
akbottom:当窗体高度变化时保持 from.height-控件.height=定值
 
后退
顶部