QQ登录

只需要一步,快速开始

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

BCB中实现全屏幕OpenGL

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 12:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>其实在BCB中实现全屏幕OpenGL的原理是很简单的,只要在窗口OpenGL程序的基础上做一个小小的改动即可:只要将窗口属性修改为WS_POPUP就可以了。</P>- K  ~2 w6 S& Z: |6 C; h
<>具体如下:</P>. p. L# t) D7 R! w& R) {
<>在窗口类的CreateParam()成员函数中加入如下语句:. t+ ~5 M& \, [+ |% `: K
Params.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
. v$ I6 G! Z4 t  I: c将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。
. F# }; c4 f# }! T, q仍在窗口类的CreateParam()成员函数,加入如下语句:: }! m$ O! b5 l3 X2 \& {) p  a
ChangeResolution(800,600);
: V) I" Z& [( ~7 J1 ~" i, z- J& J# nParams.Width=800;. J& o  G# b, f" O
Params.Height=600;5 }' p5 E* G) s( i* n
Params.X=Params.Y=0;
- X3 x! z7 b) s+ t+ l5 K第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)6 c: k! D( T; v+ w5 |
然后修改窗体大小使之占满全屏。
- C3 ?. a( P* U! ~/ L. rChangeResolution()是一个自编的小函数,其原理如下: $ ~) }: }( ]0 Y  w( N. H8 R
用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式 8 {. t8 R! w2 U9 s3 G4 S
用WINAPI:ChangeDisplaySettings()修改显示模式。 . e. ~$ m% F3 _
ChangeResolution()的完整代码:</P>
" c" B$ X! I- m+ e6 }* M<>BOOL ChangeResolution(DWORD w, DWORD h) {
3 Z! P  G+ m' O( }' E0 gDEVMODE devMode;9 e& L. c$ {. z" \: R0 N
LONG modeSwitch;
) W5 X8 ]/ L3 N9 U" J4 rLONG i;
0 f' Z8 V2 f5 ~  ^; zCHAR buf[256];0 y4 i+ e  L' J( N4 f
i = 0;
$ o5 h- r: p/ f7 \do {# H" E. h2 u5 N7 [7 h6 N. `/ C7 M
modeSwitch = EnumDisplaySettings(NULL, i, &amp;devMode);9 h" U3 v# F+ n0 f  [4 x
i++;
7 C! G$ @8 \3 _( i; r} while(( (devMode.dmBitsPerPel!=16)9 N; n( v3 ]9 \! w% n
||(devMode.dmPelsWidth != w)" u2 T. I' U1 T
||(devMode.dmPelsHeight != h) )
7 _) i0 o4 V) S  {7 ^. g&amp;&amp; (modeSwitch) );/ C5 ~4 m& X9 l" O
/* Okay see if we found a mode */: {% C' f2 N% Z# d( c; y8 ~+ m1 {
if (!modeSwitch) { }' J7 U0 X  \$ n' _: r/ l
else {
3 |% I9 O8 o5 S0 T8 R+ UmodeSwitch = ChangeDisplaySettings(&amp;devMode, 0);
8 j6 T5 j% c; ~$ e: B$ z6 Lif (modeSwitch!=DISP_CHANGE_SUCCESSFUL)& v- _4 Y0 c# d3 x" W# p
{" c# ~- M7 X0 e' P
//Might be running in Windows95, let's try without the hertz change
# ^. z  _- t2 W' k. K8 C( y" c; PdevMode.dmBitsPerPel = 16;
& x+ i8 x, q/ @; I2 B% t, hdevMode.dmPelsWidth = w;) w0 s1 g( R, |
devMode.dmPelsHeight = h;
$ t* V! X# y* R* e# NdevMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
* ?- ~; j; T: E9 g  \modeSwitch = ChangeDisplaySettings(&amp;devMode, 0);
" R0 _" r- V* I. ]}8 f8 J7 [# x2 c* G, v9 l; d
}# x+ _, C: z; F, @
return TRUE;: u, J! f) v0 C$ ?) v5 ~- K
}
: q/ C. G) X+ h3 c3 A$ b% s  f样本程序
: M( \" z9 h0 @: T: X: y$ U- T说明:通常这个程序运行时会看到屏幕底部有道白线,这是任务栏造成的,如果你将它的总在最前面(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, 2025-6-28 11:57 , Processed in 0.723267 second(s), 52 queries .

回顶部