- 在线时间
- 0 小时
- 最后登录
- 2007-9-23
- 注册时间
- 2004-9-10
- 听众数
- 3
- 收听数
- 0
- 能力
- 0 分
- 体力
- 9975 点
- 威望
- 7 点
- 阅读权限
- 150
- 积分
- 4048
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1893
- 主题
- 823
- 精华
- 2
- 分享
- 0
- 好友
- 0

我的地盘我做主
该用户从未签到
 |
< >其实在BCB中实现全屏幕OpenGL的原理是很简单的,只要在窗口OpenGL程序的基础上做一个小小的改动即可:只要将窗口属性修改为WS_POPUP就可以了。</P>
( y" M' |3 r' _# ` j, L+ E< >具体如下:</P>
R; S1 b; x: p# X< >在窗口类的CreateParam()成员函数中加入如下语句:
/ j1 O. [2 w$ M. ^5 KParams.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
2 v) y8 P3 W: |4 y s: |将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。
2 a+ h7 l, O: O! O# Y$ y1 p* Y( @仍在窗口类的CreateParam()成员函数,加入如下语句:+ j+ O- w, V1 N, C. K x( v
ChangeResolution(800,600);
, }! j F6 V' j# kParams.Width=800;
& R: R+ u% D' B; r1 sParams.Height=600;
9 r( ?% `% `" |) \# [+ a1 oParams.X=Params.Y=0;6 a. _2 N9 t. O# g( h
第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)
5 C3 j9 {( R0 a' z0 x然后修改窗体大小使之占满全屏。 + C1 t8 t0 U6 d9 f$ Q
ChangeResolution()是一个自编的小函数,其原理如下:
! E' A; Y! R5 w用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式
! e: i% }7 N+ q- y/ Z* l用WINAPI:ChangeDisplaySettings()修改显示模式。 1 N: D: _( o; g. `2 ~: T% n
ChangeResolution()的完整代码:</P>9 k# |6 X/ c0 K, j! L
< >BOOL ChangeResolution(DWORD w, DWORD h) {( c G% u2 E! i
DEVMODE devMode;9 J5 @! M, l5 A. c3 Z+ Z3 w
LONG modeSwitch;$ P' }" K% u# j- J
LONG i;) A/ B) B9 a" V; S" ]- v
CHAR buf[256];& u& @2 I( l- l, P: T
i = 0;
7 z: T- N5 V0 p) odo {
3 A& _( Y) ~" j) dmodeSwitch = EnumDisplaySettings(NULL, i, &devMode);
* a' l( a/ \- }& Y) Di++;
3 A: W, i1 }2 E4 T} while(( (devMode.dmBitsPerPel!=16)5 N/ g, M8 [1 i( m# c
||(devMode.dmPelsWidth != w)8 O. s! s) f4 I
||(devMode.dmPelsHeight != h) )1 d/ S7 Q2 A J ~5 v
&& (modeSwitch) );; J7 c; ~6 P; X1 T
/* Okay see if we found a mode */6 j& D8 |' o% K8 t1 C. C
if (!modeSwitch) { }0 P$ o6 ?( o" A/ D, N3 X3 T& \
else {
[1 o0 E, @" d% v( o7 n& | t) C' kmodeSwitch = ChangeDisplaySettings(&devMode, 0);
; O7 m" i2 N% L& C' p9 s- p: w2 X! hif (modeSwitch!=DISP_CHANGE_SUCCESSFUL)0 d6 `8 l! }+ b- q
{
! N* r8 R% z( ^//Might be running in Windows95, let's try without the hertz change
' R; N2 ?7 C' n8 _ MdevMode.dmBitsPerPel = 16;
: q) A2 o" D! pdevMode.dmPelsWidth = w;
1 P7 t u- t! DdevMode.dmPelsHeight = h;' S7 _ ^5 E' ^4 g
devMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
$ w2 K4 B8 q& q! _modeSwitch = ChangeDisplaySettings(&devMode, 0);
8 k, K& t8 r' v8 m$ ~$ F- r}
; ^) L1 g) D P% A}& f- [, V4 S1 h2 T, w( Q# u
return TRUE;
* \1 t$ x; C0 ]1 N) I} 2 n5 q F+ _8 b) U
样本程序
3 b* W3 K0 W3 _- X2 ~说明:通常这个程序运行时会看到屏幕底部有道白线,这是任务栏造成的,如果你将它的总在最前面(always on top)去掉或者将本程序窗口作成Always On Top型就不会再看到它了。 </P> |
zan
|