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

📄 dlgimagescissor.cpp

📁 这是一款蛮COOL的图像处理系统
💻 CPP
字号:
// DlgImageScissor.cpp : implementation file
//

#include "stdafx.h"
#include "QuickImage.h"
#include "DlgImageScissor.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDlgImageScissor dialog


CDlgImageScissor::CDlgImageScissor(HDIB hDIB, CWnd* pParent /*=NULL*/)
	: CDialog(CDlgImageScissor::IDD, pParent), m_hDIB(hDIB)
{
	//{{AFX_DATA_INIT(CDlgImageScissor)
	m_iZoom = 1;
	m_ibrX = 0;
	m_ibrY = 0;
	m_itlX = 0;
	m_itlY = 0;
	//}}AFX_DATA_INIT

	m_iCorner = 0;
//	m_pPalette =new CPalette;
}


void CDlgImageScissor::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgImageScissor)
	DDX_Text(pDX, IDC_EDIT_ZOOM, m_iZoom);
	DDV_MinMaxUInt(pDX, m_iZoom, 1, 10);
	DDX_Text(pDX, IDC_EDIT_BR_X, m_ibrX);
	DDX_Text(pDX, IDC_EDIT_BR_Y, m_ibrY);
	DDX_Text(pDX, IDC_EDIT_TL_X, m_itlX);
	DDX_Text(pDX, IDC_EDIT_TL_Y, m_itlY);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgImageScissor, CDialog)
	//{{AFX_MSG_MAP(CDlgImageScissor)
	ON_WM_CTLCOLOR()
	ON_WM_PAINT()
	ON_EN_KILLFOCUS(IDC_EDIT_ZOOM, OnKillfocusEditZoom)
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
	ON_CONTROL_RANGE(EN_SETFOCUS, IDC_EDIT_TL_X, IDC_EDIT_BR_Y, OnEditsSetFocus)
	ON_CONTROL_RANGE(EN_KILLFOCUS, IDC_EDIT_TL_X, IDC_EDIT_BR_Y, OnEditsKillFocus)
	ON_CONTROL_RANGE(WM_LBUTTONDOWN, IDC_EDIT_TL_X, IDC_EDIT_BR_Y, OnEditsMouseUp)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgImageScissor message handlers

HBRUSH CDlgImageScissor::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	CWnd *pEdit = GetDlgItem(IDC_EDIT_ZOOM);
	ASSERT_VALID(pEdit);

	if(pEdit->m_hWnd == pWnd->m_hWnd)
	{
		CBrush b;
		COLORREF color = (COLORREF)::GetSysColor(COLOR_BTNFACE);
		b.CreateSolidBrush(color);
		CRect rc;
		pWnd->GetClientRect(&rc);
		pDC->FillRect(&rc,&b);
		pDC->SetBkColor(color);		
	}

	if(nCtlColor == CTLCOLOR_STATIC || nCtlColor == CTLCOLOR_EDIT)
		pDC->SetTextColor(RGB(0,96,249));

	// TODO: Return a different brush if the default is not desired
	return hbr;
}

BOOL CDlgImageScissor::OnInitDialog() 
{
	CDialog::OnInitDialog();

	m_btOK.SubclassDlgItem(IDOK, this);
	m_btOK.SetIcon(IDI_OKAC, IDI_OKUN);
	m_btOK.SetActiveBgColor(RGB(220,220,220));
	m_btOK.SetActiveFgColor(RGB(255,0,0));
	m_btOK.SetBtnCursor(IDC_GREEN);
	
	m_btCancel.SubclassDlgItem(IDCANCEL, this);
	m_btCancel.SetIcon(IDI_CANCELAC, IDI_CANCELUN);
	m_btCancel.SetActiveBgColor(RGB(220,220,220));
	m_btCancel.SetActiveFgColor(RGB(255,0,0));
	m_btCancel.SetBtnCursor(IDC_GREEN);
	
//	HDIB hDIB = GetDocument()->GetHDIB();
	if (m_hDIB != NULL)
	{
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);
		m_iWidth = (int) ::DIBWidth(lpDIB);         // Size of DIB - x
		m_iHeight = (int) abs(::DIBHeight(lpDIB));        // Size of DIB - y
		::GlobalUnlock((HGLOBAL) m_hDIB);

		if(m_itlX < 0)
		{
			m_itlX = 0;
		}
		if(m_itlY < 0)
		{
			m_itlY = 0;
		}
		if(m_ibrX > m_iWidth)
		{
			m_ibrX = m_iWidth;
		}
		if(m_ibrY > m_iHeight)
		{
			m_ibrY = m_iHeight;
		}

		if(m_iHeight > 0)
		{
			int iTemp = m_itlY;
			m_itlY = m_iHeight - m_ibrY;
			m_ibrY = m_iHeight - iTemp;
		}
		else
		{
			m_iHeight = -m_iHeight;
		}

		UpdateData(FALSE);
	}
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CDlgImageScissor::DrawAll()
{
	CWnd *pWnd = GetDlgItem(IDC_PIC_LARGE);
	ASSERT_VALID(pWnd);
	CDC *pDC = pWnd->GetDC();
	ASSERT_VALID(pDC);

	CRect rcDC;
	CPoint ptDCCent;
	pWnd->GetClientRect(&rcDC);
	ptDCCent = rcDC.CenterPoint();
	if(m_itlX < 0)m_itlX = 0;
	if(m_itlY < 0)m_itlY = 0;
	if(m_ibrX > m_iWidth)m_ibrX = m_iWidth;
	if(m_ibrY > m_iHeight)m_ibrY = m_iHeight;
	double dx = rcDC.Width() / double(m_ibrX - m_itlX)/2.0;
	double dy =rcDC.Height() / double(m_ibrY - m_itlY)/2.0;
	if(dx > dy)
	{
		rcDC.left = ptDCCent.x - long((m_ibrX - m_itlX)*dy);
		rcDC.right = ptDCCent.x + long((m_ibrX - m_itlX)*dy);
	}
	else
	{
		rcDC.top = ptDCCent.y - long((m_ibrY - m_itlY)*dx);
		rcDC.bottom = ptDCCent.y + long((m_ibrY - m_itlY)*dx);
	}
	
/*	CRect rcDC;
	GetClientRect(&rcDC);
	rcDC.left += 100;
	rcDC.right -= 100;
	rcDC.top += 50;
	rcDC.bottom -= 200;
*/	pDC->Rectangle(rcDC);
	::PaintDIB(pDC->GetSafeHdc(), rcDC, m_hDIB,
		CRect(m_itlX,m_itlY,m_ibrX,m_ibrY),NULL);
}

void CDlgImageScissor::DrawCorner()
{
	CWnd *pWnd = GetDlgItem(IDC_PIC_SMALL);
	ASSERT_VALID(pWnd);
	CDC *pDC = pWnd->GetDC();
	ASSERT_VALID(pDC);
		
	CRect rcDC, rcDIB;
	pWnd->GetClientRect(&rcDC);
	CPoint pt = rcDC.CenterPoint();
	
	int x, y;
	if(m_iCorner == 0)
	{
		x = m_itlX;
		y = m_ibrY;
	}
	else if(m_iCorner == 1)
	{
		x = m_ibrX;
		y = m_itlY;
	}

	int iHalf = int(rcDC.Width() / (double)m_iZoom / 2.0);
	rcDIB.left = x - iHalf;
	rcDIB.right = x + iHalf;
	iHalf = int(rcDC.Height() / (double)m_iZoom / 2.0);
	rcDIB.top = y - iHalf;
	rcDIB.bottom = y + iHalf;

	::PaintDIB(pDC->GetSafeHdc(), rcDC, m_hDIB, rcDIB, NULL);

	pDC->MoveTo(0, pt.y);
	pDC->LineTo(rcDC.Width(), pt.y);
	pDC->MoveTo(pt.x, 0);
	pDC->LineTo(pt.x, rcDC.Height());
}

void CDlgImageScissor::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	DrawAll();
	DrawCorner();
	
	// Do not call CDialog::OnPaint() for painting messages
}

void CDlgImageScissor::OnEditsSetFocus(UINT uID)
{
	CEdit *pEdit = (CEdit*)GetDlgItem(uID);
	ASSERT_VALID(pEdit);
	pEdit->SetSel(0,-1);

	switch(uID)
	{
	case IDC_EDIT_TL_X:
	case IDC_EDIT_TL_Y:
		m_iCorner = 0;
		DrawCorner();
		break;
	case IDC_EDIT_BR_X:
	case IDC_EDIT_BR_Y:
		m_iCorner = 1;
		DrawCorner();
		break;
	default:
		ASSERT(FALSE);
	}
}

void CDlgImageScissor::OnEditsKillFocus(UINT uID)
{
	CWnd *pWnd = GetDlgItem(IDC_PIC_LARGE);
	ASSERT_VALID(pWnd);
	CRect rcPic;
	pWnd ->GetClientRect(&rcPic);
	CDC *pDC = pWnd->GetDC();
	ASSERT_VALID(pDC);

	CBrush b;
	b.CreateSolidBrush((COLORREF)::GetSysColor(COLOR_BTNFACE));
	pDC->FillRect(rcPic, &b);
	UpdateData();
	DrawAll();
	DrawCorner();
}

void CDlgImageScissor::OnEditsMouseUp(UINT uID)
{
	CEdit *pEdit = (CEdit*)GetDlgItem(uID);
	ASSERT_VALID(pEdit);
	pEdit->SetSel(0,-1);
}

void CDlgImageScissor::OnKillfocusEditZoom() 
{
	UpdateData();
	DrawCorner();
}

void CDlgImageScissor::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CDialog::OnLButtonDown(nFlags, point);
}

void CDlgImageScissor::OnMouseMove(UINT nFlags, CPoint point) 
{
	CDialog::OnMouseMove(nFlags, point);
}

void CDlgImageScissor::OnLButtonUp(UINT nFlags, CPoint point) 
{
	CDialog::OnLButtonUp(nFlags, point);
}



⌨️ 快捷键说明

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