数学建模社区-数学中国

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

作者: 韩冰    时间: 2005-1-26 12:41
标题: BCB中实现全屏幕OpenGL
<>其实在BCB中实现全屏幕OpenGL的原理是很简单的,只要在窗口OpenGL程序的基础上做一个小小的改动即可:只要将窗口属性修改为WS_POPUP就可以了。</P>
4 H* F7 W% @) D9 L& @* `<>具体如下:</P>
; f2 n! Z7 S0 ?. U1 M- N<>在窗口类的CreateParam()成员函数中加入如下语句:$ D% |: E$ @$ p3 u8 m) q
Params.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
( @  a6 |. e; w2 }将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。 ) y6 y4 H; U6 N5 n9 i( X) O  q
仍在窗口类的CreateParam()成员函数,加入如下语句:
- a2 X9 o2 _$ FChangeResolution(800,600);
( g7 U- D# r" q" W! W" aParams.Width=800;
/ u5 F# [3 ^0 k( V3 O7 s& o, U0 C4 Y2 v+ o' YParams.Height=600;: C* l' L5 X. D- k& S" v/ S
Params.X=Params.Y=0;$ r4 _* |' j% X$ Z: i8 z
第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)
; Q$ J' K* r$ J: A) Z$ s' R' K然后修改窗体大小使之占满全屏。
, G& l: X6 j4 B, J+ }ChangeResolution()是一个自编的小函数,其原理如下:
$ {% y9 v; ?; u5 r用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式 % o. N% n7 i, E% a8 T) t
用WINAPI:ChangeDisplaySettings()修改显示模式。
5 \7 v3 M8 E; A7 F2 YChangeResolution()的完整代码:</P>
+ s9 R3 s3 s' N/ H/ G" N$ M+ }<>BOOL ChangeResolution(DWORD w, DWORD h) {
/ ]# n/ Z) P' c; DDEVMODE devMode;
% }! ?% |8 K( K9 x1 ^LONG modeSwitch;
6 J+ t: O. m0 i3 Q; N6 qLONG i;
, ]1 F+ n+ B5 i% W" s0 N% LCHAR buf[256];" D! k; A' [% c6 C: M4 Z0 m
i = 0;9 c$ N* m& D2 S8 b, G% U( O9 E
do {3 o' s/ A' j) w4 ?0 K; i' E
modeSwitch = EnumDisplaySettings(NULL, i, &amp;devMode);; T1 K$ d+ G" q2 V. e& B
i++;  c" d4 ~% N! H  y/ @: C. U
} while(( (devMode.dmBitsPerPel!=16)
; E' `: a7 I1 }$ M. f||(devMode.dmPelsWidth != w)
- k4 {5 }  r1 Q5 R/ n2 b||(devMode.dmPelsHeight != h) )5 e  y+ X! n/ R. o% m
&amp;&amp; (modeSwitch) );
* w# R& M, W/ L/* Okay see if we found a mode */- }1 M1 E3 v8 w8 w
if (!modeSwitch) { }  Q4 m4 p+ n6 P; C3 L" q" P
else {
2 k$ z& A! _" }8 NmodeSwitch = ChangeDisplaySettings(&amp;devMode, 0);
: c  l3 u$ s7 K# bif (modeSwitch!=DISP_CHANGE_SUCCESSFUL)
- J0 z& r' G) [* U' [8 d/ E0 V{
+ y0 q0 X6 o$ Y* W) f1 [//Might be running in Windows95, let's try without the hertz change
) `& T+ _# s, qdevMode.dmBitsPerPel = 16;
6 n  H/ E0 [" b* L; v! bdevMode.dmPelsWidth = w;1 X/ {# Y, f: j2 g
devMode.dmPelsHeight = h;
, r- d5 `8 |. S. T4 X+ _devMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
! i8 }5 Y4 I, U& YmodeSwitch = ChangeDisplaySettings(&amp;devMode, 0);& `  t. k/ Z+ s: F& \- a
}
& R% `* l' @9 j1 s, k) l}  I, p( }( k- i5 l: N
return TRUE;# n% d, C3 `& \- v4 c
}
! x2 U2 J( o1 |3 B样本程序
% E2 K% g, d  Y" w% R0 i( t5 G说明:通常这个程序运行时会看到屏幕底部有道白线,这是任务栏造成的,如果你将它的总在最前面(always on top)去掉或者将本程序窗口作成Always On Top型就不会再看到它了。 </P>




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