- 在线时间
- 0 小时
- 最后登录
- 2007-9-23
- 注册时间
- 2004-9-10
- 听众数
- 3
- 收听数
- 0
- 能力
- 0 分
- 体力
- 9975 点
- 威望
- 7 点
- 阅读权限
- 150
- 积分
- 4048
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1893
- 主题
- 823
- 精华
- 2
- 分享
- 0
- 好友
- 0

我的地盘我做主
该用户从未签到
 |
< >其实在BCB中实现全屏幕OpenGL的原理是很简单的,只要在窗口OpenGL程序的基础上做一个小小的改动即可:只要将窗口属性修改为WS_POPUP就可以了。</P>% S2 Q% n N! G8 T( n
< >具体如下:</P>
0 z! l7 X; G+ J. W; I< >在窗口类的CreateParam()成员函数中加入如下语句:
0 m n4 `! {0 H+ [4 C' [" v6 OParams.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;5 w, }5 _& y( l0 _& c6 k
将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。
3 N q: j9 L6 b4 f# n仍在窗口类的CreateParam()成员函数,加入如下语句:' l# o. Y' C+ W+ N% E% }5 ]: S
ChangeResolution(800,600);! V7 }1 K3 K& S8 g; z, f
Params.Width=800;
3 r& p( A- m8 N: P& R9 G" uParams.Height=600;4 \' B6 {; }$ U5 p
Params.X=Params.Y=0;, f; r6 l& Z# Q9 B+ V; m8 l
第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)6 z! U0 N1 ~! b( A
然后修改窗体大小使之占满全屏。 0 V% ^( c# i/ ?5 O- F* i7 p/ |
ChangeResolution()是一个自编的小函数,其原理如下: - r+ f5 B9 K$ ^1 ? [! J0 K
用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式 7 T1 U6 ^4 W- f- J+ `4 L
用WINAPI:ChangeDisplaySettings()修改显示模式。 b: f6 c5 u- f! f$ m" g# O+ w4 \3 p
ChangeResolution()的完整代码:</P>0 k' \( y% q! e5 H- \: z/ D; H
< >BOOL ChangeResolution(DWORD w, DWORD h) {, S; B1 x$ j8 o# s1 z& s! V
DEVMODE devMode;
3 U7 m7 g: {" J P! X6 Y7 ]LONG modeSwitch;
$ F* T7 U S$ {% f$ d! CLONG i;
9 N* Z J) ? Z/ ^CHAR buf[256];
9 I3 M$ E* Y5 i0 [8 x j$ g. M# ?i = 0;
; z2 Y V4 ~7 [9 z6 v0 S+ d8 N( xdo {
3 m3 b: y% K" T, FmodeSwitch = EnumDisplaySettings(NULL, i, &devMode);8 @: Z* b# v: K. F- \$ G7 B
i++;! [! `/ ?% F6 H7 r5 V' ?
} while(( (devMode.dmBitsPerPel!=16)
^) m1 B: ?2 _6 ~) |4 x||(devMode.dmPelsWidth != w)
~3 o6 A/ @7 \4 P||(devMode.dmPelsHeight != h) )( d2 F/ e% S' d1 A
&& (modeSwitch) );/ A& t) J5 K+ g$ y% i# R: N
/* Okay see if we found a mode */
+ S0 h( o) L* t; j1 a; X$ F- lif (!modeSwitch) { }$ j3 \! G) S- U) i+ I+ _8 _
else {% D1 j; K* }$ x4 \. k7 B2 |
modeSwitch = ChangeDisplaySettings(&devMode, 0);$ h$ w1 q2 l8 i" s/ e6 m' V$ ~
if (modeSwitch!=DISP_CHANGE_SUCCESSFUL)
; p& ?/ S5 L( s' U0 l9 N# I0 I{6 c; T1 Q( B" f
//Might be running in Windows95, let's try without the hertz change- r" A: y& y% o* p. B% _& R. h
devMode.dmBitsPerPel = 16;* u2 E3 d o, q' d8 X4 B" A/ b- C
devMode.dmPelsWidth = w;2 J d" r% \; g3 G9 f
devMode.dmPelsHeight = h;
, b2 b+ P$ \6 Q! ~devMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;6 u4 f2 }# X `4 {- X# e# c
modeSwitch = ChangeDisplaySettings(&devMode, 0);
$ v/ M, q( ]4 p9 a: v5 p* | U}5 S+ U+ t2 @# w, H' B
}; O" O% l; Q4 w1 L; b$ @* K
return TRUE;1 M, M& f" v C: u1 Z' P9 j1 K p
} 5 l5 @+ M0 p! Y( T! \' }
样本程序 ; l, u; C: r0 j2 @
说明:通常这个程序运行时会看到屏幕底部有道白线,这是任务栏造成的,如果你将它的总在最前面(always on top)去掉或者将本程序窗口作成Always On Top型就不会再看到它了。 </P> |
zan
|