游戏开发论坛

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

求助,关于DDRAW的窗口模式.

[复制链接]

21

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
发表于 2006-7-10 10:38:00 | 显示全部楼层 |阅读模式
DDRAW窗口模式中,
如下创建:
        if( g_lpDD->SetCooperativeLevel(g_hWnd, DDSCL_NORMAL) !=DD_OK )            
        if( g_lpDD->SetDisplayMode(1024,768,32,0,DDSDM_STANDARDVGAMODE)!=DD_OK )

                DDSURFACEDESC2  ddsd;
        memset(&ddsd,0,sizeof(DDSURFACEDESC2));
        ddsd.dwSize=sizeof(ddsd);
        ddsd.dwFlags=DDSD_CAPS;
        ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;
        if( g_lpDD->CreateSurface(&ddsd,&_lpDDSPri,NULL)!=DD_OK)
                return false;

不论要绘制的窗口的位置是多少,
绘制出来的图的左上角坐标始终是(0,0),即桌面的左上角,怎样能正确绘制在希望绘制的窗口中?

哪位朋友能帮忙?多谢哦

21

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
 楼主| 发表于 2006-7-10 12:13:00 | 显示全部楼层

Re:求助,关于DDRAW的窗口模式.

知道的朋友帮一把啊.多谢多谢

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20737
发表于 2006-7-10 13:27:00 | 显示全部楼层

Re:求助,关于DDRAW的窗口模式.

把裁减区和应用程序窗口绑定好。

21

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
 楼主| 发表于 2006-7-10 14:43:00 | 显示全部楼层

Re:求助,关于DDRAW的窗口模式.

应该怎样绑定? 麻烦能明示一下啊.  

21

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
 楼主| 发表于 2006-7-10 15:40:00 | 显示全部楼层

Re:求助,关于DDRAW的窗口模式.

急啊,等了半天了,哪位朋友说一声吧,应该不是很难吧.
再次感谢!

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2006-7-10 17:53:00 | 显示全部楼层

Re:求助,关于DDRAW的窗口模式.

哎呀,自己计算坐标么。

使用GetWindowRect方法。(DirectX7对象)
得到一个Rect,是当前窗口的位置。

后面的不用说了吧。

21

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
 楼主| 发表于 2006-7-10 20:38:00 | 显示全部楼层

Re:求助,关于DDRAW的窗口模式.

这个我知道,但好像不是最好的办法.

10

主题

95

帖子

95

积分

注册会员

Rank: 2

积分
95
QQ
发表于 2006-7-10 21:56:00 | 显示全部楼层

Re:求助,关于DDRAW的窗口模式.

绑定剪裁器:
//*****************使用剪裁器****************
HRESULT UseClipper()
{
    HRESULT ddrval;
    LPDIRECTDRAWCLIPPER lpClipper = NULL;

    //创建剪裁器对象
    ddrval = lpDD->CreateClipper(0, &lpClipper, NULL);
    if ( ddrval != DD_OK){
                Message("创建裁减器对象失败");
        return ddrval;
    }
   
    //将裁剪器设置为hWnd指向的窗口的客户区的范围
    ddrval = lpClipper->SetHWnd(0, hWnd);
    if ( ddrval != DD_OK){
                Message("设置裁减器失败");
        return ddrval;
    }

    //将裁剪器附于主页面
    ddrval = lpDDSPrimary->SetClipper(lpClipper);
    if ( ddrval != DD_OK){
                Message("设置裁减器失败");
        return ddrval;
    }

    //主位图已经自动增加了裁剪器的索引值,所以应将它释放
    if( lpClipper != NULL ) {
        lpClipper -> Release();
        lpClipper = NULL;
    }

    return DD_OK;
}
在主表面创建成功以后调用这个函数绑定剪裁器

21

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
 楼主| 发表于 2006-7-11 08:21:00 | 显示全部楼层

Re:求助,关于DDRAW的窗口模式.

嗯,楼上好像是正解.昨天找到一篇文章也是这么写的.但是好像使用了CLIP之后就不能使用BLTFAST了哦.

0

主题

1037

帖子

1037

积分

金牌会员

Rank: 6Rank: 6

积分
1037
发表于 2006-7-11 09:30:00 | 显示全部楼层

Re:求助,关于DDRAW的窗口模式.

if (WINDOWED_APP)
{
// now resize the window, so the client area is the actual size requested
// since there may be borders and controls if this is going to be a windowed app
// if the app is not windowed then it won't matter
RECT window_rect = {0,0,WINDOW_WIDTH-1,WINDOW_HEIGHT-1};

// make the call to adjust window_rect
AdjustWindowRectEx(&window_rect,
     GetWindowStyle(main_window_handle),
     GetMenu(main_window_handle) != NULL,  
     GetWindowExStyle(main_window_handle));

// save the global client offsets, they are needed in DDraw_Flip()
window_client_x0 = -window_rect.left;
window_client_y0 = -window_rect.top;

// now resize the window with a call to MoveWindow()
MoveWindow(main_window_handle,
           0, // x position
           0, // y position
           window_rect.right - window_rect.left, // width
           window_rect.bottom - window_rect.top, // height
           FALSE);

// show the window, so there's no garbage on first render
ShowWindow(main_window_handle, SW_SHOW);
} // end if windowed
这个才是正解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 21:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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