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

📄 1_6view.cpp

📁 VC++6游戏编程入门及源码,新手必备~
💻 CPP
字号:
// 1_6View.cpp : implementation of the CMy1_6View class
//

#include "stdafx.h"
#include "1_6.h"

#include "1_6Doc.h"
#include "1_6View.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMy1_6View

IMPLEMENT_DYNCREATE(CMy1_6View, CView)

BEGIN_MESSAGE_MAP(CMy1_6View, CView)
	//{{AFX_MSG_MAP(CMy1_6View)
	ON_WM_CREATE()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMy1_6View construction/destruction

CMy1_6View::CMy1_6View()
{
	// TODO: add construction code here
    xStart=30;
	yStart=30;
	xadd=0;
	yadd=0;
    m_Bitmap.LoadBitmap(IDB_BITMAP1);
    cTransparentColor=RGB(255,255,255);
}

CMy1_6View::~CMy1_6View()
{
}

BOOL CMy1_6View::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMy1_6View drawing

void CMy1_6View::OnDraw(CDC* pDC)
{
	CMy1_6Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	//画红色背景
    CBrush mybrush1;
 	mybrush1.CreateSolidBrush(RGB(255,0,0));
 	CRect myrect1(0,0,1200,800);
 	pDC->FillRect(myrect1,&mybrush1);
  
	 
}

/////////////////////////////////////////////////////////////////////////////
// CMy1_6View printing

BOOL CMy1_6View::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMy1_6View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMy1_6View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMy1_6View diagnostics

#ifdef _DEBUG
void CMy1_6View::AssertValid() const
{
	CView::AssertValid();
}

void CMy1_6View::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMy1_6Doc* CMy1_6View::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMy1_6Doc)));
	return (CMy1_6Doc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMy1_6View message handlers
//本函数把一种指定的颜色变成透明色,并可改变大小
//   hdc 显示句柄
//   hBitmap要显示的位图
//   xStart,xStart显示的位置
//   xadd,yadd显示的位图的加大加小
//   cTransparentColor变成透明的那种颜色
void CMy1_6View::TransparentBitmap(HDC hdc, HBITMAP hBitmap, 
					     short xStart, short yStart, short xadd,short yadd,
						 COLORREF cTransparentColor)
{
   BITMAP     m_bm;
   COLORREF   cColor;  
   
   // 创建临时DC
   HDC     hMem, hBack, hObject, hTemp, hSave;
   hBack   = CreateCompatibleDC(hdc);
   hObject = CreateCompatibleDC(hdc);
   hMem    = CreateCompatibleDC(hdc);
   hSave   = CreateCompatibleDC(hdc);   
   hTemp   = CreateCompatibleDC(hdc);
   // 选入位图
   SelectObject(hTemp, hBitmap);   
   GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&m_bm);
   //显示位图宽高
   POINT      ptSize;
   // 取得位图的宽度
   ptSize.x = m_bm.bmWidth;     
    // 取得位图的该度
   ptSize.y = m_bm.bmHeight;           
   // 转换为逻辑点值
   DPtoLP(hTemp, &ptSize, 1);   
   
   // 创建临时位图
   HBITMAP    bmBack, bmObject, bmMem, bmSave;
   // 单色位图
   bmBack   = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);    
   bmObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);
   // 与设备兼容位图
   bmMem    = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
   bmSave      = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);

   // 将创建的临时位图选入临时DC中
   HBITMAP    OldbmBack, OldbmObject, OldbmMem, OldbmSave;
   OldbmBack   = (HBITMAP)SelectObject(hBack, bmBack);
   OldbmObject = (HBITMAP)SelectObject(hObject, bmObject);
   OldbmMem    = (HBITMAP)SelectObject(hMem, bmMem);
   OldbmSave   = (HBITMAP)SelectObject(hSave, bmSave);

   // 设置映射模式
   SetMapMode(hTemp, GetMapMode(hdc));
   // 先保留原始位图
   BitBlt(hSave, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCCOPY);
   // 将背景颜色设置为需透明的颜色
   cColor = SetBkColor(hTemp, cTransparentColor);
   // 创建目标屏蔽码
   BitBlt(hObject, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCCOPY);
   // 恢复源DC的原始背景色
   SetBkColor(hTemp, cColor);

   // 创建反转的目标屏蔽码
   BitBlt(hBack, 0, 0, ptSize.x, ptSize.y, hObject, 0, 0, NOTSRCCOPY);
   // 拷贝主DC的背景到目标DC
   BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart, SRCCOPY);
   // 屏蔽位图的显示区
   BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hObject, 0, 0, SRCAND);
   // 屏蔽位图中的透明色
   BitBlt(hTemp, 0, 0, ptSize.x, ptSize.y, hBack, 0, 0, SRCAND);
   // 将位图与目标DC的背景左异或操作
   BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCPAINT);
   // 拷贝目标到屏幕上 
   StretchBlt(hdc, xStart, yStart, ptSize.x+xadd, ptSize.y+yadd, hMem, 0, 0, ptSize.x, ptSize.y,SRCCOPY);
   // 恢复原始位图
   BitBlt(hTemp, 0, 0, ptSize.x, ptSize.y, hSave, 0, 0, SRCCOPY);

   // 删除临时内存位图
   DeleteObject(SelectObject(hBack, OldbmBack));
   DeleteObject(SelectObject(hObject, OldbmObject));
   DeleteObject(SelectObject(hMem, OldbmMem));
   DeleteObject(SelectObject(hSave, OldbmSave));

   // 删除临时内存DC
   DeleteDC(hMem);
   DeleteDC(hBack);
   DeleteDC(hObject);
   DeleteDC(hSave);
   DeleteDC(hTemp);
}

int CMy1_6View::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	SetTimer(1,150,NULL);
	return 0;
}

void CMy1_6View::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	//获取指针pdc
 	CDC *pDC=GetDC();
	//调用OnDraw(pDC)重画
 	OnDraw(pDC);
	
	CClientDC dc(this);
	//向右向下移动
	xStart+=5;
	yStart+=5;
	//位图宽高加2
	xadd+=2;yadd+=2;
	//显示
 	TransparentBitmap(dc.GetSafeHdc(), m_Bitmap, xStart,  yStart, xadd,yadd, cTransparentColor);	
	CView::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

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