首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

CCRUN 上的DDRAW的有关问题

2012-02-22 
CCRUN 上的DDRAW的问题。#includevcl.h#pragmahdrstop#includeUnit1.h #includeddraw.h #includewin

CCRUN 上的DDRAW的问题。
#include   <vcl.h>
#pragma   hdrstop

#include   "Unit1.h "
#include   "ddraw.h "
#include   "windows.h "
//---------------------------------------
#pragma   package(smart_init)
#pragma   resource   "*.dfm "
LPDIRECTDRAW   pMyDD;                               //初始化
LPDIRECTDRAWSURFACE   pMyDDSFront,pMyDDSBack;   //前页
LPDIRECTDRAWCLIPPER   pMyClipper;     //
LPDIRECTDRAWPALETTE   pMyDDPal;           //
HWND   myWnd;
int   scr_width,scr_height;;

TForm1   *Form1;
//---------------------------------------
__fastcall   TForm1::TForm1(TComponent*   Owner)
    :   TForm(Owner)
{
}
//---------------------------------------

void   __fastcall   TForm1::FormCreate(TObject   *Sender)
{
        pMyDD   =   NULL;
        pMyDDSFront   =   NULL;
        pMyDDSBack   =   NULL;
        pMyClipper=   NULL;
        pMyDDPal   =   NULL;
        DirectDrawCreate(NULL,&pMyDD,NULL);
        //步骤二:   设置屏幕的显示方式.
        //pMyDD-> SetCooperativeLevel(AfxGetMainWnd()-> GetSafeHwnd(),DDSCL_NORMAL);
        pMyDD-> SetCooperativeLevel(myWnd   ,DDSCL_FULLSCREEN   );
        pMyDD-> SetDisplayMode(800,600,8);

        //步骤三:   建立前后页(两块画板).

        DDSURFACEDESC   ddsd;
        ddsd.dwFlags   =   DDSD_CAPS;
        ddsd.ddsCaps.dwCaps   =   DDSCAPS_PRIMARYSURFACE;   //指定我们用的是前页
        ddsd.dwSize   =   sizeof(ddsd);//尺寸
        //   做前页:
        HRESULT   result;
        result   =   pMyDD-> CreateSurface(&ddsd,&pMyDDSFront,NULL);
        //当发生错误时,   要记得   Release对象.
        if(result!=DD_OK)
        {
          pMyDD-> Release();
          pMyDD=NULL;

          ddsd.dwWidth   =   scr_width;//设定后页的大小
          ddsd.dwHeight   =   scr_height;
          //指定   我们要后页
          ddsd.dwFlags   =   DDSD_WIDTH   |   DDSD_HEIGHT   |DDSD_CAPS   ;
          ddsd.ddsCaps.dwCaps     =   DDSCAPS_OFFSCREENPLAIN;
          //做后页
          result   =   pMyDD-> CreateSurface(&ddsd,&pMyDDSBack,NULL);
        }

  //   步骤四:   给显示区加一个画框(裁剪板)

        result   =   pMyDD-> CreateClipper(0,&pMyClipper,NULL);
        myWnd   =((CMainDlg   *)AfxGetMainWnd())-> GetSafeHwnd(myWnd));     //从系统中拿到窗口的   Handle


        result   =   pMyClipper-> SetHWnd(0,myWnd);
        result   =   pMyDDSFront-> SetClipper(pMyClipper);

    //步骤五:   在后页画图,   前后页互换.

    if(pMyDDSFront-> IsLost()==DDERR_SURFACELOST)
    {
        pMyDDSFront-> Restore();
        result   =   pMyDDSFront-> Blt(&rcTo,pMyDDSBack,&rcFrom,DDBLT_WAIT,NULL);
        result   =   pMyDDSFront-> BltFast(0,0,pMyDDSBack,&rcFrom,DDBLTFAST_SRCCOLORKEY);

        //如果程式工作在 "全屏 "模式下
        //result   =     pMyDDSFront-> Flip(NULL,0);


    }


}
出现4个错误
AfxGetMainWnd   条用错误
rcTo,rcFrom   未定义


我想用DDraw   来前后页交换




[解决办法]
那篇文档大概是转载的吧。
AfxGetMainWnd是VC中的函数,在BCB中可以用主窗口的句柄来代码,比如Handle。
至于rcTo,rcFrom和,大概是两个RECT型的变量,自己定义一下。
[解决办法]
添加
#pragma CONMENT(LIB, "DDRAW.LIB ")


RECT rcTo,rcFrom;

直接用你的 在 "全屏 "模式下
result = pMyDDSFront-> Flip(NULL,0);

可以跳过AfxGetMainWnd


热点排行