动态改变分辨率和颜色(200分)

G

guoyan

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在动态改变分辨率的同时改变颜色,以下函数分辨率可改变,但一
加上颜色就不行了,也就是说颜色不能动态改变,随能告诉我问题在那?

function DynamicResolution(X, Y: word): BOOL;
var lpDevMode: TDeviceMode;
begin
Result := EnumDisplaySettings(nil, 0, lpDevMode);
if Result then
begin
lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL;
lpDevMode.dmPelsWidth := X;
lpDevMode.dmPelsHeight := Y;
lpDevMode.dmBitsPerPel :=8; //8位是256色 16位是65535色
Result := ChangeDisplaySettings(lpDevMode, 0) = DISP_CHANGE_SUCCESSFUL;
end;
end;
 
是不是需要重新启动机器,ChangeDisplaySettings(lpDevMode, 0)的返回值可能
是DISP_CHANGE_RESTART,即重新启动后设置才能生效。
 
都可以动态改变
 
有些分辨率、颜色和刷新率组合显卡是不一定支持的
 
walala 如果能改变,请给我原代码
 
你的代码可以,我已试过。
从16bit到8bit图象有地方花,从8to16正常。
这与窗口用的颜色有关,如本来为16 你用8当然不行了。
在试试。
 
walala "这与窗口用的颜色有关,如本来为16 你用8当然不行了。"
这句话是什么意思,我当前系统是16位色,想改成256色用8难到
不对吗? 你是什么显示卡?我怎么实验也不行。
不过用windows的控制面板到可以切换到800x600的256色下。
 
我用该代码可以实现。而且颜色变化基本没有问题。只是在重新恢复原有屏幕的时候,因为得不到原来的色彩数,无法完全恢复到原来情况。
 
Windows提供给我们两个API函数,可以动态调整显示器的分辨率,他们是EnumDisplaySettings() 和ChangeDisplaySettings(),下面这个例子就是了

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

procedure TForm1.Button1Click(Sender: TObject);
begin
if DynamicResolution(640, 480) then
ShowMessage('Now is 640*480');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if DynamicResolution(800, 600) then
ShowMessage('Now is 800*600');
end;
 
多人接受答案了。
 
顶部