📄 imagefadeoneview.cpp
字号:
// ImageFadeOneView.cpp : implementation of the CImageFadeOneView class
//
#include "stdafx.h"
#include "ImageFadeOne.h"
#include "ImageFadeOneDoc.h"
#include "ImageFadeOneView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "BorderRect.h"
#include "BrightnessProcess.h"
/////////////////////////////////////////////////////////////////////////////
// CImageFadeOneView
IMPLEMENT_DYNCREATE(CImageFadeOneView, CView)
BEGIN_MESSAGE_MAP(CImageFadeOneView, CView)
//{{AFX_MSG_MAP(CImageFadeOneView)
ON_WM_CREATE()
ON_COMMAND(IDM_FADE_IN, OnFadeIn)
ON_UPDATE_COMMAND_UI(IDM_FADE_IN, OnUpdateFadeIn)
ON_COMMAND(IDM_FADE_OUT, OnFadeOut)
ON_UPDATE_COMMAND_UI(IDM_FADE_OUT, OnUpdateFadeOut)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImageFadeOneView construction/destruction
CImageFadeOneView::CImageFadeOneView()
{
// TODO: add construction code here
m_nWay = 0;
}
CImageFadeOneView::~CImageFadeOneView()
{
}
BOOL CImageFadeOneView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CImageFadeOneView drawing
void CImageFadeOneView::OnDraw(CDC* pDC)
{
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);
}
/////////////////////////////////////////////////////////////////////////////
// CImageFadeOneView diagnostics
#ifdef _DEBUG
void CImageFadeOneView::AssertValid() const
{
CView::AssertValid();
}
void CImageFadeOneView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CImageFadeOneDoc* CImageFadeOneView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageFadeOneDoc)));
return (CImageFadeOneDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CImageFadeOneView message handlers
int CImageFadeOneView::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 CImageFadeOneView::Delay(DWORD ms)
{
DWORD time = GetTickCount();
do{;}while((GetTickCount() - time) < ms);
}
void CImageFadeOneView::FadeInOut(CDC *pDC)
{
CImageFadeOneDoc* 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);
////////////////////////////
// 32位颜色数据
DWORD dwSize = nWidth * nHeight * 4;
//分配全局内存 32位源数据
BYTE* pbyBitsSrc = new BYTE[dwSize];
if(pbyBitsSrc == NULL) return;
memset(pbyBitsSrc, 0, dwSize);
pDib->GetDdbData32(pbyBitsSrc);
//保存暂时结果
BYTE* pbyBitsTemp = new BYTE[dwSize];
if(pbyBitsTemp == NULL) return;
::CopyMemory(pbyBitsTemp, pbyBitsSrc, dwSize);
//亮度处理器
CBrightnessProcess* bp = new CBrightnessProcess();
bp->SetOperation(IMAGE_BRIGHTNESS_PERCENTAGE);
//淡入(m_nWay = 0)
if(m_nWay == 0)
{
for(int i = 10;i <= 100; i += 2)
{
bp->SetParam(i, 0, 255);
//获取数据后, 其基本参考点变为(0, 0).
bp->ChangeBrightness(pbyBitsTemp, 0, 0, nWidth, nHeight, nWidth, nHeight);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
HBITMAP hBitmap = bp->CreateDdb(pDC->m_hDC, nWidth, nHeight, pbyBitsTemp);
HBITMAP hOldBitmap = (HBITMAP)memDC.SelectObject(hBitmap);
pDC->BitBlt(cx, cy, nWidth, nHeight, &memDC, 0, 0, SRCCOPY);
::DeleteObject(hBitmap);
memDC.SelectObject(hOldBitmap);
Delay(5);
::CopyMemory(pbyBitsTemp, pbyBitsSrc, dwSize);
}
}
//淡出(m_nWay != 0)
else
{
for(int i = 100;i >= 0; i -= 2)
{
bp->SetParam(i, 0, 255);
//获取数据后, 其基本参考点变为(0, 0).
bp->ChangeBrightness(pbyBitsTemp, 0, 0, nWidth, nHeight, nWidth, nHeight);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
HBITMAP hBitmap = bp->CreateDdb(pDC->m_hDC, nWidth, nHeight, pbyBitsTemp);
HBITMAP hOldBitmap = (HBITMAP)memDC.SelectObject(hBitmap);
pDC->BitBlt(cx, cy, nWidth, nHeight, &memDC, 0, 0, SRCCOPY);
::DeleteObject(hBitmap);
memDC.SelectObject(hOldBitmap);
::CopyMemory(pbyBitsTemp, pbyBitsSrc, dwSize);
Delay(5);
}
}
delete bp;
delete[] pbyBitsSrc;
delete[] pbyBitsTemp;
}
void CImageFadeOneView::OnFadeIn()
{
// TODO: Add your command handler code here
m_nWay = 0;
Invalidate();
}
void CImageFadeOneView::OnUpdateFadeIn(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_nWay == 0)
pCmdUI ->SetCheck(TRUE);
else
pCmdUI ->SetCheck(FALSE);
}
void CImageFadeOneView::OnFadeOut()
{
// TODO: Add your command handler code here
m_nWay = 1;
Invalidate();
}
void CImageFadeOneView::OnUpdateFadeOut(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_nWay == 1)
pCmdUI ->SetCheck(TRUE);
else
pCmdUI ->SetCheck(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -