游戏开发论坛

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

救助,怎么实现DirectDraw Window Mode?

[复制链接]

1

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2005-12-1 18:03:00 | 显示全部楼层 |阅读模式
如题,我建了个DirectDraw的程序项目,可以实现全屏模式的图形绘制,我想求教怎样才能实现窗口模式?我试过把SetCooperativeLevel设置为DDSCL_NORMAL,并且取消了Flip,改用Clipper,但是只能见到一个空白的窗口,不能见到任何绘制上去的画面。求高手帮帮忙!

0

主题

3

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2005-12-1 19:55:00 | 显示全部楼层

Re:救助,怎么实现DirectDraw Window Mode?

还要用SetHWnd来设置窗口

1

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2005-12-1 21:42:00 | 显示全部楼层

Re: 救助,怎么实现DirectDraw Window Mode?

这一步我也做了,我给出我的代码,求高手帮忙看看:

LPDIRECTDRAW7                        pDD7;
LPDIRECTDRAWSURFACE7        pPriSur;
LPDIRECTDRAWSURFACE7        pOffSur;
LPDIRECTDRAWCLIPPER                pClipper;
DDSCAPS2                                caps;                  
DDSURFACEDESC2                        desc;
DDCOLORKEY                                key;
HRESULT                                        result;

BOOL MainFrame::InitDirectDrawWindowed()
{
        result = DirectDrawCreateEx(NULL, (VOID**)&pDD7, IID_IDirectDraw7, NULL);
        if (result != DD_OK)
        {
                return false;
        }

        result = pDD7->SetCooperativeLevel(m_hWnd, DDSCL_NORMAL);
        if(result != DD_OK)
        {
                return false;
        }

        memset(&desc, 0, sizeof(desc));      
        desc.dwSize = sizeof(desc);           
        desc.dwFlags = DDSD_CAPS;
        desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_SYSTEMMEMORY;
        result = pDD7->CreateSurface(&desc, &pPriSur, NULL);
        if(result != DD_OK)
        {
                return false;
        }

        result = pDD7->CreateClipper(0, &pClipper, NULL);
    if(result != DD_OK)
    {
        return(false);
    }

        result = pClipper->SetHWnd(0, m_hWnd);
    if(result != DD_OK)
    {
        return(false);
    }

        result = pPriSur->SetClipper(pClipper);
    if(result != DD_OK )
    {
        return(false);
    }

        memset(&desc, 0, sizeof(desc));        
        desc.dwSize = sizeof(desc);
        desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
        desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
        desc.dwWidth = 800;
        desc.dwHeight = 600;
        result = pDD7->CreateSurface(&desc, &pOffSur, NULL);
        if(result != DD_OK)
        {
                return false;
        }
return true;
}

创建窗体的方式:
MainFrame* pFrame = new MainFrame;
if (!pFrame)
        return FALSE;
m_pMainWnd = pFrame;
pFrame->Create(NULL, "Game", WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE | WS_MINIMIZEBOX | WS_SYSMENU, CRect(0, 0, 810, 636), NULL, NULL, WS_EX_CLIENTEDGE, NULL);

请高手帮忙看看哪里不对,先在此谢过啦!

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
发表于 2005-12-2 09:07:00 | 显示全部楼层

Re:救助,怎么实现DirectDraw Window Mode?

改变模式后看不到图像,应该是Surface丢失了,你需要恢复设备和重新新建、载入Surface,具体可以看看微软切换全屏、窗口的例子

1

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2005-12-2 10:13:00 | 显示全部楼层

Re: 救助,怎么实现DirectDraw Window Mode?

但是我现在是在程序运行的时候就初始化DirectDraw成窗口模式,并没有从全屏模式切换过来,是否在建立的时候遗漏了什么?

33

主题

544

帖子

554

积分

高级会员

Rank: 4

积分
554
发表于 2005-12-2 12:53:00 | 显示全部楼层

Re:救助,怎么实现DirectDraw Window Mode?

WIN游戏大师技巧 那本书里写了
不过我忘了,不好意思,很久没写过DDraw的程序了
楼主可以查一下那本书;)

1

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2005-12-2 17:46:00 | 显示全部楼层

Re:救助,怎么实现DirectDraw Window Mode?

谢谢,我这就去找

0

主题

46

帖子

46

积分

注册会员

Rank: 2

积分
46
发表于 2005-12-4 02:40:00 | 显示全部楼层

Re:救助,怎么实现DirectDraw Window Mode?

试一下去掉 DDSCAPS_SYSTEMMEMORY
用Blt代替Flip

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2005-12-4 14:38:00 | 显示全部楼层

Re:救助,怎么实现DirectDraw Window Mode?

没必要去掉DDSCAPS_SYSTEMMEMORY

1

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2005-12-4 21:37:00 | 显示全部楼层

Re:救助,怎么实现DirectDraw Window Mode?

我已经去掉了Flip,是直接用BitFast来绘图的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 21:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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