- 在线时间
- 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>
( K$ U6 c5 e* S< >具体如下:</P>
/ W( q0 f7 K/ @0 B" _7 S9 `< >在窗口类的CreateParam()成员函数中加入如下语句:
8 X+ c4 h2 w% K3 F* p- L3 _Params.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
1 S' j$ q9 b# D, M. N, R# c将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。 & u0 }0 a8 d1 k' e2 i: K
仍在窗口类的CreateParam()成员函数,加入如下语句:
% j, W3 [ x3 V ]: b2 sChangeResolution(800,600);
0 n. m4 l3 T7 uParams.Width=800;# L% f+ `, \/ t( h
Params.Height=600;# e* V8 E; e5 z1 f& m' y. N
Params.X=Params.Y=0;
# t+ [$ ]5 V( @' I% c+ V9 V第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)
7 Q8 e, n6 |0 J9 J然后修改窗体大小使之占满全屏。 0 r l6 d, t! d& g# w
ChangeResolution()是一个自编的小函数,其原理如下:
9 Z' o+ F# @' D. u0 E0 w$ i用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式 ' \- f5 B, h& m9 T! G9 ?% j( V
用WINAPI:ChangeDisplaySettings()修改显示模式。
- I4 e0 X! E0 p3 ~& f/ {, lChangeResolution()的完整代码:</P>
. v. I" _' i( E& g1 z( C< >BOOL ChangeResolution(DWORD w, DWORD h) {
" t) m3 q* y" ]( [7 TDEVMODE devMode;
( y3 E9 J+ a$ g$ s9 ILONG modeSwitch;
. v) C+ V! p I# g* d0 E9 u$ kLONG i;
" I: S5 D: K+ D' {CHAR buf[256];
2 g) e/ z7 B+ {' i3 ^2 Hi = 0;* a: Q: Z$ M; h
do {
) y. ~ V0 c: r, _( SmodeSwitch = EnumDisplaySettings(NULL, i, &devMode);
" @0 O1 t9 O/ I+ L# D& ti++;# p9 y7 u) e, }9 y1 N3 k
} while(( (devMode.dmBitsPerPel!=16)9 S, X7 B- r6 [& z: R
||(devMode.dmPelsWidth != w)
1 q6 L+ Z1 p0 m6 N, y||(devMode.dmPelsHeight != h) )5 |+ p' J) @7 Q) }( f) ]
&& (modeSwitch) );- L3 _( U6 q1 m7 L: `5 x4 |* v, d
/* Okay see if we found a mode */
% Z$ C& m2 {. nif (!modeSwitch) { }
5 u! ]+ S% h( g0 Z7 U5 Ielse {
6 F+ z6 B& M6 \modeSwitch = ChangeDisplaySettings(&devMode, 0);+ i( v- m* }$ i% L3 o8 ?% b+ t/ |
if (modeSwitch!=DISP_CHANGE_SUCCESSFUL)
/ {" Z- D" x7 r a8 @" u{
2 N' o6 z8 F* g) d z. ]//Might be running in Windows95, let's try without the hertz change+ D0 S4 H$ L! F+ b) R
devMode.dmBitsPerPel = 16;
: q8 R+ Y3 a6 z# FdevMode.dmPelsWidth = w;' C* u z" m; ]+ ?
devMode.dmPelsHeight = h; D3 ^$ B/ U+ h) S) O1 i9 j
devMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;1 Z' a$ t& t8 s& G* a9 j5 C
modeSwitch = ChangeDisplaySettings(&devMode, 0);4 g* J4 {' L! K0 M W/ n% F
}
' S+ O! p; r) a4 {1 p {6 A}
, p$ P" E" [" C4 c: C2 _& I) Creturn TRUE;+ }- e5 f, w. a# q, y( x7 r
}
5 H* e9 K; F7 J4 `& w. p样本程序
2 W. G, G7 W; Z- ^, g5 d6 C说明:通常这个程序运行时会看到屏幕底部有道白线,这是任务栏造成的,如果你将它的总在最前面(always on top)去掉或者将本程序窗口作成Always On Top型就不会再看到它了。 </P> |
zan
|