在Windows 95中,对显示模式的更改,我们知道一般是在控制面板中进行的:即“开始”菜单?设置?控制面板,双击“显示”,可以更改屏幕分辨率,显示的颜色数等。
但有时我们需要程序来控制显示模式,最常见的就是游戏程序。一般的应用程序也可能有这样的要求,例如,假设在程序中需要显示一幅图片,图片本来是16位颜色的,如果这时显示模式是设置在256色(即8位颜色)的话,则显示出来的图片就变得非常难看。再如一个窗口设计时是在800╳600的分辨率下进行的,那么当窗口在640╳480的分辨率下显示时,可能由于屏幕可显示的范围变小,而使窗口的某部分超出了屏幕的范围。这些问题都可以通过在程序中直接控制显示模式来解决。
下面以一个示例来说明如何直接控制屏幕显示模式。
假设这样一个程序,要求屏幕分辨率为800╳600,颜色为16位色。即要求本程序执行时,无论当时的屏幕是多少的分辨率及颜色数,本程序都会使屏幕模式变为800╳600,16位色。
笔者的程序是在C++ Builder 3环境下实现的,但编程原理对于使用Visusl C++、Visual Basic、Borland C++、Delphi等开发工具的读者同样适用。此程序没有具体的功能,只是显示一个窗口,同时改变屏幕模式。
对显示模式的直接修改,借助于DirectDraw技术来实现。首先运行Borland C++ Builder 3.0,新建一个工程,在Uni1.cpp的头部加入头文件包含说明,以使用DirectDraw技术:
#include <ddraw.h>
改变显示模式的代码放在Form1的OnShow事件中,代码如下:
void __fastcall TForm1::FormShow(TObject *Sender)
{
LPDIRECTDRAW lpdd; //声明一个DirectDraw对象指针
HRESULT ddrval;
ddrval = DirectDrawCreate( NULL, &lpdd, NULL ); //创建DirectDraw对象
if( ddrval != DD_OK )
{
ShowMessage("Error1!");
return;
}
HWND handledesk; //声明一个桌面窗口句柄
handledesk=GetDesktopWindow(); //获得桌面窗口句柄
ddrval=lpdd->SetCooperativeLevel(handledesk,
DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
if( ddrval != DD_OK )
{
ShowMessage("Error2!");
return;
}
lpdd->SetDisplayMode(800,600,16);
//设置屏幕模式(800╳600分辨率,16位色)
}
编译运行,则无论您当时的屏幕显示模式如何,本程序执行时,显示模式都会变为800╳600,16位色;当本程序被关闭后,屏幕又自动恢复为原来的显示模式。
netying zrh1999@163.net 网站 FileSee
1999年1月
但有时我们需要程序来控制显示模式,最常见的就是游戏程序。一般的应用程序也可能有这样的要求,例如,假设在程序中需要显示一幅图片,图片本来是16位颜色的,如果这时显示模式是设置在256色(即8位颜色)的话,则显示出来的图片就变得非常难看。再如一个窗口设计时是在800╳600的分辨率下进行的,那么当窗口在640╳480的分辨率下显示时,可能由于屏幕可显示的范围变小,而使窗口的某部分超出了屏幕的范围。这些问题都可以通过在程序中直接控制显示模式来解决。
下面以一个示例来说明如何直接控制屏幕显示模式。
假设这样一个程序,要求屏幕分辨率为800╳600,颜色为16位色。即要求本程序执行时,无论当时的屏幕是多少的分辨率及颜色数,本程序都会使屏幕模式变为800╳600,16位色。
笔者的程序是在C++ Builder 3环境下实现的,但编程原理对于使用Visusl C++、Visual Basic、Borland C++、Delphi等开发工具的读者同样适用。此程序没有具体的功能,只是显示一个窗口,同时改变屏幕模式。
对显示模式的直接修改,借助于DirectDraw技术来实现。首先运行Borland C++ Builder 3.0,新建一个工程,在Uni1.cpp的头部加入头文件包含说明,以使用DirectDraw技术:
#include <ddraw.h>
改变显示模式的代码放在Form1的OnShow事件中,代码如下:
void __fastcall TForm1::FormShow(TObject *Sender)
{
LPDIRECTDRAW lpdd; //声明一个DirectDraw对象指针
HRESULT ddrval;
ddrval = DirectDrawCreate( NULL, &lpdd, NULL ); //创建DirectDraw对象
if( ddrval != DD_OK )
{
ShowMessage("Error1!");
return;
}
HWND handledesk; //声明一个桌面窗口句柄
handledesk=GetDesktopWindow(); //获得桌面窗口句柄
ddrval=lpdd->SetCooperativeLevel(handledesk,
DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
if( ddrval != DD_OK )
{
ShowMessage("Error2!");
return;
}
lpdd->SetDisplayMode(800,600,16);
//设置屏幕模式(800╳600分辨率,16位色)
}
编译运行,则无论您当时的屏幕显示模式如何,本程序执行时,显示模式都会变为800╳600,16位色;当本程序被关闭后,屏幕又自动恢复为原来的显示模式。
netying zrh1999@163.net 网站 FileSee
1999年1月