- 在线时间
- 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># K1 G& B+ \9 `+ f2 b, {
< >具体如下:</P>
* n& E* v/ A4 k; w' ?0 ?; [. _< >在窗口类的CreateParam()成员函数中加入如下语句:
- q! w% b6 ~) O H* n! k% rParams.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
/ a6 U" ~/ Z4 V/ a0 @3 d# M将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。 ' R. S. Y* F, u* W7 W" a- z2 R/ T
仍在窗口类的CreateParam()成员函数,加入如下语句: d2 D5 |! X* W" v/ b( G
ChangeResolution(800,600);
5 d0 C7 H' k& e' {5 NParams.Width=800;2 ?/ t. z0 ?+ j- u6 k* L$ T
Params.Height=600;
: i/ X0 Y- O+ F; c" VParams.X=Params.Y=0;
' g) V' M. R; m4 U0 p第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)" E& s5 C' n* h) O8 J# \) w
然后修改窗体大小使之占满全屏。
. }' D6 `/ w0 m: K- B- gChangeResolution()是一个自编的小函数,其原理如下:
/ o8 Y, u' O: [7 i用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式 ' c0 F( W4 j% P# q4 t7 r+ N! [- I0 |
用WINAPI:ChangeDisplaySettings()修改显示模式。 ! y* m' B \$ I1 H
ChangeResolution()的完整代码:</P>
$ m2 G% b0 Z/ [4 B< >BOOL ChangeResolution(DWORD w, DWORD h) {
! u! L" v& f, [/ G6 s& \( LDEVMODE devMode;
# s8 b6 C2 `5 Z! ~# s! p9 a4 |# L; ALONG modeSwitch;
# }5 R+ o" V( M* hLONG i;; |& G0 q4 \) P. @# ]% W% H8 ?8 }
CHAR buf[256];4 `4 N/ [; X; G( l+ S5 J
i = 0;
& y( Y8 r* b; q k* K- o& hdo {5 [& F8 V3 n6 i3 b
modeSwitch = EnumDisplaySettings(NULL, i, &devMode);/ g$ D) T9 _- P; ?; n
i++;
( |, Y4 J A% {& I} while(( (devMode.dmBitsPerPel!=16)! b7 T( U- K) ^1 B8 q- ^1 s" e* X
||(devMode.dmPelsWidth != w)
+ `# @- e, s0 {0 Y0 t||(devMode.dmPelsHeight != h) ): ?, u0 B) a" m$ s, g: v
&& (modeSwitch) );' N9 E* C- _7 k
/* Okay see if we found a mode */2 l9 k7 j. J" Z B3 s( ~( d* C) @
if (!modeSwitch) { }. Q0 @+ a' V3 F- k( N ]. I
else {
& n# l5 z7 I+ j9 Y2 j. JmodeSwitch = ChangeDisplaySettings(&devMode, 0);
% J# Z8 ~5 N f7 ~) l/ G0 _( Jif (modeSwitch!=DISP_CHANGE_SUCCESSFUL)
0 R2 T, O+ t& `{( z! K _7 R3 b$ f- T" j
//Might be running in Windows95, let's try without the hertz change
' A0 g2 k2 E; R: W' _devMode.dmBitsPerPel = 16;& _3 Q# @, {4 h* B9 O" {
devMode.dmPelsWidth = w;
+ n+ y- j. R' ?9 N" m; ^devMode.dmPelsHeight = h;
6 N u$ `- g6 p4 `devMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;% ~* p" I# | ] p
modeSwitch = ChangeDisplaySettings(&devMode, 0);; u3 G6 m: k$ [6 E4 O$ a( x3 }" p# [
}, l9 R" Y, Q7 ^1 F6 t% Y3 }
}% U* D7 l L. y$ L1 P9 \
return TRUE;
4 m8 g) W, B0 s# K0 p& o/ G. p}
3 a- |* G8 i6 v. X M( R& A2 r* r" _7 z样本程序 ) |: S8 f# @4 d3 B+ I
说明:通常这个程序运行时会看到屏幕底部有道白线,这是任务栏造成的,如果你将它的总在最前面(always on top)去掉或者将本程序窗口作成Always On Top型就不会再看到它了。 </P> |
zan
|