数学建模社区-数学中国

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

作者: 韩冰    时间: 2005-1-26 12:41
标题: BCB中实现全屏幕OpenGL
<>其实在BCB中实现全屏幕OpenGL的原理是很简单的,只要在窗口OpenGL程序的基础上做一个小小的改动即可:只要将窗口属性修改为WS_POPUP就可以了。</P>% P2 N- B/ ~4 j( I2 C+ n& Q% v7 g
<>具体如下:</P>
! E% N7 q& G( ]<>在窗口类的CreateParam()成员函数中加入如下语句:- l7 B$ p" @* i5 G( z
Params.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;9 K9 j3 U' J, @+ N: v- }  ~
将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。 ! J: j) r4 }3 ?" S. Y; C
仍在窗口类的CreateParam()成员函数,加入如下语句:
$ ]0 [6 _( v0 I, NChangeResolution(800,600);7 x- u/ x6 o5 n
Params.Width=800;
  d& r2 @0 O# B( e/ x3 K4 LParams.Height=600;
& i8 {# w/ k4 l; e& R' d) a2 QParams.X=Params.Y=0;0 s% u  y3 ?& Q
第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)! G& c" l0 L5 |( G$ c
然后修改窗体大小使之占满全屏。
% ]+ q7 M+ p- c% y4 ^% o7 zChangeResolution()是一个自编的小函数,其原理如下: : o4 {/ ~% m1 h; a/ Y+ p
用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式
3 E2 n" M0 Q. ~' Q用WINAPI:ChangeDisplaySettings()修改显示模式。
, M! P' C) D: Y# {ChangeResolution()的完整代码:</P>
% k; a* T( b, ?; s7 O% F$ v; j  @+ x- Z<>BOOL ChangeResolution(DWORD w, DWORD h) {, ?7 v5 i1 x- _4 |* H7 x* a+ T8 @
DEVMODE devMode;5 u4 Z& o6 b! K2 _& H2 E& F0 D
LONG modeSwitch;$ S8 |. ]7 I9 i. f* F% X2 B8 D* w
LONG i;& m& U' J2 s; S! Y& V" ^6 L
CHAR buf[256];
: u& K" v  O0 E* |; q% k7 g- w) Xi = 0;7 d! U( [3 ?7 \$ P
do {
6 I/ h7 r0 \2 J$ qmodeSwitch = EnumDisplaySettings(NULL, i, &amp;devMode);# m5 r! ]6 f9 @* M
i++;
1 o) e6 ~% e4 s7 J: j" q, k' _) K} while(( (devMode.dmBitsPerPel!=16)& n$ W0 Y; B( W1 X- L
||(devMode.dmPelsWidth != w)
+ A) d7 y/ S. B4 P/ A/ e||(devMode.dmPelsHeight != h) )
5 O, r' J1 x1 b" V! X( M+ L( N( |&amp;&amp; (modeSwitch) );
: d4 N& X  r3 M8 P& J/ ]/* Okay see if we found a mode */! m! Y9 @1 o. r2 E2 D
if (!modeSwitch) { }
% @$ L7 t% z! [else {+ }4 D! B$ D$ s: W6 ^3 C6 j
modeSwitch = ChangeDisplaySettings(&amp;devMode, 0);" g6 Q9 M" l& j1 j* ]
if (modeSwitch!=DISP_CHANGE_SUCCESSFUL)/ T' K: x& G5 z8 a4 h
{
2 Z( n& E* c+ Y2 P//Might be running in Windows95, let's try without the hertz change0 _9 C$ o8 W. \% a3 j& [% U# ^
devMode.dmBitsPerPel = 16;
* p: \( {3 g, @devMode.dmPelsWidth = w;1 ]9 H$ x$ X! |7 p( f+ N: l
devMode.dmPelsHeight = h;  }* L9 y5 V& a+ K
devMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
+ S* n# f- q* @, |7 [7 @modeSwitch = ChangeDisplaySettings(&amp;devMode, 0);  X% D' v8 z& C
}
+ V* a, a8 v+ B1 h. c5 x9 c}
, Q4 V$ I2 c& o0 M# d0 t8 C' creturn TRUE;
! R2 Z9 q' A1 B1 ^% T8 e' l} 3 S9 Q: U1 C4 {
样本程序
% G' C+ P9 c: r: h$ n3 U, F说明:通常这个程序运行时会看到屏幕底部有道白线,这是任务栏造成的,如果你将它的总在最前面(always on top)去掉或者将本程序窗口作成Always On Top型就不会再看到它了。 </P>




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