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

📄 mirror~2.cpp

📁 vc++net很不错的一个工具
💻 CPP
字号:
// MirrorView.cpp : CMirrorView 类的实现
//

#include "stdafx.h"
#include "Mirror.h"

#include "MirrorDoc.h"
#include "MirrorView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMirrorView

IMPLEMENT_DYNCREATE(CMirrorView, CView)

BEGIN_MESSAGE_MAP(CMirrorView, 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_HORIZONTAL, OnHorizontal)
	ON_COMMAND(ID_VERTICAL, OnVertical)
	ON_COMMAND(ID_NORMAL, OnNormal)
	ON_UPDATE_COMMAND_UI(ID_HORIZONTAL, OnUpdateHorizontal)
	ON_UPDATE_COMMAND_UI(ID_VERTICAL, OnUpdateVertical)
	ON_UPDATE_COMMAND_UI(ID_NORMAL, OnUpdateNormal)
END_MESSAGE_MAP()

// CMirrorView 构造/销毁

CMirrorView::CMirrorView()
{
	// TODO: 在此处添加构造代码
    m_bmpSrc=NULL;
	m_bmpDst=NULL;

	m_nType=0;
	//打开DrawDib库,生成DrawDib设备文本句柄
	m_hDrawDib=DrawDibOpen();
	//载入位图文件
	HBITMAP hBmp = (HBITMAP)LoadImage( NULL,"bitmap.bmp",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
		};
        
		m_bmpSrc=CreateDIBSection(hMemDC,(BITMAPINFO *)&RGB32BITSBITMAPINFO,DIB_RGB_COLORS,(VOID **)&m_clrSrc,NULL,0);
		m_bmpDst=CreateDIBSection(hMemDC,(BITMAPINFO *)&RGB32BITSBITMAPINFO,DIB_RGB_COLORS,(VOID **)&m_clrDst,NULL,0);

		if( m_bmpSrc&& m_bmpDst )
		{  
			//将源位图选入内存设备文对象
			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);
				//将目标位图选入内存设备文对象
				SelectObject(hMemDC,m_bmpDst);
				//将原始位图拷贝到目标位图中
				BitBlt(hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, hDC, 0, 0, SRCCOPY);
				SelectObject(hDC, hOldBmp2);
				DeleteDC(hDC);
			}
			SelectObject(hMemDC, hOldBmp);
		}
		DeleteDC(hMemDC);
	}

}

CMirrorView::~CMirrorView()
{
	if( m_hDrawDib != NULL)
	{
		//关闭DrawDib设备文本句柄
		DrawDibClose( m_hDrawDib);
		m_hDrawDib = NULL;
	}

	if( m_bmpDst != NULL )
		//删除目标位图句柄
		DeleteObject(m_bmpDst);

	if( m_bmpSrc != NULL )
		//删除源位图句柄
		DeleteObject(m_bmpSrc);
}

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

	return CView::PreCreateWindow(cs);
}

// CMirrorView 绘制

void CMirrorView::OnDraw(CDC* pDC)
{
	CMirrorDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: 在此处为本机数据添加绘制代码
	if( m_hDrawDib != NULL && m_bmpSrc != NULL && m_bmpDst != NULL )
	{
		BITMAPINFOHEADER RGB32BITSBITMAPINFO=
		{
			sizeof(BITMAPINFOHEADER),m_size.cx,m_size.cy,
			1,32,BI_RGB,0,0,0,0,0
		};
        //实现DrawDib设备文本句柄
		DrawDibRealize( m_hDrawDib, pDC->GetSafeHdc(), TRUE);
        //显示DIB位图
		DrawDibDraw( m_hDrawDib,pDC->GetSafeHdc(),0,0,m_size.cx,
			m_size.cy,&RGB32BITSBITMAPINFO,(LPVOID)m_clrDst,
			0,0,m_size.cx,m_size.cy,DDF_BACKGROUNDPAL);
	}
}


// CMirrorView 打印

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

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

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


// CMirrorView 诊断

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

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

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


// CMirrorView 消息处理程序

void CMirrorView::OnHorizontal()
{
	// TODO: 在此添加命令处理程序代码
if( m_nType == 1) return;

	if( m_bmpSrc != NULL && m_bmpDst != NULL )
	{
		LONG x,y;
		for(y=0;y<m_size.cy;y++)
		{
			for(x=0;x<m_size.cx;x++)
			{  //将目标位图的位图数据设置位源位图水平镜向后对应的位图数据
				m_clrDst[ ( m_size.cx-x-1 )+y*m_size.cx ]=m_clrSrc[ x+y*m_size.cx ];
			}
		}
		m_nType=1;
		Invalidate();
	}

	
}

void CMirrorView::OnVertical()
{
	// TODO: 在此添加命令处理程序代码
	if( m_nType == 2 ) return;
	if( m_bmpSrc != NULL && m_bmpDst != NULL )
	{
		LONG x,y;
		for(y=0;y<m_size.cy;y++)
		{
			for(x=0;x<m_size.cx;x++)
			{
				//将目标位图的位图数据设置位源位图垂直镜向后对应的位图数据
				m_clrDst[ x+( m_size.cy-y-1 )*m_size.cx ]=m_clrSrc[ x+y*m_size.cx ];
			}
		}
		m_nType=2;
		Invalidate();
	}
		
}

void CMirrorView::OnNormal()
{
	// TODO: 在此添加命令处理程序代码
	if( m_nType == 0) return;
	if( m_bmpSrc != NULL && m_bmpDst != NULL )
	{
		//将源位图的为图数据拷贝到目标位图
		memcpy( (void *)m_clrDst,(void *)m_clrSrc,m_size.cx * m_size.cy * sizeof(COLORREF) );
		m_nType=0;
		//重会位图
		Invalidate();
	}
}

void CMirrorView::OnUpdateHorizontal(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
		pCmdUI->SetCheck( m_nType == 1);
}

void CMirrorView::OnUpdateVertical(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetCheck( m_nType == 2);
}

void CMirrorView::OnUpdateNormal(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetCheck( m_nType == 0 );
}

⌨️ 快捷键说明

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