为全屏幕方式的DirectDraw对象指定窗口Handle

本文介绍了使用Delphi进行DirectX编程时如何正确设置全屏模式。特别强调了在调用SetCooperativeLevel方法时,必须使用Application.Handle而非MainForm.Handle,并确保窗口处于最大化状态,以避免后续创建表面失败。

  在DirectX编程中,IDirectDraw2对象有一个方法名为SetCooperativeLevel,功能是指定该对象的性能级别。调用该方法需要指定一个窗口Handle,在C++中可简单地指定为主程序的窗口Handle,而在Delphi中,如果设定的级别为全屏幕独占方式,则这个Handle一定要是Application.Handle而不是MainForm.Handle,这一点在我所见到的所有关于DirectDraw的封装、构件中均未得见。

  在设定为全屏幕独占方式时,还要先使Application.Handle所代表的窗口显示在最前方,否则下一步调用CreateSurface方法就会失败。这一点也是我几经尝试才总结出来的。请见示例代码:

function CreateFullScreen(out DDrawObj:IDirectDraw2): HRESULT

var

lpDD : IDirectDraw;

begin

Result := DirectDrawCreate(nil, lpDD, nil);

if Result<>DD_OK then

raise Exception.Create('Failed Create!');

Result := lpDD.QueryInterface(IID_IDirectDraw2, DDrawObj):

if Result<>DD_OK then

raise Exception.Create('Failed QueryInterface!');

ShowWindow(Application.Handle, SW_SHOWMAXIMIZED);

Result := DDrawObj.SetCooperativeLevel(

Application.Handle, {很重要,一定要是Application窗口}

DDSCL_FULLSCREEN or DDSCL_EXCLUSIVE);

if Result<>DD_OK then

raise Exception.Create('Failed SetCooperativeLevel');

Result := DDrawObj.SetDisplayMode(640,480,8,0,0);

end;

转载于:https://www.cnblogs.com/myamanda/articles/1545360.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值