QQ登录

只需要一步,快速开始

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

BCB中实现全屏幕OpenGL

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 12:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>其实在BCB中实现全屏幕OpenGL的原理是很简单的,只要在窗口OpenGL程序的基础上做一个小小的改动即可:只要将窗口属性修改为WS_POPUP就可以了。</P>
# Y, }* ]' Z8 b7 E, t$ a<>具体如下:</P>; c6 C3 g1 D2 F2 ?' ]; h
<>在窗口类的CreateParam()成员函数中加入如下语句:
+ D$ U1 Z4 O7 b4 ]5 o8 x7 HParams.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;# K8 c1 z* y2 C- \7 E
将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。
  R% S" W' H7 ?9 ^" p( G2 e仍在窗口类的CreateParam()成员函数,加入如下语句:
# u! N6 ^, n2 _7 O: nChangeResolution(800,600);' E2 i* u2 h9 O
Params.Width=800;9 P2 O: @2 l6 @$ S4 ?- [
Params.Height=600;. P3 T6 f. \; v. Q7 N4 f
Params.X=Params.Y=0;; V" C4 c4 @, b2 c0 k" H/ R3 y7 t
第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)
1 ^  w; r3 M: w! k; [然后修改窗体大小使之占满全屏。
$ u/ j6 Z! T- JChangeResolution()是一个自编的小函数,其原理如下:
. q+ \! I5 A. F$ {% o$ x  r7 r用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式 ' p: W0 G4 p: p" p5 F- B
用WINAPI:ChangeDisplaySettings()修改显示模式。 $ I: J+ a0 q0 _2 I$ I. D: U
ChangeResolution()的完整代码:</P># e! X. a6 C9 C0 @$ @( b8 F% b3 h" o
<>BOOL ChangeResolution(DWORD w, DWORD h) {
- h7 R: [4 I6 \- u2 u0 V9 ]: P: S( ]DEVMODE devMode;! u( u! b' P" |4 o, Q2 _
LONG modeSwitch;
) t& C* A+ ]& r+ W# u4 g+ gLONG i;
( h7 K- m0 B+ }: G4 ]" X' UCHAR buf[256];
, T1 L/ V# \( F: S# M* l$ yi = 0;1 Z/ @0 Z# o$ W/ a6 E. {( C
do {2 t5 j6 |" R+ S  Z8 e" P* n
modeSwitch = EnumDisplaySettings(NULL, i, &amp;devMode);' A7 o0 G0 X$ Q& S3 I! v* Q
i++;
: n7 T( ~- v- s& [5 n# z" c} while(( (devMode.dmBitsPerPel!=16)
3 l) [* [: G+ G$ i4 W||(devMode.dmPelsWidth != w): U/ z) ^7 H% x2 o4 G* E
||(devMode.dmPelsHeight != h) )8 A* Q$ Q5 P0 L( @$ Y- c- l
&amp;&amp; (modeSwitch) );
: @! `& Z3 M9 E6 D: Q/ @% n, L/* Okay see if we found a mode */
/ T( P9 f( b1 o7 V: M- m# ?$ uif (!modeSwitch) { }, z' v( l" K& B& n& ?' Q! q3 R
else {, [( G% F5 s9 u& }& a
modeSwitch = ChangeDisplaySettings(&amp;devMode, 0);
( f# B) f; T& Lif (modeSwitch!=DISP_CHANGE_SUCCESSFUL)
% K1 M0 ?5 N+ z! b9 _; Y) d3 P{* o9 G, o0 |9 u3 J0 \7 p
//Might be running in Windows95, let's try without the hertz change
9 [  ?  [$ I5 K, F1 K, YdevMode.dmBitsPerPel = 16;$ \5 o5 D2 g2 G$ S
devMode.dmPelsWidth = w;7 u! h' R; J  v1 }. W6 ~4 l7 [) p
devMode.dmPelsHeight = h;) B  v- a7 ~" }
devMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;2 \. a% ]' M2 q$ p0 F
modeSwitch = ChangeDisplaySettings(&amp;devMode, 0);
& w6 b8 H% S4 Q9 ^. F& \}* a" z" x: @1 `; B' ?( b
}
# ~0 l: [6 L2 u9 Wreturn TRUE;
; ^8 Z4 C8 {  ^/ F. R7 ^}
1 X* v+ r% H1 w样本程序
3 H5 }+ _$ k5 u& c# J说明:通常这个程序运行时会看到屏幕底部有道白线,这是任务栏造成的,如果你将它的总在最前面(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-8-8 22:45 , Processed in 1.490885 second(s), 52 queries .

回顶部