龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

全屏幕OpenGL程序

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
其实在BCB中实现全屏幕OpenGL的原理是很简单的,只要在窗口OpenGL程序的基础上做一个小小的改动即可:只要将窗口属性修改为WS_POPUP就可以了。 具体如下: 在窗口类的CreateParam()成员函

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

  

  

具体如下:

  

  

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

  

Params.Style=WS_POPUPWS_CLIPCHILDRENWS_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_B99vSPERPEL DM_PELSWIDTH DM_PELSHEIGHT;

  

modeSwitch = ChangeDisplaySettings(&devMode, 0);

  

}

  

}

  

return TRUE;

  

}

  

样本程序

  

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

  

精彩图集

赞助商链接