📄 imagefadetwoview.cpp
字号:
// ImageFadeTwoView.cpp : implementation of the CImageFadeTwoView class
//
#include "stdafx.h"
#include "ImageFadeTwo.h"
#include "ImageFadeTwoDoc.h"
#include "ImageFadeTwoView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "BorderRect.h"
#include "ImageProcess.h"
/////////////////////////////////////////////////////////////////////////////
// CImageFadeTwoView
IMPLEMENT_DYNCREATE(CImageFadeTwoView, CView)
BEGIN_MESSAGE_MAP(CImageFadeTwoView, CView)
//{{AFX_MSG_MAP(CImageFadeTwoView)
ON_WM_CREATE()
ON_COMMAND(IDM_BRUSH_FADE_IN, OnBrushFadeIn)
ON_UPDATE_COMMAND_UI(IDM_BRUSH_FADE_IN, OnUpdateBrushFadeIn)
ON_COMMAND(IDM_BRUSH_FADE_OUT, OnBrushFadeOut)
ON_UPDATE_COMMAND_UI(IDM_BRUSH_FADE_OUT, OnUpdateBrushFadeOut)
ON_COMMAND(IDM_BITMAP_FADE_IN, OnBitmapFadeIn)
ON_UPDATE_COMMAND_UI(IDM_BITMAP_FADE_IN, OnUpdateBitmapFadeIn)
ON_COMMAND(IDM_BITMAP_FADE_OUT, OnBitmapFadeOut)
ON_UPDATE_COMMAND_UI(IDM_BITMAP_FADE_OUT, OnUpdateBitmapFadeOut)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImageFadeTwoView construction/destruction
CImageFadeTwoView::CImageFadeTwoView()
{
// TODO: add construction code here
m_nWay = 0;
}
CImageFadeTwoView::~CImageFadeTwoView()
{
}
BOOL CImageFadeTwoView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CImageFadeTwoView drawing
void CImageFadeTwoView::OnDraw(CDC* pDC)
{
CImageFadeTwoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
BeginWaitCursor();
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = memDC.SelectObject(&m_bitmap);
CRect clientRect;
GetClientRect(&clientRect);
int cx = clientRect.Width();
int cy = clientRect.Height();
pDC->BitBlt(0, 0, cx, cy, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap);
EndWaitCursor();
FadeInOut(pDC);
}
/////////////////////////////////////////////////////////////////////////////
// CImageFadeTwoView diagnostics
#ifdef _DEBUG
void CImageFadeTwoView::AssertValid() const
{
CView::AssertValid();
}
void CImageFadeTwoView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CImageFadeTwoDoc* CImageFadeTwoView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageFadeTwoDoc)));
return (CImageFadeTwoDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CImageFadeTwoView message handlers
int CImageFadeTwoView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
//打开文件
CDib* pBackDib = new CDib("back.bmp");
if (!pBackDib->IsValid())
MessageBox("文件打开出错", "文件 \"back.bmp\"",
MB_OK | MB_ICONEXCLAMATION);
//
CClientDC dc(this);
m_bitmap.CreateCompatibleBitmap(&dc, 800, 600);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap* pOldBitmap = memDC.SelectObject(&m_bitmap);
CBrush* pBrush = new CBrush(RGB(255, 255, 255));
CRect rect(0, 0, 800, 600);
memDC.FillRect(rect, pBrush);
//绘制背景位图
if (pBackDib)
{
BYTE* pBackDibData = pBackDib->GetDibData();
LPBITMAPINFO pBackBmpInfo = pBackDib->GetBmpInfo();
int nWidth = (int)pBackDib->GetWidth();
int nHeight = (int)pBackDib->GetHeight();
StretchDIBits(memDC.m_hDC, 0, 0, nWidth, nHeight,
0, 0, nWidth, nHeight, pBackDibData, pBackBmpInfo,
DIB_RGB_COLORS, SRCCOPY);
}
memDC.SelectObject(pOldBitmap);
delete pBrush;
ReleaseDC(&dc);
if (pBackDib)
{
delete pBackDib;
pBackDib = NULL;
}
return 0;
}
void CImageFadeTwoView::Delay(DWORD ms)
{
DWORD time = GetTickCount();
do{;}while((GetTickCount() - time) < ms);
}
void CImageFadeTwoView::FadeInOut(CDC *pDC)
{
CImageFadeTwoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//第一步, 获取在文档中已经打开的位图
//获取外部DIB信息
CDib* pDib = pDoc->m_pDib;
if(!pDib)return;
int nWidth = (int)pDib->GetWidth();
int nHeight = (int)pDib->GetHeight();
CRect clientRect;
GetClientRect(&clientRect);
//左上角点
int cx = clientRect.Width();
int cy = clientRect.Height();
cx = (cx - nWidth) / 2;
cy = (cy - nHeight) / 2;
//绘制一个内嵌框
CBorderRect br(cx - 2, cy - 2, nWidth + 4, nHeight + 4);
br.SetBkColor(RGB(0, 0, 0));
br.Draw(pDC, FALSE);
//位图刷子淡入
if(m_nWay == 0)
{
HBRUSH ahBrush[16];
CreateBitmapBrush(pDC, ahBrush);
for(int i = 0;i < 16;i++)
{
CBrush* pBrush = new CBrush();
CBrush* pOldBrush = pDC->SelectObject(pBrush->FromHandle(ahBrush[i]));
pDib->Draw(pDC->m_hDC, cx, cy, nWidth, nHeight,
0, 0, nWidth, nHeight, DIB_RGB_COLORS, MERGECOPY);
pDC->SelectObject(pOldBrush);
delete pBrush;
Delay(30);
}
}
//位图刷子淡出
else if(m_nWay == 1)
{
HBRUSH ahBrush[16];
CreateBitmapBrush(pDC, ahBrush);
for(int i = 0;i < 16;i++)
{
CBrush* pBrush = new CBrush();
CBrush* pOldBrush = pDC->SelectObject(pBrush->FromHandle(ahBrush[(15 - i)]));
pDib->Draw(pDC->m_hDC, cx, cy, nWidth, nHeight,
0, 0, nWidth, nHeight, DIB_RGB_COLORS, MERGECOPY);
pDC->SelectObject(pOldBrush);
delete pBrush;
Delay(30);
}
CRect rect(cx, cy, (cx + nWidth - 1), (cy + nHeight - 1));
pDC->FillRect(rect, new CBrush(RGB(0, 0, 0)));
}
else if(m_nWay == 2)
{
HBITMAP ahBitmap[16];
CreateRandBitmap(pDC, ahBitmap);
for(int i = 0;i < 16;i++)
{
//申明内存设备
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC, nWidth, nHeight);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
//将图像绘制于内存设备
pDib->Draw(memDC.m_hDC, 0, 0, nWidth, nHeight,
0, 0, nWidth, nHeight, DIB_RGB_COLORS, SRCCOPY);
//将位图与结合起来
AndBitmap(&memDC, nWidth, nHeight, ahBitmap[i]);
pDC->BitBlt(cx, cy, nWidth, nHeight, &memDC, 0, 0, SRCCOPY);
bitmap.DeleteObject();
memDC.SelectObject(pOldBitmap);
Delay(30);
}
}
else
{
HBITMAP ahBitmap[16];
CreateRandBitmap(pDC, ahBitmap);
for(int i = 0;i < 16;i++)
{
//申明内存设备
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC, nWidth, nHeight);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
//将图像绘制于内存设备
pDib->Draw(memDC.m_hDC, 0, 0, nWidth, nHeight,
0, 0, nWidth, nHeight, DIB_RGB_COLORS, SRCCOPY);
//将位图与结合起来
AndBitmap(&memDC, nWidth, nHeight, ahBitmap[(15 - i)]);
pDC->BitBlt(cx, cy, nWidth, nHeight, &memDC, 0, 0, SRCCOPY);
bitmap.DeleteObject();
memDC.SelectObject(pOldBitmap);
Delay(30);
}
CRect rect(cx, cy, (cx + nWidth - 1), (cy + nHeight - 1));
pDC->FillRect(rect, new CBrush(RGB(0, 0, 0)));
}
}
//创建灰阶位图刷子,
//刷子大小为8 * 8像素
//一共16个刷子,
//这些具体的数据都是程序固定的, 因为刷子的大小总是固定的
void CImageFadeTwoView::CreateBitmapBrush(CDC* pDC, HBRUSH* phBrush)
{
int anIndex[64];
CreateRandSequence(anIndex, 64);
CImageProcess* ig = new CImageProcess();
BYTE* pbyBrush = new BYTE[256];
memset(pbyBrush, 0, 256);
for(int i = 0;i < 16;i++)
{
int nBase = 4 * i;
for(int j = 0;j < 4; j++)
{
BYTE* pbyTemp = pbyBrush;
int n = nBase + j;
pbyTemp += (4 * anIndex[n]);
*pbyTemp++ = 255;
*pbyTemp++ = 255;
*pbyTemp++ = 255;
}
HBITMAP hBitmap = ig->CreateDdb(pDC->m_hDC, 8, 8, pbyBrush);
phBrush[i] = CreatePatternBrush(hBitmap);
}//end i
delete ig;
delete[] pbyBrush;
}
//创建随机序列
//目前能产生的最大序列长度为32767
void CImageFadeTwoView::CreateRandSequence(int *pnArray, int nSize)
{
srand((unsigned)time(NULL));
int* pnRand = new int[nSize];
int i;
for(i = 0;i < nSize;i++) pnRand[i] = rand();
//最大随机数为RAND_MAX (now = 32767);
int nMaxRand = RAND_MAX + 1;
for(i = 0;i < nSize;i++)
{
int nIndex = 0;
int nMin = RAND_MAX;
for(int j = 0;j < nSize;j++)
{
if(pnRand[j] < nMin)
{
nIndex = j;
nMin = pnRand[j];
}
}
pnRand[nIndex] = nMaxRand;
pnArray[i] = nIndex;
}
delete[] pnRand;
}
//位图大小为 16 * 16
//位图
//共16幅
void CImageFadeTwoView::CreateRandBitmap(CDC *pDC, HBITMAP *phBitmap)
{
int anIndex[256];
CreateRandSequence(anIndex, 256);
CImageProcess* ig = new CImageProcess();
BYTE* pbyBitmap = new BYTE[1024];
memset(pbyBitmap, 0, 1024);
for(int i = 0;i < 16;i++)
{
int nBase = 16 * i;
for(int j = 0;j < 16; j++)
{
BYTE* pbyTemp = pbyBitmap;
int n = nBase + j;
pbyTemp += (4 * anIndex[n]);
*pbyTemp++ = 255;
*pbyTemp++ = 255;
*pbyTemp++ = 255;
}
phBitmap[i] = ig->CreateDdb(pDC->m_hDC, 16, 16, pbyBitmap);
}//end i
delete ig;
delete[] pbyBitmap;
}
//进行逻辑与运算
//pMemDC----内存设备
//nWidth, nHeight ----- 与内存设备绑定的设备相关位图的大小
//hBitmap总为一个16 * 16 大小的32位位图
void CImageFadeTwoView::AndBitmap(CDC *pMemDC, int nWidth, int nHeight, HBITMAP hBitmap)
{
//申明内存设备
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pMemDC, 16, 16);
CDC memDC;
memDC.CreateCompatibleDC(pMemDC);
HBITMAP hOldBitmap = (HBITMAP)memDC.SelectObject(hBitmap);
int nBlockWidth = (nWidth + 15) / 16;
int nBlockHeight = (nHeight + 15) / 16;
int y = 0;
for(int i = 0;i < nBlockHeight;i++)
{
int x = 0;
for(int j = 0;j < nBlockWidth;j++)
{
pMemDC->BitBlt(x, y, 16, 16, &memDC, 0, 0, SRCAND);
x += 16;
}
y += 16;
}
bitmap.DeleteObject();
memDC.SelectObject(hOldBitmap);
}
void CImageFadeTwoView::OnBrushFadeIn()
{
// TODO: Add your command handler code here
m_nWay = 0;
Invalidate();
}
void CImageFadeTwoView::OnUpdateBrushFadeIn(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_nWay == 0)
pCmdUI ->SetCheck(TRUE);
else
pCmdUI ->SetCheck(FALSE);
}
void CImageFadeTwoView::OnBrushFadeOut()
{
// TODO: Add your command handler code here
m_nWay = 1;
Invalidate();
}
void CImageFadeTwoView::OnUpdateBrushFadeOut(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_nWay == 1)
pCmdUI ->SetCheck(TRUE);
else
pCmdUI ->SetCheck(FALSE);
}
void CImageFadeTwoView::OnBitmapFadeIn()
{
// TODO: Add your command handler code here
m_nWay = 2;
Invalidate();
}
void CImageFadeTwoView::OnUpdateBitmapFadeIn(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_nWay == 2)
pCmdUI ->SetCheck(TRUE);
else
pCmdUI ->SetCheck(FALSE);
}
void CImageFadeTwoView::OnBitmapFadeOut()
{
// TODO: Add your command handler code here
m_nWay = 3;
Invalidate();
}
void CImageFadeTwoView::OnUpdateBitmapFadeOut(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_nWay == 3)
pCmdUI ->SetCheck(TRUE);
else
pCmdUI ->SetCheck(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -