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

📄 bkimageview.cpp

📁 visual c++数字图像与图形处理中的光盘内容
💻 CPP
字号:
// BkImageView.cpp : implementation of the CBkImageView class
//

#include "stdafx.h"
#include "BkImage.h"

#include "BkImageDoc.h"
#include "BkImageView.h"

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


#include "Dib.h"
#include "ImageGeometry.h"
#include "ZBuffer.h"
#include "BTriangle.h"

/////////////////////////////////////////////////////////////////////////////
// CBkImageView

IMPLEMENT_DYNCREATE(CBkImageView, CView)

BEGIN_MESSAGE_MAP(CBkImageView, CView)
	//{{AFX_MSG_MAP(CBkImageView)
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBkImageView construction/destruction

CBkImageView::CBkImageView()
{
	// TODO: add construction code here
	

}

CBkImageView::~CBkImageView()
{
	delete m_pCB;
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CBkImageView drawing

void CBkImageView::OnDraw(CDC* pDC)
{
	m_pCB->SwapBuffer(pDC);
}

/////////////////////////////////////////////////////////////////////////////
// CBkImageView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CBkImageView message handlers

int CBkImageView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here

	//第一步,获取背景位图的数据
	//保证 back.bmp 位于项目目录下
	CDib* pBackDib = new CDib("back.bmp");

	//获取位图尺寸
	int nDibWidth = pBackDib->GetWidth();
	int nDibHeight = pBackDib->GetHeight();

	//分配内存,将24位位图转化为32位
	BYTE* pbyDib32 = new BYTE[nDibWidth * nDibHeight * 4];
	
	//设置位图为不透明
	memset(pbyDib32, 255, nDibWidth * nDibHeight * 4);
	
	//获取RGB数据
	pBackDib->GetDdbData32(pbyDib32);

	delete pBackDib;

	//第二步,申明颜色缓冲区
	m_pCB = new CColorBuffer(288,250);

	//第三步,将图像缩放至指定的大小,即(288,250)
	
	BYTE* pbyColorBuffer = new BYTE[288 * 250 * 4];

	CImageGeometry* ig = new CImageGeometry();
	
	//设置插值质量(三阶总面积插值,最好)
	ig->SetQuality( IMAGE_GEOMETRY_THREE_ORDER_INTERPOLATE );

	ig->Scale(pbyDib32, 0, 0, nDibWidth, nDibHeight, nDibWidth, nDibHeight, pbyColorBuffer, 288, 250);
	
	//设置数据
	m_pCB->SetBkImage(pbyColorBuffer, 288, 250);
	
	delete ig;
	delete[] pbyDib32;
	delete[] pbyColorBuffer;

	//第四步,把场景绘制到颜色缓冲区(即帧缓冲区)中
	
	//首先,申明一个深度缓冲区
	CZBuffer* pZB = new CZBuffer(288, 250);
	pZB->InitAllDepth(500.0f);

	//三角形基元
	CBTriangle bt;
	
	//顶点
	POINT pts[12] = {
		{60,  60}, {210, 60}, {210, 80},  {60,  80}, 
		{80,  40}, {100, 40}, {190, 210}, {170, 210},
		{190, 40}, {170, 40}, {80,  210}, {100, 210}};

	//颜色,三个四边形的颜色分别为红色、绿色和蓝色
	FLOATCOLORRGBA red = {1.0f, 0.0f, 0.0f, 1.0f};
	FLOATCOLORRGBA green = {0.0f, 1.0f, 0.0f, 1.0f};
	FLOATCOLORRGBA yellow = {1.0f, 1.0f, 0.0f, 1.0f};

	//四边形顶点深度
	float z[12] = {0.5f, 0.5f, 0.4f, 0.4f,
				   0.2f, 0.2f, 0.9f, 0.9f,
				   0.6f, 0.6f, 0.1f, 0.1f};
	
	//绘制
	//注意,绘制顺序无关

	//红色条带
	bt.Draw(pts[0], pts[1], pts[2], z[0], z[1], z[2], red, red, red, m_pCB, pZB);	
	bt.Draw(pts[0], pts[3], pts[2], z[0], z[3], z[2], red, red, red, m_pCB, pZB);	

	//绿色条带
	bt.Draw(pts[4], pts[5], pts[6], z[4], z[5], z[6], green, green, green, m_pCB, pZB);
	bt.Draw(pts[4], pts[7], pts[6], z[4], z[7], z[6], green, green, green, m_pCB, pZB);	

	//黄色条带
	bt.Draw(pts[8], pts[9], pts[10], z[8], z[9], z[10], yellow, yellow, yellow, m_pCB, pZB);	
	bt.Draw(pts[8], pts[10],pts[11], z[8], z[10],z[11], yellow, yellow, yellow, m_pCB, pZB);	

	delete pZB;

	return 0;
}

⌨️ 快捷键说明

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