⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 canvasframe.cpp

📁 《Visual C++游戏设计入门》配套代码
💻 CPP
字号:
// 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

/////////////////////////////////////////////////////////////////////////////
// canvasFrame

IMPLEMENT_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 handlers

int 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
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -