📄 imagespreadview.cpp
字号:
// ImageSpreadView.cpp : implementation of the CImageSpreadView class
//
#include "stdafx.h"
#include "ImageSpread.h"
#include "ImageSpreadDoc.h"
#include "ImageSpreadView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "BorderRect.h"
#include "ImageSpreadDialog.h"
/////////////////////////////////////////////////////////////////////////////
// CImageSpreadView
IMPLEMENT_DYNCREATE(CImageSpreadView, CView)
BEGIN_MESSAGE_MAP(CImageSpreadView, CView)
//{{AFX_MSG_MAP(CImageSpreadView)
ON_WM_CREATE()
ON_COMMAND(IDM_SPREAD_WAY, OnSpreadWay)
ON_UPDATE_COMMAND_UI(IDM_SPREAD_WAY, OnUpdateSpreadWay)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImageSpreadView construction/destruction
CImageSpreadView::CImageSpreadView()
{
// TODO: add construction code here
m_nWay = left_right;
}
CImageSpreadView::~CImageSpreadView()
{
}
BOOL CImageSpreadView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CImageSpreadView drawing
void CImageSpreadView::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();
SpreadInto(pDC);
}
/////////////////////////////////////////////////////////////////////////////
// CImageSpreadView diagnostics
#ifdef _DEBUG
void CImageSpreadView::AssertValid() const
{
CView::AssertValid();
}
void CImageSpreadView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CImageSpreadDoc* CImageSpreadView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageSpreadDoc)));
return (CImageSpreadDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CImageSpreadView message handlers
int CImageSpreadView::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 CImageSpreadView::Delay(DWORD ms)
{
DWORD time = GetTickCount();
do{;}while((GetTickCount() - time) < ms);
}
void CImageSpreadView::SpreadInto(CDC *pDC)
{
CImageSpreadDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//第一步, 获取在文档中已经打开的位图
//获取外部DIB信息
CDib* pDib = pDoc->m_pDib;
if(!pDib)return;
int nWidth = (int)pDib->GetWidth();
int nHeight = (int)pDib->GetHeight();
//第二步, 将位图绘制到内存设备
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap ddb;
ddb.CreateCompatibleBitmap(pDC, nWidth, nHeight);
CBitmap* pOldBitmap = memDC.SelectObject(&ddb);
//把整个位图绘制到内存,
//更快的办法是将图像直接绘制到pDC
pDib->Draw(memDC.m_hDC, 0, 0, nWidth, nHeight,
0, 0, nWidth, nHeight, DIB_RGB_COLORS, SRCCOPY);
//第三步, 从内存设备中读出位图
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.Draw(pDC, FALSE);
//创建剪切区域
// CRgn rgn;
// rgn.CreateRectRgn(cx, cy, cx + nWidth, cy + nHeight);
// pDC->SelectClipRgn(&rgn, RGN_COPY);
//绘制坐标步长,
int nStepX, nStepY;
//求出宽度和高度的最大者
if(nWidth >= nHeight)
{
nStepX = 10;
nStepY = (int)(10.0f * ((float)nHeight / (float)nWidth) + 0.5f);
}
else
{
nStepY = 10;
nStepX = (int)(10.0f * ((float)nWidth / (float)nHeight) + 0.5f);
}
switch(m_nWay)
{
//从左渐铺至右
//
case left_right:
{
for(int x = cx; x < (cx + nWidth + 10);x += 10)
{
pDC->BitBlt(x, cy, 10, nHeight, &memDC, (x - cx), 0, SRCCOPY);
Delay(20);
}
break;
}
//从右渐铺至左
case right_left:
{
for(int x = (cx + nWidth + 10); x > (cx - 10); x -= 10)
{
pDC->BitBlt(x, cy, 10, nHeight, &memDC, (x - cx), 0, SRCCOPY);
Delay(20);
}
break;
}
//从上渐铺至下
case top_bottom:
{
for(int y = cy; y < (cy + nHeight + 10);y += 10)
{
pDC->BitBlt(cx, y, nWidth, 10, &memDC, 0, (y - cy), SRCCOPY);
Delay(20);
}
break;
}
//从下渐铺至上
case bottom_top:
{
for(int y = (cy + nHeight + 10); y > (cy - 10); y -= 10)
{
pDC->BitBlt(cx, y, nWidth, 10, &memDC, 0, (y - cy), SRCCOPY);
Delay(20);
}
break;
}
//从左上渐铺至右下
case topLeft_bottomRight:
{
for(int w = nStepX, h = nStepY;w < (nWidth + nStepX); w += nStepX, h += nStepY)
{
pDC->BitBlt(cx, cy, w, h, &memDC, 0, 0, SRCCOPY);
Delay(20);
}
break;
}
//从右下渐铺至左上
case bottomRight_topLeft:
{
for(int w = nStepX, h = nStepY;w < (nWidth + nStepX); w += nStepX, h += nStepY)
{
pDC->BitBlt((cx + nWidth - w), (cy + nHeight - h), w, h, &memDC, (nWidth - w), (nHeight - h), SRCCOPY);
Delay(20);
}
break;
}
//从右上渐铺至左下
case topRight_bottomLeft:
{
for(int w = nStepX, h = nStepY;w < (nWidth + nStepX); w += nStepX, h += nStepY)
{
pDC->BitBlt((cx + nWidth - w), cy, w, h, &memDC, (nWidth - w), 0, SRCCOPY);
Delay(20);
}
break;
}
//从左下渐铺至右上
case bottomLeft_topRight:
{
for(int w = nStepX, h = nStepY;w < (nWidth + nStepX); w += nStepX, h += nStepY)
{
pDC->BitBlt(cx, (cy + nHeight - h), w, h, &memDC, 0, (nHeight - h), SRCCOPY);
Delay(20);
}
break;
}
}
ddb.DeleteObject();
memDC.SelectObject(pOldBitmap);
// rgn.DeleteObject();
// pDC->SelectClipRgn(NULL, RGN_COPY);
}
void CImageSpreadView::OnSpreadWay()
{
// TODO: Add your command handler code here
CImageSpreadDialog dlg;
dlg.m_nWay = m_nWay;
int responeDlg = dlg.DoModal();
if(responeDlg == IDOK)
{
m_nWay = dlg.m_nWay;
Invalidate();
}
}
void CImageSpreadView::OnUpdateSpreadWay(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -