大虾帮忙------我的翻页(flip)有问题
有2个bmp图形文件,一个放在主页面,另外一个放在缓存.然后定时用flip翻页.但是程序运行时只能看见放在缓存的bmp图形文件能够定时显示,却看不见放在主页面的bmp图形文件显示.这到底是什么问题 ? 是不是显示卡的问题?

解决方案 »

  1.   

    http://www.game173.com/ViewTopic.asp?Url=30,1,8940,0,1,0
    http://www.pcvc.net/category/content.asp?sendid=160
    //锁住后备画面
     memset(&ddsd,0,sizeof(ddsd));
     ddsd.dwSize=sizeof(ddsd);
     if (FAILED(lpDDback->Lock(NULL,&ddsd,
      DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,
      NULL))) 
     {
      MessageBox(NULL,TEXT("primary surface lock error!"),
       TEXT("Wrong!"),MB_OK);
      return(1);
     }
      //解锁后备画面
     if (FAILED(lpDDback->Unlock(NULL)))
     {
      MessageBox(NULL,TEXT("primary surface unlock error!"),
       TEXT("Wrong!"),MB_OK);
      return(1);
     } //翻页
     while (FAILED(lpDDprimary->Flip(NULL, DDFLIP_WAIT)));
      

  2.   

    双缓冲的方式是,你始终绘制后台的,flip自动把后台的变成前台的,而原来前台的变化成为后台的。
    是不是你的处理方式有问题呢?如果只是两个不同页面内容的往复切换,你只要绘制两次就够了,然后不断的flip就可以
    因为flip并不改变由前台带回来的内容,但是如果你再次重绘后台就不同了。
      

  3.   

    补充: 该程序使用的是 directx sdk 8.0
      

  4.   

    现在我把主要代码贴上,请诸位大虾看看为什么会产生如顶楼的问题:// canvasFrame.cpp : implementation file
    //#include "stdafx.h"
    #include "canvasr.h"
    #include "canvasFrame.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // canvasFrameIMPLEMENT_DYNCREATE(canvasFrame, CFrameWnd)LPDIRECTDRAW7              pDD7;  //声明DirectDraw对象
    LPDIRECTDRAWSURFACE7       pPSur; //声明主绘图页
    LPDIRECTDRAWSURFACE7       pBBuf; //声明后缓冲区
    LPDIRECTDRAWSURFACE7       pOPla; //声明幕后内存区
    DDSCAPS2  caps;                   //声明DDSCAPS结构
    DDSURFACEDESC2             desc;  //声明描述结构
    HRESULT result;                   //声明HRESULT类型变量canvasFrame::canvasFrame()
    {
    Create(NULL,"绘图窗口",WS_POPUP); //建立窗口
    hdc = ::CreateCompatibleDC(NULL);
    bmp1 = (HBITMAP)::LoadImage(NULL,"back1.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
    bmp2 = (HBITMAP)::LoadImage(NULL,"back2.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE); 
    ::SelectObject(hdc,bmp1);  //选择第一张位图
    LoadBmp();
    pPSur->BltFast(0,0,pOPla,CRect(0,0,640,480),DDBLTFAST_WAIT);
    ::SelectObject(hdc,bmp2);  //选择第二张位图
    LoadBmp();
    pBBuf->BltFast(0,0,pOPla,CRect(0,0,640,480),DDBLTFAST_WAIT);
    }canvasFrame::~canvasFrame()
    {
    delete hdc;
    delete hdc1;
    delete bmp1;
    delete bmp2;
    pDD7->Release();
    pPSur->Release();
    pOPla->Release();
    }
    BEGIN_MESSAGE_MAP(canvasFrame, CFrameWnd)
    //{{AFX_MSG_MAP(canvasFrame)
    ON_WM_CREATE()
    ON_WM_CHAR()
    ON_WM_TIMER()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // canvasFrame message handlersint canvasFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;
        result = DirectDrawCreateEx(NULL, (VOID**)&pDD7, IID_IDirectDraw7, NULL);
    //建立DirectDraw对象
        if (result != DD_OK)
    MessageBox("建立DirectDraw对象失败!");
    result = pDD7->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE |
             DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT );
    //设定协调层级
    if(result !=DD_OK)
    MessageBox("设定程序协调层级失败!");
    result = pDD7->SetDisplayMode(640,480,16,0,DDSDM_STANDARDVGAMODE);  //设定屏幕显示模式
    //设定显示模式
    if(result !=DD_OK)
    MessageBox("设定屏幕显示模式失败!");
    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("建立主绘图页失败!");
    caps.dwCaps = DDSCAPS_BACKBUFFER;  
    result = pPSur->GetAttachedSurface(&caps,&pBBuf); 
    //连结后缓冲区
    if(result !=DD_OK)
    MessageBox("连接后缓冲区失败!");
    memset(&desc,0,sizeof(desc));        
    desc.dwSize = sizeof(desc);
    desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; 
    desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
    desc.dwWidth = 640; 
    desc.dwHeight = 480; 
    result = pDD7->CreateSurface(&desc, &pOPla, NULL); 
    //建立幕后内存区
    if(result !=DD_OK)
       MessageBox("建立幕后内存区失败!");
    SetTimer(1,500,NULL);
    return 0;
    }void canvasFrame::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    CFrameWnd::OnChar(nChar, nRepCnt, nFlags);
    if( nChar== VK_ESCAPE )      //判断是否按下 Esc 键
    PostMessage(WM_CLOSE );  //传送WM_CLOSE信息
    }void canvasFrame::OnTimer(UINT nIDEvent) 
    {
    CFrameWnd::OnTimer(nIDEvent);
    pPSur->Flip( NULL , DDFLIP_WAIT );  //翻页
    }
    void canvasFrame::LoadBmp()
    {
    result = pOPla->GetDC(&hdc1);  //取得DC
    if(result !=DD_OK)
       MessageBox("取得内存区 DC 失败!");
    ::BitBlt(hdc1,0,0,desc.dwWidth,desc.dwHeight,hdc,0,0,SRCCOPY);
    pOPla->ReleaseDC(hdc1);        //释放DC
    }