数学建模社区-数学中国
标题:
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, N
ChangeResolution(800,600);
7 x- u/ x6 o5 n
Params.Width=800;
d& r2 @0 O# B( e/ x3 K4 L
Params.Height=600;
& i8 {# w/ k4 l; e& R' d) a2 Q
Params.X=Params.Y=0;
0 s% u y3 ?& Q
第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)
! G& c" l0 L5 |( G$ c
然后修改窗体大小使之占满全屏。
% ]+ q7 M+ p- c% y4 ^% o7 z
ChangeResolution()是一个自编的小函数,其原理如下:
: 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) X
i = 0;
7 d! U( [3 ?7 \$ P
do {
6 I/ h7 r0 \2 J$ q
modeSwitch = EnumDisplaySettings(NULL, i, &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( |
&& (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(&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 change
0 _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(&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' c
return 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