QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4608|回复: 0
打印 上一主题 下一主题

BCB中实现全屏幕OpenGL

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 12:41 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<>其实在BCB中实现全屏幕OpenGL的原理是很简单的,只要在窗口OpenGL程序的基础上做一个小小的改动即可:只要将窗口属性修改为WS_POPUP就可以了。</P>
, N5 K2 Z" o$ C( D5 u1 q<>具体如下:</P>6 @% }3 q  b. [% }
<>在窗口类的CreateParam()成员函数中加入如下语句:
% @6 x9 Y. k6 a5 t0 P7 EParams.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
0 w, K% b0 y/ Q; T7 a$ K- G& h; q将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。   `# N8 L9 I5 Q9 s  Q
仍在窗口类的CreateParam()成员函数,加入如下语句:
, q" k5 t' W/ J) M$ FChangeResolution(800,600);
* x9 R2 R+ `7 Z0 g; LParams.Width=800;) s6 b0 X. v2 U5 o* g- T
Params.Height=600;
9 r# s7 ^* v( f# s, iParams.X=Params.Y=0;
/ C% T! G( b9 R" Y第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)
) v' [7 c' v* t( p* }! \2 c$ ^" K然后修改窗体大小使之占满全屏。 # ?5 x; z( x7 s; {) F
ChangeResolution()是一个自编的小函数,其原理如下: ; q: _8 T. ~" T7 d% S- k
用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式
6 ]; Q/ x! Y' z" ?* m! r9 }用WINAPI:ChangeDisplaySettings()修改显示模式。 , H6 s; ?# V! s3 q" N, a
ChangeResolution()的完整代码:</P>
: F+ a! k& j- w/ S<>BOOL ChangeResolution(DWORD w, DWORD h) {
( s8 p' s2 l( _$ ~* sDEVMODE devMode;
/ ?$ D3 H: H; w( y& jLONG modeSwitch;/ Y# H/ b7 o/ P( y$ I3 _
LONG i;
# B3 K/ F& @% O6 `1 g. DCHAR buf[256];
# u% e  {' `% J8 hi = 0;5 B7 y. A0 U- [/ Y3 h: i; K
do {' v% @9 L+ h. f) J1 k  P2 C; c
modeSwitch = EnumDisplaySettings(NULL, i, &amp;devMode);, ]. V0 [1 |& _' V
i++;1 t: z2 o7 ?5 J8 _
} while(( (devMode.dmBitsPerPel!=16)
5 J- J' c: d4 X2 \||(devMode.dmPelsWidth != w)
8 T* x$ D2 k$ y7 S. I1 {||(devMode.dmPelsHeight != h) )/ x1 B( E' E0 k$ R
&amp;&amp; (modeSwitch) );, h2 Z+ u; ~3 y' k; X: O6 ~# Y
/* Okay see if we found a mode */
; {6 t0 N. z1 _" s6 P5 H, wif (!modeSwitch) { }
9 V) O, n) ?  D+ Relse {' x$ Q' B' q4 O' w9 L
modeSwitch = ChangeDisplaySettings(&amp;devMode, 0);7 G5 u- k8 d" Y) {3 I2 Y# s
if (modeSwitch!=DISP_CHANGE_SUCCESSFUL)/ Y& C& V) N/ N
{
4 k6 ^- {3 z9 c0 C4 e/ w1 _//Might be running in Windows95, let's try without the hertz change
. y: T! M6 n0 f7 sdevMode.dmBitsPerPel = 16;
; w# ]6 t8 i1 ]2 @) z, SdevMode.dmPelsWidth = w;
3 Y6 n& E: M. i, bdevMode.dmPelsHeight = h;3 }' R* q# {3 {
devMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
) L) F/ F: o& q' vmodeSwitch = ChangeDisplaySettings(&amp;devMode, 0);) O) ~+ i8 T7 Z4 m
}
+ l; V  Y# x4 ~}# E! n2 D) T; f* Z1 p& D( k
return TRUE;8 j6 D" @0 w% ^7 h
}
: ^3 u: K: Z4 b- P5 g0 g样本程序 & ^& h, y2 Y" t( _) D
说明:通常这个程序运行时会看到屏幕底部有道白线,这是任务栏造成的,如果你将它的总在最前面(always on top)去掉或者将本程序窗口作成Always On Top型就不会再看到它了。 </P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-12 05:34 , Processed in 0.374426 second(s), 52 queries .

回顶部