【VC开源代码栏目提醒】:网学会员在VC开源代码频道为大家收集整理了bycView.cpp提供大家参考,希望对大家有所帮助!
// 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;
}
上一篇:
bycDoc.cpp
下一篇:
科研管理杂志简介