QQ登录

只需要一步,快速开始

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

BCB中实现全屏幕OpenGL

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 12:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>其实在BCB中实现全屏幕OpenGL的原理是很简单的,只要在窗口OpenGL程序的基础上做一个小小的改动即可:只要将窗口属性修改为WS_POPUP就可以了。</P>; L- H( x: v; ?7 T5 A" u
<>具体如下:</P>, i. G, ?: U: u' N# L( J
<>在窗口类的CreateParam()成员函数中加入如下语句:
9 g+ l. \' @4 ~9 `- @Params.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;5 ]0 b. ~- R, h! x+ s
将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。
! d9 d. Q$ j; q& _仍在窗口类的CreateParam()成员函数,加入如下语句:$ Q! ?5 M; x! q. P! G
ChangeResolution(800,600);& T3 c9 V0 l9 x" o: R. c
Params.Width=800;
* Y5 K; R- D/ F: L* kParams.Height=600;) `2 d  R# t4 S& d
Params.X=Params.Y=0;
) {; n$ A) o3 T* e. T4 m; Q5 @第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)
. ~2 I( y8 J0 W7 m$ M  m0 u然后修改窗体大小使之占满全屏。
7 K% R7 R, r' G! N" hChangeResolution()是一个自编的小函数,其原理如下:
7 u! N4 z( d2 n, ?9 b% A/ j' I用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式 7 y& o8 c5 b  K/ J$ X( t, B8 d
用WINAPI:ChangeDisplaySettings()修改显示模式。 ) x' V  N) ]  X# d+ x: G- Y
ChangeResolution()的完整代码:</P>
$ W' ~0 v. i5 t  ?+ f* \1 y<>BOOL ChangeResolution(DWORD w, DWORD h) {
* t  S* ~6 T  s- pDEVMODE devMode;9 O' D; s/ i* R+ D
LONG modeSwitch;; w7 f2 @& B4 ]* j2 I) r
LONG i;
9 s; r9 a. w. Y7 `4 iCHAR buf[256];1 b$ S; p- ]' M! }7 _- a4 u* M9 w1 r
i = 0;
9 L6 H% t" c% M3 o+ vdo {
8 m" f  }( ?$ q0 D2 }" f4 V9 b, @modeSwitch = EnumDisplaySettings(NULL, i, &amp;devMode);' N( _0 w5 D3 C) L; u, t
i++;% F! d/ `( D, N# c1 B, X
} while(( (devMode.dmBitsPerPel!=16)
1 C) W, q% s' ]; V) y||(devMode.dmPelsWidth != w)
1 Z! E/ T9 j& {  W7 j/ J; T( j- u4 q$ c||(devMode.dmPelsHeight != h) )$ X$ V  Y4 d/ n9 Y7 S
&amp;&amp; (modeSwitch) );/ k! t1 t2 ^) q0 z; z+ [5 `8 j; D8 d
/* Okay see if we found a mode */3 P$ F: \" e: H9 o( l
if (!modeSwitch) { }) U! O) v. X( E# |4 J: v
else {
2 ?# P" o0 O& r/ X) YmodeSwitch = ChangeDisplaySettings(&amp;devMode, 0);
4 R' f+ r4 |# g9 r1 d, Fif (modeSwitch!=DISP_CHANGE_SUCCESSFUL)
* N7 W# w" _% w" W1 U{( N: r3 {7 h# G- a
//Might be running in Windows95, let's try without the hertz change
6 V5 S. v0 ?+ F6 W% y1 g3 ?devMode.dmBitsPerPel = 16;
7 q7 c& }+ M$ o- q5 VdevMode.dmPelsWidth = w;
# p, g7 s6 M% \7 OdevMode.dmPelsHeight = h;
& m$ I1 `' p. w) I2 rdevMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
' m/ z2 h4 {6 N9 GmodeSwitch = ChangeDisplaySettings(&amp;devMode, 0);
# T& B* P# e& r) W}. U9 w! o5 k6 C2 R
}  M, \3 Y- r) M1 y6 X
return TRUE;) ~. \) {% D- v1 F
} ' r( Q1 M* h( m1 F5 m5 `' }
样本程序 * b6 O: C& c9 r' S7 ]; g5 q7 h" B& 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-5-26 04:16 , Processed in 0.274652 second(s), 52 queries .

回顶部