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

📄 imageboardview.cpp

📁 <精通Visual C++图像处理编程>源码 对于图像处理很有帮助
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		CRect rcInDib(m_rcClip);
		ClientToDib(rcInDib);

		// cut select rectangle in m_pDib
		m_pDib->CutRect(rcInDib);

		// empty current rectangle
		m_rcClip.SetRectEmpty();

		// document changed
		CDocument* pDoc = GetDocument();
		pDoc->SetModifiedFlag(TRUE);
	}
}

void CImageBoardView::MergeFloatDib()
{
	if (m_pFloatWnd)
	{
		CRect rc;
		m_pFloatWnd->GetWindowRect(&rc);
		CPoint point = rc.TopLeft();
		ScreenToClient(&point);
		ClientToDib(point);
		m_pDib->MergeDib(m_pFloatWnd->m_hDibFloat, point);
	
		// document changed
		CDocument* pDoc = GetDocument();
		pDoc->SetModifiedFlag(TRUE);
	}
	DeleteFloatWnd();
}

void CImageBoardView::DeleteFloatDib()
{
	// if selected rect is exist, cut it
	CutSelectedRect();
	// if float DIB window exist, delete it
	DeleteFloatWnd();
}

void CImageBoardView::CutFloatDib()
{
	// copy to clipboard first
	CopyToClipboard();
	// then delete
	DeleteFloatDib();
}

void CImageBoardView::CopyToClipboard()
{
	// Clean clipboard of contents, and copy the DIB/DDB/PAL.
	// Actual copy will occured in WM_RENDERALLFORMATS/WM_RENDERFORMAT
	if (OpenClipboard())
	{
		EmptyClipboard();

		HDIB hDib;
		HBITMAP hBitmap;
		HPALETTE hPalette;
		// if there is float dib, copy it
		if (m_pFloatWnd)
		{
			hDib = CopyHandle(m_pFloatWnd->m_hDibFloat);
			hBitmap = DIBToBitmap(m_pFloatWnd->m_hDibFloat, (HPALETTE)m_pDib->m_pPalette->GetSafeHandle());
			hPalette = CopyPalette((HPALETTE)m_pDib->m_pPalette->GetSafeHandle());
		}
		else	// otherwise, copy the entire DIB
		{
			hDib = CopyHandle(m_pDib->m_hDib);
			hBitmap = DIBToBitmap(m_pDib->m_hDib, (HPALETTE)m_pDib->m_pPalette->GetSafeHandle ());
			hPalette = CopyPalette((HPALETTE)m_pDib->m_pPalette->GetSafeHandle());
		}

		// set them to clipboard
		SetClipboardData(CF_DIB, hDib);
		SetClipboardData(CF_BITMAP, hBitmap);
		SetClipboardData(CF_PALETTE, hPalette);

		CloseClipboard();
	}
}

void CImageBoardView::Cut()
{
	// copy to clipboard first
	CopyToClipboard();
	// then delete
	Delete();
}

void CImageBoardView::Delete()
{
	if (m_pFloatWnd) // clip area
		DeleteFloatDib();
	else			// entire DIB
	{
		m_pDib->Destroy();
		// modify document flags
		CSize sizeTotal(0, 0);
		SetScrollSizes(MM_TEXT, sizeTotal);
		CDocument* pDoc = GetDocument();
		pDoc->UpdateAllViews(NULL);
		pDoc->SetModifiedFlag(TRUE);
	}
}

BOOL CImageBoardView::PasteDibFromClipboard()
{
	// get DIB handle from clipboard
	HDIB hNewDIB = NULL;
	if (OpenClipboard())
	{
		if (IsClipboardFormatAvailable(CF_DIB))
			hNewDIB = CopyHandle(GetClipboardData(CF_DIB));

		CloseClipboard();
	}
	if (hNewDIB == NULL)
		return FALSE;

	// if current DIB is empty, use the pasted one as current
	if (m_pDib->IsEmpty())
	{
		// create current DIB
		LPBYTE lpDIB = (LPBYTE)GlobalLock(hNewDIB);
		m_pDib->Create(lpDIB);
		GlobalUnlock(hNewDIB);
		GlobalFree(hNewDIB);

		// modify document flags
		CSize sizeTotal(m_pDib->GetWidth(), m_pDib->GetHeight());
		SetScrollSizes(MM_TEXT, sizeTotal);
		CDocument* pDoc = GetDocument();
		OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
		pDoc->UpdateAllViews(NULL);
		pDoc->SetModifiedFlag(TRUE);
	}
	else // put it in float DIB window
	{
		if (AdjustSize(hNewDIB))
		{
			// empty current rectangle
			m_rcClip.SetRectEmpty();
			CreateFloatWnd(hNewDIB, CPoint(0, 0));
		}
	}

	return TRUE;
}

BOOL CImageBoardView::PasteBitmapFromClipboard()
{
	// get DIB handle from clipboard
	HBITMAP hNewDDB = NULL;
	HPALETTE hPal = NULL;
	if (OpenClipboard())
	{
		if (IsClipboardFormatAvailable(CF_BITMAP))
			hNewDDB = (HBITMAP)GetClipboardData(CF_BITMAP);
		if (IsClipboardFormatAvailable(CF_PALETTE))
			hPal = (HPALETTE)GetClipboardData(CF_PALETTE);

		CloseClipboard();
	}
	if (hNewDDB == NULL)
		return FALSE;

	// if current DIB is empty, use the pasted one as current
	if (m_pDib->IsEmpty())
	{
		// create current DIB
		m_pDib->Create(hNewDDB, hPal);

		// modify document flags
		CSize sizeTotal(m_pDib->GetWidth(), m_pDib->GetHeight());
		SetScrollSizes(MM_TEXT, sizeTotal);
		CDocument* pDoc = GetDocument();
		OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
		pDoc->UpdateAllViews(NULL);
		pDoc->SetModifiedFlag(TRUE);
	}
	else // put it in float DIB window
	{
		// empty current rectangle
		m_rcClip.SetRectEmpty();
		HDIB hDib = BitmapToDIB(hNewDDB, (HPALETTE)m_pDib->m_pPalette->GetSafeHandle());
		if (AdjustSize(hDib))
		{
			HDIB hNewDib = ConvertDIBFormat(hDib, m_pDib->GetBitCount(), (HPALETTE)m_pDib->m_pPalette->GetSafeHandle());
			DestroyDIB(hDib);
			CreateFloatWnd(hNewDib, CPoint(0, 0));
		}
	}

	return TRUE;
}

BOOL CImageBoardView::PastePalFromClipboard()
{
	// egt DIB handle from clipboard
	HPALETTE hPal = NULL;
	if (OpenClipboard())
	{
		if (IsClipboardFormatAvailable(CF_PALETTE))
			hPal = (HPALETTE)GetClipboardData(CF_PALETTE);

		CloseClipboard();
	}
	if (hPal == NULL)
		return FALSE;

	// if current DIB is empty, do nothing
	if (m_pDib->IsEmpty())
		return FALSE;

	// get color bits
	int nEntries;
	WORD wBpp;
	GetObject(hPal, sizeof(int), &nEntries);
	if (nEntries > 16)
		wBpp = 8;
	else if (nEntries > 2)
		wBpp = 4;
	else
		wBpp = 1;

	// convert to new DIB
	HDIB hNewDib = ConvertDIBFormat(m_pDib->m_hDib, wBpp, hPal);
	if (! hNewDib)
		return FALSE;

	m_pDib->Destroy();
	// create current DIB
	LPBYTE lpDIB = (LPBYTE)GlobalLock(hNewDib);
	m_pDib->Create(lpDIB);
	GlobalUnlock(hNewDib);
	GlobalFree(hNewDib);
	// modify document flags
	CDocument* pDoc = GetDocument();
	OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
	pDoc->UpdateAllViews(NULL);
	pDoc->SetModifiedFlag(TRUE);

	return TRUE;
}

void CImageBoardView::SelectPaste(int nCF)
{
	switch(nCF)
	{
	case CF_DIB:
		PasteDibFromClipboard();
		return;
	case CF_BITMAP:
		PasteBitmapFromClipboard();
		return;
	case CF_PALETTE:
		PastePalFromClipboard();
		return;
	}
}

void CImageBoardView::Paste()
{
	if (! PasteDibFromClipboard())
		if (! PasteBitmapFromClipboard())
			PastePalFromClipboard();
}

LRESULT CImageBoardView::OnRealizePal(WPARAM wParam, LPARAM lParam)
{
	ASSERT(wParam != NULL);

	if (m_pDib->IsEmpty())
		return 0L;  // must be a new document

	CPalette* pPal = m_pDib->GetPalette();
	if (pPal != NULL)
	{
		CWnd* pAppFrame = AfxGetApp()->m_pMainWnd;

		CClientDC appDC(pAppFrame);
		// All views but one should be a background palette.
		// wParam contains a handle to the active view, so the SelectPalette
		// bForceBackground flag is FALSE only if wParam == m_hWnd (this view)
		CPalette* oldPalette = appDC.SelectPalette(pPal, ((HWND)wParam) != m_hWnd);

		if (oldPalette != NULL)
		{
			UINT nColorsChanged = appDC.RealizePalette();
			if (nColorsChanged > 0)
				GetDocument()->UpdateAllViews(NULL);
			appDC.SelectPalette(oldPalette, TRUE);
		}
		else
		{
			TRACE0("\tSelectPalette failed in CImageBoardView::OnPaletteChanged\n");
		}
	}

	return 0L;
}

void CImageBoardView::Rotate(double fAngle)
{
	if (m_pFloatWnd)
	{
		LPBYTE lpDIB = (LPBYTE)GlobalLock(m_pFloatWnd->m_hDibFloat);
		CDib dib;
		if (! dib.Create(lpDIB))
			return;
		GlobalUnlock(m_pFloatWnd->m_hDibFloat);
		if (fAngle == 90.0)
			dib.Rotate90();
		else if (fAngle == 180.0)
			dib.Rotate180();
		else if (fAngle == 270.0)
			dib.Rotate270();
		else
			dib.Rotate(fAngle, RGB(0,0,0));

		// get float window position
		CRect rcFloat;
		m_pFloatWnd->GetWindowRect(&rcFloat);
		CPoint ptTopLeft = rcFloat.TopLeft();
		ScreenToClient(&ptTopLeft);

		// delete old float window
		DeleteFloatWnd();
		CutSelectedRect();

		// create float window
			// get DIB width and height
		int nWidth  = (int)dib.GetWidth();
		int nHeight = (int)dib.GetHeight();
		CRect rc(ptTopLeft.x, ptTopLeft.y, ptTopLeft.x+nWidth, ptTopLeft.y+nHeight);
			// create it
		HDIB hDib = CopyHandle(dib.GetHandle());
		m_pFloatWnd	= new CFloatDibWnd(hDib, rc, this);
	}
	else	// otherwise, copy the entire DIB
	{
		if (fAngle == 90.0)
			m_pDib->Rotate90();
		else if (fAngle == 180.0)
			m_pDib->Rotate180();
		else if (fAngle == 270.0)
			m_pDib->Rotate270();
		else
			m_pDib->Rotate(fAngle, RGB(0,0,0));
	}
}

void CImageBoardView::Flip(int nDirection)
{
	if (m_pFloatWnd)
	{
		LPBYTE lpDIB = (LPBYTE)GlobalLock(m_pFloatWnd->m_hDibFloat);
		CDib dib;
		if (! dib.Create(lpDIB))
			return;
		GlobalUnlock(m_pFloatWnd->m_hDibFloat);
		switch (nDirection)
		{
		case MD_HORZ:
			dib.FlipHorz();
			break;
		case MD_VERT:
			dib.FlipVert();
			break;
		}

		// get float window position
		CRect rcFloat;
		m_pFloatWnd->GetWindowRect(&rcFloat);
		CPoint ptTopLeft = rcFloat.TopLeft();
		ScreenToClient(&ptTopLeft);

		// delete old float window
		DeleteFloatWnd();
		CutSelectedRect();

		// create float window
			// get DIB width and height
		int nWidth  = (int)dib.GetWidth();
		int nHeight = (int)dib.GetHeight();
		CRect rc(ptTopLeft.x, ptTopLeft.y, ptTopLeft.x+nWidth, ptTopLeft.y+nHeight);
			// create it
		HDIB hDib = CopyHandle(dib.GetHandle());
		m_pFloatWnd	= new CFloatDibWnd(hDib, rc, this);
	}
	else	// otherwise, copy the entire DIB
	{
		switch (nDirection)
		{
		case MD_HORZ:
			m_pDib->FlipHorz();
			break;
		case MD_VERT:
			m_pDib->FlipVert();
			break;
		}
	}
}

void CImageBoardView::Zoom(double fRatioX, double fRatioY)
{
	if (m_pFloatWnd)
	{
		LPBYTE lpDIB = (LPBYTE)GlobalLock(m_pFloatWnd->m_hDibFloat);
		CDib dib;
		if (! dib.Create(lpDIB))
			return;
		GlobalUnlock(m_pFloatWnd->m_hDibFloat);
		dib.Zoom(fRatioX, fRatioY);

		// get float window position
		CRect rcFloat;
		m_pFloatWnd->GetWindowRect(&rcFloat);
		CPoint ptTopLeft = rcFloat.TopLeft();
		ScreenToClient(&ptTopLeft);

		// delete old float window
		DeleteFloatWnd();
		CutSelectedRect();

		// create float window
			// get DIB width and height
		int nWidth  = (int)dib.GetWidth();
		int nHeight = (int)dib.GetHeight();
		CRect rc(ptTopLeft.x, ptTopLeft.y, ptTopLeft.x+nWidth, ptTopLeft.y+nHeight);
			// create it
		HDIB hDib = CopyHandle(dib.GetHandle());
		m_pFloatWnd	= new CFloatDibWnd(hDib, rc, this);
	}
	else	// otherwise, copy the entire DIB
	{
		m_pDib->Zoom(fRatioX, fRatioY);
	}
}

void CImageBoardView::ChangeImageSize(int nWidth, int nHeight)
{
	if (m_pFloatWnd)
	{
		LPBYTE lpDIB = (LPBYTE)GlobalLock(m_pFloatWnd->m_hDibFloat);
		CDib dib;
		if (! dib.Create(lpDIB))
			return;
		GlobalUnlock(m_pFloatWnd->m_hDibFloat);
		dib.ChangeImageSize(nWidth, nHeight);

		// get float window position
		CRect rcFloat;
		m_pFloatWnd->GetWindowRect(&rcFloat);
		CPoint ptTopLeft = rcFloat.TopLeft();
		ScreenToClient(&ptTopLeft);

		// delete old float window
		DeleteFloatWnd();
		CutSelectedRect();

		// create float window
			// get DIB width and height
		int nWidth  = (int)dib.GetWidth();
		int nHeight = (int)dib.GetHeight();
		CRect rc(ptTopLeft.x, ptTopLeft.y, ptTopLeft.x+nWidth, ptTopLeft.y+nHeight);
			// create it
		HDIB hDib = CopyHandle(dib.GetHandle());
		m_pFloatWnd	= new CFloatDibWnd(hDib, rc, this);
	}
	else	// otherwise, copy the entire DIB
	{
		m_pDib->ChangeImageSize(nWidth, nHeight);
	}
}

void CImageBoardView::ChangeCanvasSize(int nWidth, int nHeight, int nPosition)
{
	if (m_pFloatWnd)
	{
		LPBYTE lpDIB = (LPBYTE)GlobalLock(m_pFloatWnd->m_hDibFloat);
		CDib dib;
		if (! dib.Create(lpDIB))
			return;
		GlobalUnlock(m_pFloatWnd->m_hDibFloat);
		dib.ChangeCanvasSize(nWidth, nHeight, nPosition);

		// get float window position
		CRect rcFloat;
		m_pFloatWnd->GetWindowRect(&rcFloat);
		CPoint ptTopLeft = rcFloat.TopLeft();
		ScreenToClient(&ptTopLeft);

		// delete old float window
		DeleteFloatWnd();
		CutSelectedRect();

		// create float window
			// get DIB width and height
		int nWidth  = (int)dib.GetWidth();
		int nHeight = (int)dib.GetHeight();
		CRect rc(ptTopLeft.x, ptTopLeft.y, ptTopLeft.x+nWidth, ptTopLeft.y+nHeight);
			// create it
		HDIB hDib = CopyHandle(dib.GetHandle());
		m_pFloatWnd	= new CFloatDibWnd(hDib, rc, this);
	}
	else	// otherwise, copy the entire DIB
	{
		m_pDib->ChangeCanvasSize(nWidth, nHeight, nPosition);
	}
}

void CImageBoardView::Crop()
{
	if (! m_rcClip.IsRectEmpty())
	{
		m_pDib->Crop(m_rcClip);
		DeleteFloatWnd();
		m_rcClip.SetRectEmpty();
	}
}


HBRUSH CImageBoardView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CScrollView::OnCtlColor(pDC, pWnd, nCtlColor);
	
	if (pWnd->m_hWnd =

⌨️ 快捷键说明

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