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

📄 displaymodeview.cpp

📁 visual c++数字图像与图形处理中的光盘内容
💻 CPP
字号:
// DisplayModeView.cpp : implementation of the CDisplayModeView class
//

#include "stdafx.h"
#include "DisplayMode.h"

#include "DisplayModeDoc.h"
#include "DisplayModeView.h"
#include "ddb.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDisplayModeView

IMPLEMENT_DYNCREATE(CDisplayModeView,  CView)

BEGIN_MESSAGE_MAP(CDisplayModeView,  CView)
	//{{AFX_MSG_MAP(CDisplayModeView)
	ON_COMMAND(ID_FILE_SAVE,  OnFileSave)
	ON_WM_CREATE()
	ON_COMMAND(ID_FILE_SAVE_AS,  OnFileSaveAs)
	ON_MESSAGE(WM_DISPLAYCHANGE,  OnDisplayChange)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDisplayModeView construction/destruction

CDisplayModeView::CDisplayModeView()
{
	// TODO: add construction code here
	m_nWidth = 800;
	m_nHeight = 600;

}

CDisplayModeView::~CDisplayModeView()
{
	if(m_bitmap.GetSafeHandle())
		m_bitmap.DeleteObject();
}

BOOL CDisplayModeView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDisplayModeView drawing

void CDisplayModeView::OnDraw(CDC* pDC)
{
	CDisplayModeDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	
	CDib* pDib = pDoc->m_pDib;
	if(pDib)
	{
		
		//获取位图的宽度和高度
		m_nWidth = (int)pDib->GetWidth();
		m_nHeight = (int)pDib->GetHeight(); 
	
		//创建设备兼容位图
		CDC memDC;
		memDC.CreateCompatibleDC(pDC);
	
		CBitmap* pOldBitmap = memDC.SelectObject(&m_bitmap);
		pDib->Draw(memDC.m_hDC, 0, 0, m_nWidth, m_nHeight, 0, 0, m_nWidth, m_nHeight, DIB_RGB_COLORS, SRCCOPY);
		COLORREF textOldColor = memDC.SetTextColor(RGB(255, 0, 0));
		int nOldBkMode = memDC.SetBkMode(TRANSPARENT);
		memDC.TextOut(10, 10, "位图--------通向图像处理和图形设计的大门");
		
		pDC->BitBlt(0, 0, 800, 600, &memDC, 0, 0, SRCCOPY);

		memDC.SelectObject(pOldBitmap);
		memDC.SetTextColor(textOldColor);
		memDC.SetBkMode(nOldBkMode);
		
	}
	
}

/////////////////////////////////////////////////////////////////////////////
// CDisplayModeView diagnostics

#ifdef _DEBUG
void CDisplayModeView::AssertValid() const
{
	CView::AssertValid();
}

void CDisplayModeView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CDisplayModeDoc* CDisplayModeView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDisplayModeDoc)));
	return (CDisplayModeDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDisplayModeView message handlers
int CDisplayModeView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	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);
	int nOldBkMode = memDC.SetBkMode(TRANSPARENT);
	memDC.FillRect(rect, pBrush);

	memDC.SelectObject(pOldBitmap);
    delete pBrush;
	ReleaseDC(&dc);

	//将背景颜色置为灰色
	//::DeleteObject ((HBRUSH)::SetClassLong (m_hWnd,  GCL_HBRBACKGROUND, (long) (HBRUSH) ::GetStockObject (LTGRAY_BRUSH)));
	return 0;

}

void CDisplayModeView::OnFileSave() 
{
	// TODO: Add your command handler code here
	CFileDialog fileSaveDlg(FALSE, "*.bmp", "bit_24.bmp", 
					OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
					"Bitmap Files(*.bmp)", NULL);
	int nRespond = fileSaveDlg.DoModal();
	if(nRespond == IDOK)
	{
		CString filePath = fileSaveDlg.GetPathName();
		
		CDdb* pDdb = new CDdb(&m_bitmap);
		pDdb->Save(filePath, 0, 0, m_nWidth, m_nHeight);
		pDdb->ClearMemory();
	}
}


void CDisplayModeView::OnFileSaveAs() 
{
	// TODO: Add your command handler code here
	CFileDialog fileSaveDlg(FALSE, "*.bmp", "bit_8.bmp", 
					OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
					"256 Colors Bitmap Files(*.bmp)", NULL);
	int nRespond = fileSaveDlg.DoModal();
	if(nRespond == IDOK)
	{
		CString filePath = fileSaveDlg.GetPathName();
		
		CDdb* pDdb = new CDdb(&m_bitmap);
		pDdb->SaveAs256(filePath, 0, 0, m_nWidth, m_nHeight);
		pDdb->ClearMemory();
	
	}
}

LRESULT CDisplayModeView::OnDisplayChange (WPARAM which,  LPARAM lp) 
{

	LRESULT result = CView::OnDisplayChange (which,  lp);

	//对于16色显示模式, 我们不准备处理它
	if((which == 8) || (which == 16) || (which == 24) || (which == 32))
	{
		if(m_bitmap.GetSafeHandle())
		{
			m_bitmap.DeleteObject();

			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);
			memDC.SelectObject(pBrush);
			delete pBrush;
			ReleaseDC(&dc);
		}
	}

	Invalidate();
	return result;
}

⌨️ 快捷键说明

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