You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kev/Drawer/Module/GeoSigmaDraw/ItemCopyAsImage.cpp

175 lines
3.9 KiB
C++

1 month ago
#include "StdAfx.h"
#include "SigmaDoc.h"
#include "ItemCopyAsImage.h"
#include "HSimpleTracker.h"
#include "ItemExportFile.H"
#include "DCHelp.h"
namespace NItem
{
CItemCopyAsImage::CItemCopyAsImage(CSigmaDoc* ppDoc)
:CItem(ppDoc)
{
m_pTracker = new CHSimpleTracker();
this->SetType(ITEM_COPY_AS_IMAGE);
}
CItemCopyAsImage::~CItemCopyAsImage()
{
m_pTracker->Reset();
delete m_pTracker;
m_pTracker = NULL;
}
int CItemCopyAsImage::SetRange(CRect rect)
{
GetDoc()->SetCapturedScreenStatus(false);
if (rect.IsRectEmpty())
{
m_range.SetRectEmpty();
m_pTracker->Reset();
return -1;
}
m_range = rect;
m_pTracker->Create(m_pDoc, m_range);
CopySelectedToClipboard();
GetDoc()->SetCapturedScreenStatus(true);
return 1;
}
CHSimpleTracker * CItemCopyAsImage::GetTracker()
{
return m_pTracker;
}
void CItemCopyAsImage::OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
if (m_range.IsRectEmpty())
return;
m_pTracker->LButtonDown(point.x, point.y);
}
void CItemCopyAsImage::OnLButtonUp(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
if (m_range.IsRectEmpty())
return;
m_pTracker->LButtonUp(point.x, point.y, pDC);
if (m_range.IsRectEmpty() == false)
CopySelectedToClipboard();
}
int CItemCopyAsImage::OnMouseMove(CDC *pDC, UINT nFlags, CPoint point)
{
if (m_range.IsRectEmpty())
return 1;
CDC * pScreenDC = pDC;
DCHelp::ClearDC(pScreenDC, m_BackColor);
pScreenDC->BitBlt(0, 0, m_client.Width(), m_client.Height(), m_pBackGroundDC, 0, 0, SRCCOPY);
m_pTracker->MouseMove(pDC, point.x, point.y);
return 1;
}
void CItemCopyAsImage::OnDraw(CXyDC* pDC)
{
if (m_range.IsRectEmpty())
return;
m_pTracker->Draw(pDC->GetDC());
CopySelectedToClipboard();
GetDoc()->SetCapturedScreenStatus(true);
}
void CItemCopyAsImage::DrawAssistant(CDC * pDC, int mouseX, int mouseY)
{
m_pTracker->Draw(pDC);
}
bool CItemCopyAsImage::CopySelectedToClipboard()
{
CRect rect = m_pTracker->GetBoundRect();
if (rect.IsRectEmpty())
return false;
CRect8 realRect = GetDC()->GetReal(rect);
CopyToClipboard(realRect);
return true;
}
1 month ago
void CItemCopyAsImage::CopyToClipboard(CRect8 & rect, int nScale)
1 month ago
{
1 month ago
// <20><>ȡ 1:1 <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>
CRect rtFull = GetDC()->GetScreen(rect);
if (rtFull.IsRectEmpty()) return;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>ߴ<EFBFBD>
CSize szTarget(rtFull.Width() / nScale, rtFull.Height() / nScale);
if (szTarget.cx <= 0 || szTarget.cy <= 0) return;
1 month ago
1 month ago
// <20><>¼ԭʼƫ<CABC>Ʋ<EFBFBD>ƽ<EFBFBD><C6BD> DC <20><><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>ʼ<EFBFBD><CABC>
1 month ago
double dx = rect.left - GetDC()->left;
double dy = rect.top - GetDC()->top;
GetDC()->OffsetRect(dx, dy);
1 month ago
// <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> DC <20><><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
double oldScaleX = 0;
double oldScaleY = 0;
GetDC()->GetScale(oldScaleX, oldScaleY); // <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD>
GetDC()->SetScale(oldScaleX / nScale, oldScaleY/ nScale); // Ӧ<><D3A6><EFBFBD>±<EFBFBD><C2B1><EFBFBD>
// -------------------------------------
1 month ago
CItemExportFile ef(GetDoc());
1 month ago
// <20><><EFBFBD><EFBFBD> ExportImage <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD> Draw ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ DC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫͼ<C8AB><CDBC> szTarget <20>ߴ<EFBFBD><DFB4>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>
CMemoryDC* pmdc = ef.ExportImage(szTarget, 24);
1 month ago
if (pmdc)
{
pmdc->CopyToClipboard();
delete pmdc;
}
1 month ago
// <20>ָ<EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD>
GetDC()->SetScale(oldScaleX, oldScaleY);
1 month ago
GetDC()->OffsetRect(-dx, -dy);
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
void NItem::CItemCopyAsImage::CopyWindowToClipboard(CRect windowRect)
{
CRect8 rect = GetDC()->GetReal(windowRect);
CopyToClipboard(rect);
}
//<2F><>ȡȫͼ.<2E><EFBFBD><E0B5B1><EFBFBD><EFBFBD>ȫͼ<C8AB><CDBC><EFBFBD><EFBFBD>.<2E>ڽ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
1 month ago
void NItem::CItemCopyAsImage::CopyAllToClipboard(int nScale)
1 month ago
{
1 month ago
if (nScale <= 0) nScale = 1;
1 month ago
//<2F><><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>Ĵ<EFBFBD>С
CRect8 rect(1e100, -1e100, -1e100, 1e100);
GetDoc()->GetDrawRange(rect);
double dx = rect.Width();
double dy = rect.Height();
CSize sz(GetDC()->GetScreenWidth(dx), abs(GetDC()->GetScreenHeight(dy)));
if (dx < -1e20 || dy < -1e20)
{
AfxMessageBox("Map Range Error");
return;
}
1 month ago
CopyToClipboard(rect, nScale);
}
void CItemCopyAsImage::GetAllImageSize(int& width, int& height)
{
CRect8 rect(1e100, -1e100, -1e100, 1e100);
GetDoc()->GetDrawRange(rect);
CRect rt = GetDC()->GetScreen(rect);
width = rt.Width();
height = rt.Height();
1 month ago
}
} //end namespace