游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2060|回复: 4

怎样用Direct ddraw建立一个普通大小的窗口?

[复制链接]

12

主题

40

帖子

40

积分

注册会员

Rank: 2

积分
40
发表于 2004-6-29 22:46:00 | 显示全部楼层 |阅读模式
我知道,建立普通的窗口,就是该一个参数的设置,但是我改了以后,一编译,就提示建立主绘图页失败,请问怎摸回事?
IMPLEMENT_DYNCREATE(canvasFrame, CFrameWnd)
LPDIRECTDRAW7              pDD7;  //定义DirectDraw对象
LPDIRECTDRAWSURFACE7       pPSur; //定义主绘图页
LPDIRECTDRAWSURFACE7       pBBuf; //定义后缓冲区
LPDIRECTDRAWSURFACE7       pOPla[2]; //定义幕后暂存区
DDSCAPS2  caps;                   //定义DDSCAPS结构
DDSURFACEDESC2             desc;  //定义描述结构
HRESULT result;                   //定义HRESULT类型变量
DDCOLORKEY key;                                          //定义颜色键

int i;
canvasFrame::canvasFrame()//构造函数
{
        RECT rect;
        Create(NULL,"绘图窗口");
        CClientDC dc(this);
        int width = dc.GetDeviceCaps(HORZRES);
        int height = dc.GetDeviceCaps(VERTRES);
        GetWindowRect( &rect );
        width = ( width - ( rect.right - rect.left ))/2 ;
        height = (height - (rect.bottom - rect.top ))/2 ;
        MoveWindow( width , height , (rect.right - rect.left ) , (rect.bottom - rect.top ) ,true);
result = DirectDrawCreateEx(NULL, (VOID**)&pDD7, IID_IDirectDraw7, NULL);
        //建立DirectDraw对象
    if (result != DD_OK)
        {
                MessageBox("建立DirectDraw对象失败!");
        //        return 0;
        }
        result = pDD7->SetCooperativeLevel(m_hWnd,DDSCL_NORMAL);
                                
        //设定协调等级
        if(result !=DD_OK)
                MessageBox("设定程序协调等级失败!");
        result = pDD7->SetDisplayMode(640,480,16,0,DDSDM_STANDARDVGAMODE);  //设定显示模式
        if(result !=DD_OK)
        {
                MessageBox("设定屏幕显示模式失败!");
        //        return 0;
        }
        memset(&desc,0,sizeof(desc));      
        desc.dwSize = sizeof(desc);           
        desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
        desc.dwBackBufferCount = 1;        
        desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
        result = pDD7->CreateSurface(&desc,&pPSur,NULL);
        //建立主绘图页
        if(result !=DD_OK)
        {
                 MessageBox("建立主绘图页失败!");
        //        return 0;
        }
        caps.dwCaps = DDSCAPS_BACKBUFFER;  
        result = pPSur->GetAttachedSurface(&caps,&pBBuf);
        //连结后缓冲区
        if(result !=DD_OK)
        {
                MessageBox("连接后缓冲区失败!");
                //return 0;
        }
        memset(&desc,0,sizeof(desc));        
        desc.dwSize = sizeof(desc);
        desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
        desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
    desc.dwWidth =768;
        desc.dwHeight = 540;
//建立幕后暂存区
        result = pDD7->CreateSurface(&desc, &pOPla[0], NULL);
        if(result !=DD_OK)
        {
                  MessageBox("建立幕后暂存区失败!");
                //return;
        }
}

以上就是主要代码,请高手指教呀

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
发表于 2004-6-30 16:35:00 | 显示全部楼层

Re:怎样用Direct ddraw建立一个普通大小的窗口?

这个,建议楼主贴出程序。还有就是楼主应找一下关于建立窗口函数的各种参数说明。

2

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2004-6-30 19:41:00 | 显示全部楼层

Re:怎样用Direct ddraw建立一个普通大小的窗口?

是mfc+direct吧,我不会mfc编程,我也想知道

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-7-1 00:47:00 | 显示全部楼层

Re:怎样用Direct ddraw建立一个普通大小的窗口?

窗口模式下不可以使用翻页链的。你在非独占的协作级里创建翻页链当然会失败了。

7

主题

136

帖子

136

积分

注册会员

Rank: 2

积分
136
发表于 2004-7-6 10:10:00 | 显示全部楼层

Re:怎样用Direct ddraw建立一个普通大小的窗口?

CreateCanvas(HWND hWnd)
{
          int dwWidth,dwHeight;
        DEVMODE dmode;
        GetCurrentVideoSettings(&dmode);
        dwWidth=dmode.dmPelsWidth;
        dwHeight=dmode.dmPelsHeight;

        HRESULT hr;
    DestroyObjects();
       
    if( FAILED( hr = DirectDrawCreateEx( NULL, (VOID**)&m_pDD,
                IID_IDirectDraw7, NULL ) ) )
        return E_FAIL;
       
    // Set cooperative level
    hr = m_pDD->SetCooperativeLevel( hWnd, DDSCL_NORMAL );
    if( FAILED(hr) )
        return E_FAIL;
       
    RECT  rc;
        SetRect( &rc, 0, 0, dwWidth, dwHeight );
       
        LPDIRECTDRAWCLIPPER pcClipper;
   
    DDSURFACEDESC2 ddsd;
    ZeroMemory( &ddsd, sizeof( ddsd ) );
    ddsd.dwSize         = sizeof( ddsd );
    ddsd.dwFlags        = DDSD_CAPS;
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
       
    if( FAILED( m_pDD->CreateSurface( &ddsd, &m_pddsFrontBuffer, NULL ) ) )
        return E_FAIL;
       
    // Create the backbuffer surface
    ddsd.dwFlags        = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;   
    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE;
    ddsd.dwWidth        = dwWidth;
    ddsd.dwHeight       = dwHeight;
       
    if( FAILED( hr = m_pDD->CreateSurface( &ddsd, &m_pddsBackBuffer, NULL ) ) )
        return E_FAIL;
       
       
    if( FAILED( hr = m_pDD->CreateClipper( 0, &pcClipper, NULL ) ) )
        return E_FAIL;
       
    if( FAILED( hr = pcClipper->SetHWnd( 0, hWnd ) ) )
    {
        pcClipper->Release();
        return E_FAIL;
    }
       
    if( FAILED( hr = m_pddsFrontBuffer->SetClipper( pcClipper ) ) )
    {
        pcClipper->Release();
        return E_FAIL;
    }
       
    pcClipper->Release();
       
    m_hWnd      = hWnd;
    m_bWindowed = TRUE;
}

MFC+DDRAW
在创建窗口的时候
大致上就这个样子

以后必须在框架mainfrm和view里把 WM_SIZE,WM_MOVE,WM_PAINT给重载
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-5 13:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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