- 在线时间
- 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>& M$ |1 f6 _4 x: l/ J5 B# L
< >具体如下:</P>
+ ^' A2 f% r2 F1 a8 l0 |4 ]< >在窗口类的CreateParam()成员函数中加入如下语句:
# K/ M2 n" @" N+ u" m6 xParams.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
h% p) @ {7 N3 p将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。
; v9 N" X+ p5 G0 @" j# a5 n8 z仍在窗口类的CreateParam()成员函数,加入如下语句:
4 i# W3 B( i9 uChangeResolution(800,600);0 X [6 b1 g& |4 v
Params.Width=800;
1 z2 a' g I, [, X3 W! EParams.Height=600;
- b. ?' ?" b$ M c R6 dParams.X=Params.Y=0;7 C$ i; C" O) [' N
第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)
; J b% f3 k7 a' R% i# _然后修改窗体大小使之占满全屏。 6 t2 ?" Z' q# X; E- o# F& u
ChangeResolution()是一个自编的小函数,其原理如下: & E7 Q0 \. ~4 r
用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式 ! @7 q/ @4 |" `" e' h- P0 T
用WINAPI:ChangeDisplaySettings()修改显示模式。 . k% X, u5 T; @, I8 G! s* k
ChangeResolution()的完整代码:</P>7 M' L. ]5 j% y; w: F. l
< >BOOL ChangeResolution(DWORD w, DWORD h) {
: G: b3 W* v5 f- o8 mDEVMODE devMode;
7 b' e; X d) x/ r0 MLONG modeSwitch;
, o$ Q2 b; p6 e. K" aLONG i;
% E* P7 P7 G; h9 }% m* kCHAR buf[256];) P/ h2 C! N( K9 O/ Y
i = 0;
+ |$ I0 C+ M7 l W4 ]' o& ndo {$ N) D6 c. R, H A1 z: D9 V
modeSwitch = EnumDisplaySettings(NULL, i, &devMode);. `6 L# \2 L" C
i++;
9 O+ v: ^7 a+ @3 t! w} while(( (devMode.dmBitsPerPel!=16)
, G9 `; }: r5 f||(devMode.dmPelsWidth != w)
* A! r) T1 H5 U& ~% e6 O! ~5 I||(devMode.dmPelsHeight != h) )) v/ v t; |% p5 R
&& (modeSwitch) );
4 i, e+ y2 R0 P+ h6 `) W/* Okay see if we found a mode */
" s" [& O7 L. e- i% E [if (!modeSwitch) { }- O4 I0 P! A- o4 X3 ?8 p. t
else {) b' H! A3 ~, `! x
modeSwitch = ChangeDisplaySettings(&devMode, 0);+ l4 d; m. g8 w4 W4 }
if (modeSwitch!=DISP_CHANGE_SUCCESSFUL)+ @6 k* a2 `( Z, G
{; ?. l+ {" j, E* ~- x
//Might be running in Windows95, let's try without the hertz change
' `) m1 H$ e# adevMode.dmBitsPerPel = 16;/ m, p" n+ f9 g% p r" G v' W
devMode.dmPelsWidth = w;: j5 ]7 y+ H# \! S" b0 O' h& r$ [" q
devMode.dmPelsHeight = h;
: ^, O" E' x5 a: R2 GdevMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;4 ]% U7 ?. P' {6 I
modeSwitch = ChangeDisplaySettings(&devMode, 0);- V H+ }5 T! N6 n
}7 h& b. p$ \1 x8 k* d5 s! Y2 t
}; s7 m8 W7 k. P3 I
return TRUE;
4 E- k$ A6 X4 J6 W6 }}
6 {% \$ a& [1 b" q* C6 v1 O! Y6 v样本程序
" N1 |% w) K( j7 c# |: b说明:通常这个程序运行时会看到屏幕底部有道白线,这是任务栏造成的,如果你将它的总在最前面(always on top)去掉或者将本程序窗口作成Always On Top型就不会再看到它了。 </P> |
zan
|