数学建模社区-数学中国

标题: BCB中实现全屏幕OpenGL [打印本页]

作者: 韩冰    时间: 2005-1-26 12:41
标题: BCB中实现全屏幕OpenGL
<>其实在BCB中实现全屏幕OpenGL的原理是很简单的,只要在窗口OpenGL程序的基础上做一个小小的改动即可:只要将窗口属性修改为WS_POPUP就可以了。</P>
  U# `2 I; f  \/ a9 g! `* x" h<>具体如下:</P>
" n+ P1 |" i6 s6 J* o, U8 R<>在窗口类的CreateParam()成员函数中加入如下语句:
7 x9 s5 D* @% i6 \, nParams.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
+ f5 J1 R* K1 T+ h8 m6 \5 N将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。 ( e, Z! g  ^3 o! w
仍在窗口类的CreateParam()成员函数,加入如下语句:3 _' v( P, p* V+ ~( k  V/ ?) K
ChangeResolution(800,600);
7 k0 m* _1 Q3 fParams.Width=800;* e4 f3 l8 J+ ?, {( Z' X( ^
Params.Height=600;/ H$ g+ V4 |6 H' D, N- t
Params.X=Params.Y=0;! v& I/ e( g, `7 @- B8 }+ Q/ U
第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)4 n% j% {2 \6 ~; U' ]' ]
然后修改窗体大小使之占满全屏。
/ ]& }" n6 M, w/ i' B5 |  yChangeResolution()是一个自编的小函数,其原理如下:
9 p5 s; ^: ~: Q# H用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式 + Q/ J- G" `! E* G4 f1 i6 e
用WINAPI:ChangeDisplaySettings()修改显示模式。
- \" h* U6 ]6 U  h1 K* J- I3 p$ C0 UChangeResolution()的完整代码:</P>
5 P( I; e9 ?  A# U  z<>BOOL ChangeResolution(DWORD w, DWORD h) {
9 l9 Z6 ]# p4 gDEVMODE devMode;$ w4 [5 E- w# ^, X& z1 w+ d! q0 u# ?
LONG modeSwitch;
1 t$ e* `: _; S3 j' Y* P/ d5 K% aLONG i;
, }2 q9 o- l3 P/ Y5 q4 LCHAR buf[256];, U" `: r+ [$ E' v! m
i = 0;
# Q! L+ C9 \" tdo {( a) Q" K1 a6 L, _* ^# }4 f
modeSwitch = EnumDisplaySettings(NULL, i, &amp;devMode);' o3 p# _. k9 d6 q, I
i++;
$ T- X! S1 V4 i* y$ u} while(( (devMode.dmBitsPerPel!=16)
% v' D  b6 `; Z+ B||(devMode.dmPelsWidth != w)
0 M7 N9 }6 k+ L6 R||(devMode.dmPelsHeight != h) )
) {1 C, w' z2 i; m  |# b3 {9 d8 u4 {&amp;&amp; (modeSwitch) );
' t! ~, E* o! B+ Y- @7 [/* Okay see if we found a mode */; D" a  ?8 h  L8 R" ~0 |! h
if (!modeSwitch) { }
3 e" Y6 k0 B, p5 g% |  Felse {
2 y) W0 \+ D& ]0 HmodeSwitch = ChangeDisplaySettings(&amp;devMode, 0);* N( \! }( Y/ R- H& g; C
if (modeSwitch!=DISP_CHANGE_SUCCESSFUL)" ]8 _, A6 Q- @
{- m6 R' i' \1 X; M) G' G; O
//Might be running in Windows95, let's try without the hertz change
; S3 e( W7 B/ f% ~4 R) OdevMode.dmBitsPerPel = 16;
! p! N9 x. d  D1 J% V# h* QdevMode.dmPelsWidth = w;; q" Q1 `* s/ Y# ?( \: R1 C& I
devMode.dmPelsHeight = h;
. l. H; D2 ^4 QdevMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
$ w: e  w' u0 G, L9 M) v0 W- qmodeSwitch = ChangeDisplaySettings(&amp;devMode, 0);3 o! N$ J/ \0 @
}
  ^1 ?2 X! G' @: s}
6 v# S7 M8 E' f( ]2 Q" |8 c. `return TRUE;
: C+ ^' [3 g% v. ?# J9 o}
  D' P+ Y9 h% ]4 N3 t& H样本程序
8 H1 `% P2 r3 _7 `) o# r说明:通常这个程序运行时会看到屏幕底部有道白线,这是任务栏造成的,如果你将它的总在最前面(always on top)去掉或者将本程序窗口作成Always On Top型就不会再看到它了。 </P>




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5