- 在线时间
- 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>
& }& H# r; d' A7 \7 h8 O1 b< >具体如下:</P>
6 o, T q6 [5 _5 ]6 {" T< >在窗口类的CreateParam()成员函数中加入如下语句:
/ M- i& Y: B- `) A0 `+ xParams.Style=WS_POPUP|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
P& O3 Z' E; K将相应窗口修改成WS_POPUP型窗口,另两个是为支持OpenGL为设的。 ' l, L2 E# j- x' ^. g: P
仍在窗口类的CreateParam()成员函数,加入如下语句:
u* ?* O; |# v# K$ zChangeResolution(800,600);4 b H6 E* k$ K8 T0 A
Params.Width=800;* H% x$ o/ j9 Z
Params.Height=600;
# `: @7 \, G6 A4 I+ t7 P) wParams.X=Params.Y=0;# [; Y9 C( c7 Y3 ^
第一句将屏幕分辨率设定为800X600(可以是显示卡支持的任意值)
1 I7 m" j* D6 B T: p然后修改窗体大小使之占满全屏。
% ^: W/ c' O2 G4 l! C3 YChangeResolution()是一个自编的小函数,其原理如下:
& u! x+ c4 H- \) u5 m, S% G/ F用WINAPI:EnumDisplaySettings()查询并取得所需的显示模式 ( s* H' i! }4 k/ [2 c; t8 l
用WINAPI:ChangeDisplaySettings()修改显示模式。 " u; u& R8 l0 K7 h5 y- E/ G
ChangeResolution()的完整代码:</P>
5 D3 a8 S! u6 H3 g' `' t0 |< >BOOL ChangeResolution(DWORD w, DWORD h) {
% N7 `8 U2 p! N& ], lDEVMODE devMode;
% H" Z4 t3 A: @) kLONG modeSwitch;
* D2 ?! z, i0 \) cLONG i;9 R, J3 z: E1 ]. p
CHAR buf[256];
0 Z+ `" a# x6 \9 ji = 0;' C4 m! v: ^- p
do {
7 j0 C0 U8 S4 RmodeSwitch = EnumDisplaySettings(NULL, i, &devMode);+ g- Z% T8 q/ G4 _& T1 A/ C
i++;
& T# p" v9 ?- M- g# B- u! o" J} while(( (devMode.dmBitsPerPel!=16)
! j2 f' L; J3 \; Z||(devMode.dmPelsWidth != w)
. M' h( D+ u8 V9 q||(devMode.dmPelsHeight != h) ) ]; R0 o% t' Q0 G0 U
&& (modeSwitch) );7 e( g0 T: U3 F
/* Okay see if we found a mode */
+ K- }" C0 g: p' _if (!modeSwitch) { }8 o+ z& E+ k3 r* I! c! t9 |
else {
% E p0 Q# P7 A9 b& T( I. |modeSwitch = ChangeDisplaySettings(&devMode, 0);5 P4 J) e# @& ?
if (modeSwitch!=DISP_CHANGE_SUCCESSFUL)
8 q2 G6 ]! X% t B{" z) V" o0 Z; U8 E
//Might be running in Windows95, let's try without the hertz change
8 e0 ~ @+ m- E) N" _/ tdevMode.dmBitsPerPel = 16;
, v4 w" D, e1 B% e4 Z) c! |0 p5 @devMode.dmPelsWidth = w;7 V* S- w" U8 z
devMode.dmPelsHeight = h;
- a5 z" N q/ h* M+ WdevMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
( f6 c" l9 P' [' @! \modeSwitch = ChangeDisplaySettings(&devMode, 0);
7 j3 K0 @( }: Z4 s2 n0 v}
, c- L& C; [4 A9 I* ?+ ~+ p}; G& y7 V% n" B5 V- W2 |% E6 M! N
return TRUE;
/ g: b5 y0 J; x2 H}
& C6 D9 A0 l3 f4 f样本程序 8 ?) n. C* }2 K' P0 s: E& {
说明:通常这个程序运行时会看到屏幕底部有道白线,这是任务栏造成的,如果你将它的总在最前面(always on top)去掉或者将本程序窗口作成Always On Top型就不会再看到它了。 </P> |
zan
|