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

📄 imgcompressview.cpp

📁 这是一个对24位DIB位图进行行程压缩和解压的程序.功能完全
💻 CPP
字号:
// ImgCompressView.cpp : CImgCompressView 类的实现
//

#include "stdafx.h"
#include "ImgCompress.h"

#include "ImgCompressDoc.h"
#include "ImgCompressView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CImgCompressView

IMPLEMENT_DYNCREATE(CImgCompressView, CView)

BEGIN_MESSAGE_MAP(CImgCompressView, CView)
	ON_COMMAND(ID_IMGCODE_RLC, &CImgCompressView::OnImgcodeRlc)
	ON_COMMAND(ID_IMGCODE_ERLC, &CImgCompressView::OnImgcodeErlc)
	ON_UPDATE_COMMAND_UI(ID_IMGCODE_RLC, &CImgCompressView::OnUpdateImgcodeRlc)
	ON_UPDATE_COMMAND_UI(ID_IMGCODE_ERLC, &CImgCompressView::OnUpdateImgcodeErlc)
END_MESSAGE_MAP()

// CImgCompressView 构造/析构

CImgCompressView::CImgCompressView()
{
	// TODO: 在此处添加构造代码

}

CImgCompressView::~CImgCompressView()
{
}

BOOL CImgCompressView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改
	//  CREATESTRUCT cs 来修改窗口类或样式

	return CView::PreCreateWindow(cs);
}

// CImgCompressView 绘制

void CImgCompressView::OnDraw(CDC* pDC)
{
	CImgCompressDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	//显示位图
	BeginWaitCursor();
	
	HDIB hDIB=pDoc->GetHDIB();

	if (hDIB != NULL)
	{
		LPBYTE lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL) hDIB);
		
		// 获取DIB宽度
		int cxDIB = (int) pDoc->m_cDIB.DIBWidth(lpDIB);
		
		// 获取DIB高度
		int cyDIB = (int) pDoc->m_cDIB.DIBHeight(lpDIB);

		::GlobalUnlock((HGLOBAL) hDIB);
		
		CRect rcDIB;
		rcDIB.top = rcDIB.left = 0;
		rcDIB.right = cxDIB;
		rcDIB.bottom = cyDIB;
		
		// 输出DIB
		pDoc->m_cDIB.PaintDIB(pDC->m_hDC, &rcDIB, pDoc->GetHDIB(),
			&rcDIB, pDoc->GetDocPalette());

		EndWaitCursor();
	}
}


// CImgCompressView 诊断

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

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

CImgCompressDoc* CImgCompressView::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImgCompressDoc)));
	return (CImgCompressDoc*)m_pDocument;
}
#endif //_DEBUG


// CImgCompressView 消息处理程序

void CImgCompressView::OnImgcodeRlc()
{
	// TODO: 在此添加命令处理程序代码
	CImgCompressDoc *pDoc=GetDocument();

	CFileDialog fileDlg(FALSE, _T("*.PCX"), _T("*.PCX"), NULL, _T("PCX File (*.PCX) |*.PCX||"), this);
	fileDlg.m_ofn.Flags |= OFN_FILEMUSTEXIST;
	fileDlg.m_ofn.lpstrTitle = _T("保存为...");

	if (fileDlg.DoModal() == IDOK)
	{
		CCoding cCoding;
		cCoding.DIBToPCX(pDoc->GetHDIB(), fileDlg.GetPathName());
	}

}

void CImgCompressView::OnImgcodeErlc()
{
	// 创建新DIB
	HDIB hNewDIB = NULL;
	
	// 获取文档
	CImgCompressDoc* pDoc = GetDocument();

	// 选择打开文件
	CFileDialog fileDlg(TRUE, _T("*.PCX"), _T("*.PCX"), NULL, _T("PCX File (*.PCX)|*.PCX||"), this);
	fileDlg.m_ofn.Flags|=OFN_FILEMUSTEXIST;
	fileDlg.m_ofn.lpstrTitle=_T("File to load...");

	if (fileDlg.DoModal() == IDOK) 
	{
		// 获取文档
		CImgCompressDoc* pDoc = GetDocument();

		// 解压图象
		CCoding clsCoding;
		hNewDIB = clsCoding.PCXToDIB(fileDlg.GetPathName());

		// 判断处理是否成功
		if (hNewDIB != NULL)
		{		
			// 替换DIB,同时释放旧DIB对象
			pDoc->ReplaceHDIB(hNewDIB);

			// 更新DIB大小和调色板
			pDoc->InitDIBData();
		
			// 设置脏标记
			pDoc->SetModifiedFlag(TRUE);

			// 更新视图
			pDoc->UpdateAllViews(NULL);
		}
		else
		{
			// 提示用户
			MessageBox(_T("分配内存失败!"), _T("错误") , MB_ICONINFORMATION | MB_OK);
		}
	}
}

void CImgCompressView::OnUpdateImgcodeRlc(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	CImgCompressDoc* pDoc = GetDocument();
	pCmdUI->Enable(pDoc->GetHDIB()!=0);
}

void CImgCompressView::OnUpdateImgcodeErlc(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	CImgCompressDoc* pDoc = GetDocument();
	pCmdUI->Enable(pDoc->GetHDIB()!=0);
}

⌨️ 快捷键说明

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