敬业的IT人 >> 编程开发 >> C++Builder >> BCB中实现全屏幕OpenGL

BCB中实现全屏幕OpenGL

敬业的IT人 互联网 佚名 2008-1-3 22:23:51
    ·以假乱真 Linux中实现Vista界面
    ·利用VB6.0实现五线谱作曲工具
    ·Max粒子系统轻松实现群蝶飞舞
    ·轻松实现电脑一分为二:Betwin
    ·让Excel 2007实现双面打印的两种另类
    ·用VC实现小型矢量图形系统的开发(上)
    ·ASP.NET系统用户权限设计与实现
    ·盗QQ的密码软件模拟实现(VC)
    ·洪水攻击原理及代码实现全攻略
    ·Java运行时多态性的实现

  其实在BCB中实现全屏幕OpenGL的原理是很简单的,只要在窗口OpenGL程序的基础上做一个小小的改动即可:只要将窗口属性修改为WS_POPUP就可以了。

  具体如下:

  在窗口类的CreateParam()成员函数中加入如下语句:

  Params.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;

  将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。

  仍在窗口类的CreateParam()成员函数,加入如下语句:

ChangeResolution(800,600);
Params.Width=800;
Params.Height=600;
Params.X=Params.Y=0;

  第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)

  然后修改窗体大小使之占满全屏。

  ChangeResolution()是一个自编的小函数,其原理如下:

用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式
用WINAPI:ChangeDisplaySettings()修改显示模式。
ChangeResolution()的完整代码:

BOOL ChangeResolution(DWORD w, DWORD h) {
DEVMODE devMode;
LONG modeSwitch;
LONG i;
CHAR buf[256];
i = 0;
do {
modeSwitch = EnumDisplaySettings(NULL, i, &devMode);
i++;
} while(( (devMode.dmBitsPerPel!=16)
||(devMode.dmPelsWidth != w)
||(devMode.dmPelsHeight != h) )
&& (modeSwitch) );
/* Okay see if we found a mode */
if (!modeSwitch) { }
else {
modeSwitch = ChangeDisplaySettings(&devMode, 0);
if (modeSwitch!=DISP_CHANGE_SUCCESSFUL)
{
//Might be running in Windows95, let's try without the hertz change
devMode.dmBitsPerPel = 16;
devMode.dmPelsWidth = w;
devMode.dmPelsHeight = h;
devMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
modeSwitch = ChangeDisplaySettings(&devMode, 0);
}
}
return TRUE;
}

  样本程序

  说明:通常这个程序运行时会看到屏幕底部有道白线,这是任务栏造成的,如果你将它的总在最前面(always on top)去掉或者将本程序窗口作成Always On Top型就不会再看到它了。

进入讨论组讨论。
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com