- 在线时间
- 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>
% B0 j0 t r9 C* K% X* w< >具体如下:</P>: C9 l/ L. ]" f; b; k( l6 m
< >在窗口类的CreateParam()成员函数中加入如下语句:9 w* y& s+ L( \6 |3 m: F' S
Params.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
3 s ^& j. f9 ~. O' k将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。
" E3 i3 Q7 c3 f仍在窗口类的CreateParam()成员函数,加入如下语句:% w& X6 e0 a5 e2 _1 ~
ChangeResolution(800,600);) ?4 D9 x8 `# P
Params.Width=800;8 D/ _8 z4 i9 P* ~4 Z7 \) `
Params.Height=600;
4 ]4 V8 n' h2 HParams.X=Params.Y=0;
& o. X) _- A( E2 U! E4 v- v/ U第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)
, o4 n3 L! \$ \然后修改窗体大小使之占满全屏。
4 s' b+ i2 j, J6 ^' e6 ?ChangeResolution()是一个自编的小函数,其原理如下: |9 o$ T( c! k' b5 f
用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式 0 s0 U; G. _! S- x4 h; @( u
用WINAPI:ChangeDisplaySettings()修改显示模式。
: V L# W: v7 J/ R+ [! OChangeResolution()的完整代码:</P>
2 B3 _8 H! q# P< >BOOL ChangeResolution(DWORD w, DWORD h) {
h% @. B0 v: r" z* M4 ~DEVMODE devMode;
2 l9 b3 H9 f, ?# ]* ?, b' r% KLONG modeSwitch;
. p6 m U; d+ aLONG i;
# k( F9 _ ~# @7 f7 X& PCHAR buf[256];
& L" e, t- |- t' x8 wi = 0;
d: x' `; o5 S! ^3 g% Qdo {
4 L9 p5 j( i& v8 ?/ {modeSwitch = EnumDisplaySettings(NULL, i, &devMode);
# ?0 f9 h* N& I$ R; ~+ Ai++;
: E1 d; O. C9 G& S( o} while(( (devMode.dmBitsPerPel!=16)
+ E' g" `' y/ y$ \||(devMode.dmPelsWidth != w)
! ?. r: D0 q1 J" F6 q* W% }||(devMode.dmPelsHeight != h) )4 T- k3 Z! Z( T3 ?1 @( ]. h4 Q+ K
&& (modeSwitch) );9 Y! d1 T& m' C. S5 g
/* Okay see if we found a mode */
" {5 `4 v: q. O4 zif (!modeSwitch) { }# L# n. `0 X; g6 m" c/ t2 N
else {) K/ |# t) n+ e) A6 m6 u8 ?
modeSwitch = ChangeDisplaySettings(&devMode, 0);: f' M, M3 w% D7 r
if (modeSwitch!=DISP_CHANGE_SUCCESSFUL)
- M, j7 }! @$ r# r$ h{2 t- b8 T; Q- T: }% Q3 n
//Might be running in Windows95, let's try without the hertz change
7 F, \: h/ N/ r2 z8 `+ l; ?devMode.dmBitsPerPel = 16;
4 D+ Q. {4 [% I- {! }6 edevMode.dmPelsWidth = w;
* |0 E! c5 t5 {& wdevMode.dmPelsHeight = h;
: R1 \- V4 _1 i- j/ BdevMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;% C4 E: j# m0 @: ]) z( N& [
modeSwitch = ChangeDisplaySettings(&devMode, 0);
) Q! d2 G6 t' ^7 _! ?}9 a z1 ~& ~' P. |! e% c8 U4 T
}8 B0 c" T+ m5 Q$ t7 t
return TRUE;
7 W# K H/ g8 p1 f* v5 ?/ b9 c" l} 3 J: a8 y) I4 v9 u- l
样本程序 + L8 x2 J4 W" s0 n# g
说明:通常这个程序运行时会看到屏幕底部有道白线,这是任务栏造成的,如果你将它的总在最前面(always on top)去掉或者将本程序窗口作成Always On Top型就不会再看到它了。 </P> |
zan
|