📄 bkimageview.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 + -