bycview.cpp

来自「Visual_C++.NET实用编程百例」· C++ 代码 · 共 200 行

CPP
200
字号
// bycView.cpp : CbycView 类的实现
//

#include "stdafx.h"
#include "byc.h"
#include <vfw.h>
#include "bycDoc.h"
#include "bycView.h"
#include ".\bycview.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CbycView

IMPLEMENT_DYNCREATE(CbycView, CView)

BEGIN_MESSAGE_MAP(CbycView, CView)
	// 标准打印命令
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
	ON_COMMAND(ID_DEMO, OnDemo)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
END_MESSAGE_MAP()

// CbycView 构造/析构

CbycView::CbycView()
{
	// TODO: 在此处添加构造代码
	fileName="bitmap.bmp";
	load();


}

CbycView::~CbycView()
{
	if(m_hDrawDib!=NULL)
	{
		DrawDibClose(m_hDrawDib);
		m_hDrawDib=NULL;
	}
	if(m_bmpSrc!=NULL)
		DeleteObject(m_bmpSrc);

}

BOOL CbycView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
	// 样式

	return CView::PreCreateWindow(cs);
}

// CbycView 绘制

void CbycView::OnDraw(CDC* pDC)
{
	CbycDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
	if(m_hDrawDib!=NULL&&m_bmpSrc!=NULL)
	{
		BITMAPINFOHEADER RGB32BITSBITMAPINFO=
		{
			sizeof(BITMAPINFOHEADER),m_size.cx,m_size.cy,1,32,BI_RGB,0,0,0,0,0
		};
		DrawDibRealize(m_hDrawDib,pDC->GetSafeHdc(),TRUE);		DrawDibDraw(m_hDrawDib,pDC->GetSafeHdc(),0,0,m_size.cx,m_size.cy,&RGB32BITSBITMAPINFO,(LPVOID)m_clrSrc,0,0,m_size.cx,m_size.cy,DDF_BACKGROUNDPAL);
	}
	// TODO: 在此处为本机数据添加绘制代码

}


// CbycView 打印

BOOL CbycView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// 默认准备
	return DoPreparePrinting(pInfo);
}

void CbycView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 打印前添加额外的初始化
}

void CbycView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 打印后添加清除过程
}


// CbycView 诊断

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

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

CbycDoc* CbycView::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CbycDoc)));
	return (CbycDoc*)m_pDocument;
}
#endif //_DEBUG


// CbycView 消息处理程序

void CbycView::OnDemo()
{
	// TODO: 在此添加命令处理程序代码
	if(m_bmpSrc==NULL||m_hDrawDib==NULL) 
		return;
	Invalidate();
	BOOL bDone=FALSE;
	int i=0,j;
	BITMAPINFOHEADER RGB32BITSBITMAPINFO=
	{
		sizeof(BITMAPINFOHEADER),m_size.cx,m_size.cy,1,32,BI_RGB,0,0,0,0,0
	};
	CPaintDC dc(this);
	DrawDibRealize(m_hDrawDib,dc.GetSafeHdc(),TRUE);
	while(!bDone)
	{
		if(i>20)
		{
			i=20;bDone=TRUE;
		}
		for(j=i;j<m_size.cy;j+=20)			DrawDibDraw(m_hDrawDib,dc.GetSafeHdc(),10,10+j,m_size.cx,1,&RGB32BITSBITMAPINFO,(LPVOID)m_clrSrc,0,j,m_size.cx,1,DDF_BACKGROUNDPAL);
		i++;
		Sleep(100);
	}

}

void CbycView::OnFileOpen()
{
	// TODO: 在此添加命令处理程序代码
	// TODO: 在此添加命令处理程序代码
	CFileDialog dlg (true, "BMP",_T("*.BMP"), OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "位图文件(*.BMP)|*.BMP|");
	if(IDOK==dlg.DoModal())
	{
		fileName.Format("%s",dlg.GetPathName());
	}
	load();
	Invalidate();

}

int CbycView::load(void)
{
	m_bmpSrc=NULL;
	m_hDrawDib=DrawDibOpen();
	HBITMAP hBmp=(HBITMAP)LoadImage(NULL,fileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
	HDC hMemDC=CreateCompatibleDC(NULL);
	if(hMemDC)
	{
		BITMAP bm;
		GetObject(hBmp,sizeof(bm),&bm);
		m_size=CSize(bm.bmWidth,bm.bmHeight);
		//创建32位深度的位图
		BITMAPINFOHEADER RGB32BITSBITMAPINFO = {sizeof(BITMAPINFOHEADER),bm.bmWidth,bm.bmHeight,1,32,BI_RGB,0,0,0,0,0};		this->m_bmpSrc=CreateDIBSection(hMemDC,(BITMAPINFO*)&RGB32BITSBITMAPINFO,DIB_RGB_COLORS,(VOID **)&m_clrSrc,NULL,0);		
		if(m_bmpSrc)
		{
			HBITMAP hOldBmp=(HBITMAP)SelectObject(hMemDC , m_bmpSrc);
			HDC hDC=CreateCompatibleDC(hMemDC);
			if(hDC)
			{
				//将原始位图选入内存设备文本对象
				HBITMAP hOldBmp2 =(HBITMAP)::SelectObject(hDC,hBmp);
				//将原始位复制到源位图中
				BitBlt(hMemDC,0,0,bm.bmWidth,bm.bmHeight,hDC,0,0,SRCCOPY);
				//将原始位图复制到目标位图中
				BitBlt(hMemDC,0,0,bm.bmWidth,bm.bmHeight,hDC,0,0,SRCCOPY);
				//恢复默认的位图句柄
				SelectObject(hDC,hOldBmp2);
				//删除内存设备文本对象
				DeleteDC(hDC);
			}
		SelectObject(hMemDC,hOldBmp);
		}
		DeleteDC(hMemDC);
	}
	return 1;
}

⌨️ 快捷键说明

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