游戏开发论坛

 找回密码
 立即注册
搜索
查看: 9336|回复: 10

关于GetSafeHwnd()这个函数的疑问.

[复制链接]

45

主题

181

帖子

181

积分

注册会员

Rank: 2

积分
181
发表于 2004-1-26 16:24:00 | 显示全部楼层 |阅读模式
李建汉的<DirectX实用技巧>一书中有如下代码:
HRESULT Result;
Result = pDD2->SetCooperativeLevel(GetSafeHwnd(),
DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_ALLOWMODEX);
if (Result != DD_OK)
{
MessageBox(NULL,"SetcooprativeLevel() failed.","我日哦,又出错了!",0);
                return -1;
}
编译时说GetSafeHwnd()这个函数没声明.请问这个GetSafeHwnd()函数是哪个.h文件里的?有什么作用?请高手指点一下.

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-1-26 16:57:00 | 显示全部楼层

Re: 关于GetSafeHwnd()这个函数的疑问.

游戏愚: 关于GetSafeHwnd()这个函数的疑问.

李建汉的<DirectX实用技巧>一书中有如下代码:
HRESULT Result;
Result = pDD2->SetCooperativeL...


GetSafeHwnd()是MFC中那个窗口类(忘了类名了,好像是CWin吧)的一个成员来的

51

主题

150

帖子

250

积分

中级会员

Rank: 3Rank: 3

积分
250
发表于 2004-1-26 17:39:00 | 显示全部楼层

Re:关于GetSafeHwnd()这个函数的疑问.

传递一个当前窗口的窗口句柄.

45

主题

181

帖子

181

积分

注册会员

Rank: 2

积分
181
 楼主| 发表于 2004-1-26 18:18:00 | 显示全部楼层

Re:关于GetSafeHwnd()这个函数的疑问.

请问应该在程序中包涵哪个头文件?

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-1-26 18:23:00 | 显示全部楼层

Re: Re:关于GetSafeHwnd()这个函数的疑问.

游戏愚: Re:关于GetSafeHwnd()这个函数的疑问.

请问应该在程序中包涵哪个头文件?



这个要看你的程序是基于什么的,如果是SDK的话,就用CreateWindow或是CreateWindowEx返回的HWND句柄。如果你要用GetSafeHwnd()的话,就必须把程序用MFC FrameWork 来做了.设置协作级的话,只需要你的主线程的主窗口的句柄。

45

主题

181

帖子

181

积分

注册会员

Rank: 2

积分
181
 楼主| 发表于 2004-1-26 18:40:00 | 显示全部楼层

Re:关于GetSafeHwnd()这个函数的疑问.

我是用MFC架构的.
我的主窗口句柄是这样定义的:
HWND main_window_handle;
而主窗口是这样建立的:
m_pMainWnd = new CMainFrame;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
所以导致这个参数:main_window_handle出错.(我是这么想的)
Result = pDD2->SetCooperativeLevel(main_window_handle,
                DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_ALLOWMODEX);
if (Result != DD_OK)
{
        MessageBox(NULL,"SetcooprativeLevel()failed.","我日哦,又出错了!",MB_OK);
        return -1;
}
执行的时候说SetcooprativeLevel()failed.
请问SetcooprativeLevel的第一的参数应该如何设置?

45

主题

181

帖子

181

积分

注册会员

Rank: 2

积分
181
 楼主| 发表于 2004-1-26 18:44:00 | 显示全部楼层

Re:关于GetSafeHwnd()这个函数的疑问.

直接用m_pMainWnd不行,出这样的错误:
'SetCooperativeLevel' : cannot convert parameter 1 from 'class CMainFrame *' to 'struct HWND__ *'

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-1-26 19:07:00 | 显示全部楼层

Re: Re:关于GetSafeHwnd()这个函数的疑问.

游戏愚: Re:关于GetSafeHwnd()这个函数的疑问.

我是用MFC架构的.
我的主窗口句柄是这样定义的:
HWND main_window_handle;
而主窗口是这样建立的:
m_pM...


你定义一个HWND,是否已把窗口的句柄赋给了它,否则用一个无效的句柄来设置协作级当然会出错了。

GetSafeHwnd()应该是CWnd的成员(好像吧,实在记不住了,不好意思),如果不是,看看是否有AfxGetSafeHwnd()这个函数。

在CWnd中应该有一个类似m_hwnd的成员吧,你看看有没有这个。如果有的话,虽不安全,但也应该是可用的。

PS:我对MFC的使用有限,所知也只是这么多了,如果帮不上忙就对不起了。

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-1-26 19:09:00 | 显示全部楼层

Re:关于GetSafeHwnd()这个函数的疑问.

补充一句:
用来设置协作级的句柄必须是前台进程的主线程生成的。

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-1-26 19:41:00 | 显示全部楼层

Re:关于GetSafeHwnd()这个函数的疑问.

Result = pDD2->SetCooperativeLevel(GetSafeHwnd(),
DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_ALLOWMODEX);

这一句也许是书上的错误!?可能没有认真校对。

你试试:

Result = pDD2->SetCooperativeLevel(m_pMainWnd->GetSafeHwnd(),
DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_ALLOWMODEX);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-25 00:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表