- 在线时间
- 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>
+ s) \$ |% L2 a; ?< >具体如下:</P>( O, V9 [4 q/ m2 ]' d" D) w, ~4 Y
< >在窗口类的CreateParam()成员函数中加入如下语句:$ S; l- v% b7 n; m
Params.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;! h' i0 t) g! x" I! L: M0 t
将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。 ( {" ]5 }9 `. _# p8 z
仍在窗口类的CreateParam()成员函数,加入如下语句:3 O, x+ N1 Z0 a, b+ J% S/ u* E, t
ChangeResolution(800,600);
, a% D5 f/ \6 S" YParams.Width=800;% N* p! d6 r6 h' y
Params.Height=600;# c |3 p9 e& C+ _
Params.X=Params.Y=0;2 R2 x) N% V: l& R, W0 h
第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)8 y6 n% o8 ?# H0 e
然后修改窗体大小使之占满全屏。 ' C' E; ^3 p+ }8 {$ Q$ T s
ChangeResolution()是一个自编的小函数,其原理如下:
) r3 C4 J6 W: E ?, s用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式
$ I. K" s4 v; m) T+ f用WINAPI:ChangeDisplaySettings()修改显示模式。
0 p+ f2 |# }( CChangeResolution()的完整代码:</P>8 ?2 p! d+ Y7 k1 m
< >BOOL ChangeResolution(DWORD w, DWORD h) {
1 G7 ?8 t' W2 K/ c- DDEVMODE devMode;( W- n) y/ s! Z
LONG modeSwitch;' X0 \" ?$ I, @5 J% A. f; Q
LONG i;
* V+ k- C2 g$ NCHAR buf[256];! W: v8 a$ P8 I0 }
i = 0;
; }) [. U2 M6 O0 r/ pdo {
- j$ M0 N$ {1 [modeSwitch = EnumDisplaySettings(NULL, i, &devMode);( j# _/ m+ \- c8 Q1 v! \
i++;
s+ A4 y2 c4 B& S. a} while(( (devMode.dmBitsPerPel!=16)
' M0 V$ S7 X9 K- v' U# g& R||(devMode.dmPelsWidth != w)! @# f% ?! m2 N
||(devMode.dmPelsHeight != h) )/ v$ k! E( i! V2 T
&& (modeSwitch) );# K3 w' h0 A1 V, N
/* Okay see if we found a mode */
" w/ V2 i/ o$ V5 g: yif (!modeSwitch) { }2 t$ S! W+ s! t% B
else {
0 V6 O. g6 f9 d0 K. ~modeSwitch = ChangeDisplaySettings(&devMode, 0);
5 ~5 P% F+ [8 j0 uif (modeSwitch!=DISP_CHANGE_SUCCESSFUL)
4 b; Q* S1 ^7 r5 {, N& { {% R; y{
! K; n9 S) z6 I9 A7 f( Y7 |//Might be running in Windows95, let's try without the hertz change) H: ]6 _' h0 J+ j. a$ d
devMode.dmBitsPerPel = 16;9 [4 L( u; @ o' y2 u
devMode.dmPelsWidth = w;
: j& }1 p& f4 {8 E; ~& a" O$ mdevMode.dmPelsHeight = h;2 V; e, \4 ]) C0 q g7 `
devMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
: w1 h- ^$ b FmodeSwitch = ChangeDisplaySettings(&devMode, 0);
' l) A3 R7 r: S$ ^6 o3 T$ i}- ~: l! x; P+ C
}
5 ?1 F, U/ V" S5 h* Hreturn TRUE;$ o) p j$ n) t3 l9 t6 b8 [5 R) k0 C
} - q7 b3 K$ k4 x p) B
样本程序
' m( Y" c# N$ m7 ~( d" e3 V% K7 a说明:通常这个程序运行时会看到屏幕底部有道白线,这是任务栏造成的,如果你将它的总在最前面(always on top)去掉或者将本程序窗口作成Always On Top型就不会再看到它了。 </P> |
zan
|