📄 ch1_1view.cpp
字号:
// ch1_1View.cpp : implementation of the CCh1_1View class//#include "stdafx.h"#include "ch1_1.h"#include "ch1_1Doc.h"#include "ch1_1View.h"#include "mainfrm.h"#include "DlgIntensity.h"#include "DlgLinerPara.h"#include "DlgPointThre.h"#include "DlgPointWin.h"#include "DlgPointStre.h"#include "DlgGeoTran.h"#include "DlgGeoZoom.h"#include "DlgGeoRota.h"#include "DlgSmooth.h"#include "DlgMidFilter.h"#include "DlgSharpThre.h"#include "DlgColor.h"#include "ColorTable.h"#include "cDlgMorphErosion.h"#include "cDlgMorphDilation.h"#include "cDlgMorphOpen.h"#include "cDlgMorphClose.h"#include "DlgHuffman.h"#include "DlgShannon.h"#include "DlgCodeGIF.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CCh1_1ViewIMPLEMENT_DYNCREATE(CCh1_1View, CScrollView)BEGIN_MESSAGE_MAP(CCh1_1View, CScrollView) //{{AFX_MSG_MAP(CCh1_1View) ON_WM_ERASEBKGND() ON_COMMAND(ID_EDIT_COPY, OnEditCopy) ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy) ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste) ON_COMMAND(ID_GEOM_TRAN, OnGeomTran) ON_COMMAND(ID_GEOM_MIRV, OnGeomMirv) ON_COMMAND(ID_GEOM_MIRH, OnGeomMirh) ON_COMMAND(ID_GEOM_ROTA, OnGeomRota) ON_COMMAND(ID_GEOM_TRPO, OnGeomTrpo) ON_COMMAND(ID_GEOM_ZOOM, OnGeomZoom) ON_COMMAND(ID_POINT_INVERT, OnPointInvert) ON_COMMAND(ID_POINT_EQUA, OnPointEqua) ON_COMMAND(ID_POINT_LINER, OnPointLiner) ON_COMMAND(ID_POINT_WIND, OnPointWind) ON_COMMAND(ID_VIEW_INTENSITY, OnViewIntensity) ON_COMMAND(ID_POINT_STRE, OnPointStre) ON_COMMAND(ID_FREQ_FOUR, OnFreqFour) ON_COMMAND(ID_FREQ_DCT, OnFreqDct) ON_COMMAND(ID_POINT_THRE, OnPointThre) ON_COMMAND(ID_ENHA_SMOOTH, OnEnhaSmooth) ON_COMMAND(ID_ENHA_MidianF, OnENHAMidianF) ON_COMMAND(ID_ENHA_SHARP, OnEnhaSharp) ON_COMMAND(ID_ENHA_COLOR, OnEnhaColor) ON_COMMAND(ID_FILE_256ToGray, OnFILE256ToGray) ON_COMMAND(ID_ENHA_GRADSHARP, OnEnhaGradsharp) ON_COMMAND(ID_FREQ_WALH, OnFreqWalh) ON_COMMAND(ID_CODE_HUFFMAN, OnCodeHuffman) ON_COMMAND(ID_CODE_RLE, OnCodeRLE) ON_COMMAND(ID_CODE_IRLE, OnCodeIRLE) ON_COMMAND(ID_CODE_JEPG, OnCodeJEPG) ON_COMMAND(ID_CODE_IJEPG, OnCodeIJEPG) ON_COMMAND(ID_CODE_SHANNON, OnCodeShannon) ON_COMMAND(ID_MORPH_EROSION, OnMorphErosion) ON_COMMAND(ID_MORPH_DILATION, OnMorphDilation) ON_COMMAND(ID_MORPH_OPEN, OnMorphOpen) ON_COMMAND(ID_MORPH_CLOSE, OnMorphClose) ON_COMMAND(ID_MORPH_THINING, OnMorphThining) ON_COMMAND(ID_EDGE_FILL, OnEdgeFill) ON_COMMAND(ID_EDGE_GAUSS, OnEdgeGauss) ON_COMMAND(ID_EDGE_HOUGH, OnEdgeHough) ON_COMMAND(ID_EDGE_KIRSCH, OnEdgeKirsch) ON_COMMAND(ID_EDGE_PREWITT, OnEdgePrewitt) ON_COMMAND(ID_EDGE_ROBERT, OnEdgeRobert) ON_COMMAND(ID_EDGE_SOBEL, OnEdgeSobel) ON_COMMAND(ID_EDGE_TRACE, OnEdgeTrace) ON_COMMAND(ID_DETECT_HPROJECTION, OnDetectHprojection) ON_COMMAND(ID_DETECT_MINUS, OnDetectMinus) ON_COMMAND(ID_DETECT_TEMPLATE, OnDetectTemplate) ON_COMMAND(ID_DETECT_THRESHOLD, OnDetectThreshold) ON_COMMAND(ID_DETECT_VPROJECTION, OnDetectVprojection) ON_COMMAND(ID_RESTORE_BLUR, OnRestoreBlur) ON_COMMAND(ID_RESTORE_INVERSE, OnRestoreInverse) ON_COMMAND(ID_RESTORE_NOISEBLUR, OnRestoreNoiseblur) ON_COMMAND(ID_RESTORE_RANDOMNOISE, OnRestoreRandomnoise) ON_COMMAND(ID_RESTORE_SALTNOISE, OnRestoreSaltnoise) ON_COMMAND(ID_RESTORE_WIENER, OnRestoreWiener) ON_COMMAND(ID_EDGE_CONTOUR, OnEdgeContour) ON_COMMAND(ID_CODE_LZW, OnCodeLzw) ON_COMMAND(ID_CODE_ILZW, OnCodeIlzw) ON_COMMAND(ID_EDGE_FILL2, OnEdgeFill2) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCh1_1View construction/destructionCCh1_1View::CCh1_1View(){ // TODO: add construction code here}CCh1_1View::~CCh1_1View(){}BOOL CCh1_1View::PreCreateWindow(CREATESTRUCT& cs){ // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////////////////// CCh1_1View drawingvoid CCh1_1View::OnDraw(CDC* pDC){ // 显示等待光标 BeginWaitCursor(); // 获取文档 CCh1_1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // 获取DIB HDIB hDIB = pDoc->GetHDIB(); // 判断DIB是否为空 if (hDIB != NULL) { LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); // 获取DIB宽度 int cxDIB = (int) ::DIBWidth(lpDIB); // 获取DIB高度 int cyDIB = (int) ::DIBHeight(lpDIB); ::GlobalUnlock((HGLOBAL) hDIB); CRect rcDIB; rcDIB.top = rcDIB.left = 0; rcDIB.right = cxDIB; rcDIB.bottom = cyDIB; CRect rcDest; // 判断是否是打印 if (pDC->IsPrinting()) { // 是打印,计算输出图像的位置和大小,以便符合页面 // 获取打印页面的水平宽度(象素) int cxPage = pDC->GetDeviceCaps(HORZRES); // 获取打印页面的垂直高度(象素) int cyPage = pDC->GetDeviceCaps(VERTRES); // 获取打印机每英寸象素数 int cxInch = pDC->GetDeviceCaps(LOGPIXELSX); int cyInch = pDC->GetDeviceCaps(LOGPIXELSY); // 计算打印图像大小(缩放,根据页面宽度调整图像大小) rcDest.top = rcDest.left = 0; rcDest.bottom = (int)(((double)cyDIB * cxPage * cyInch) / ((double)cxDIB * cxInch)); rcDest.right = cxPage; // 计算打印图像位置(垂直居中) int temp = cyPage - (rcDest.bottom - rcDest.top); rcDest.bottom += temp/2; rcDest.top += temp/2; } else // 非打印 { // 不必缩放图像 rcDest = rcDIB; } // 输出DIB ::PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(), &rcDIB, pDoc->GetDocPalette()); } // 恢复正常光标 EndWaitCursor(); }/////////////////////////////////////////////////////////////////////////////// CCh1_1View printingBOOL CCh1_1View::OnPreparePrinting(CPrintInfo* pInfo){ // 设置总页数为一。 pInfo->SetMaxPage(1); return DoPreparePrinting(pInfo);}void CCh1_1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){ // TODO: add extra initialization before printing}void CCh1_1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){ // TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////////////////// CCh1_1View diagnostics#ifdef _DEBUGvoid CCh1_1View::AssertValid() const{ CView::AssertValid();}void CCh1_1View::Dump(CDumpContext& dc) const{ CView::Dump(dc);}CCh1_1Doc* CCh1_1View::GetDocument() // non-debug version is inline{ ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCh1_1Doc))); return (CCh1_1Doc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CCh1_1View message handlersBOOL CCh1_1View::OnEraseBkgnd(CDC* pDC) { // 主要是为了设置子窗体默认的背景色 // 背景色由文档成员变量m_refColorBKG指定 // 获取文档 CCh1_1Doc* pDoc = GetDocument(); // 创建一个Brush CBrush brush(pDoc->m_refColorBKG); // 保存以前的Brush CBrush* pOldBrush = pDC->SelectObject(&brush); // 获取重绘区域 CRect rectClip; pDC->GetClipBox(&rectClip); // 重绘 pDC->PatBlt(rectClip.left, rectClip.top, rectClip.Width(), rectClip.Height(), PATCOPY); // 恢复以前的Brush pDC->SelectObject(pOldBrush); // 返回 return TRUE;}LRESULT CCh1_1View::OnDoRealize(WPARAM wParam, LPARAM){ ASSERT(wParam != NULL); // 获取文档 CCh1_1Doc* pDoc = GetDocument(); // 判断DIB是否为空 if (pDoc->GetHDIB() == NULL) { // 直接返回 return 0L; } // 获取Palette CPalette* pPal = pDoc->GetDocPalette(); if (pPal != NULL) { // 获取MainFrame CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd; ASSERT_KINDOF(CMainFrame, pAppFrame); 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) pDoc->UpdateAllViews(NULL); appDC.SelectPalette(oldPalette, TRUE); } else { TRACE0("\tCCh1_1View::OnPaletteChanged中调用SelectPalette()失败!\n"); } } return 0L;}void CCh1_1View::OnInitialUpdate() { CView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the base class }void CCh1_1View::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) { CScrollView::OnInitialUpdate(); ASSERT(GetDocument() != NULL); SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());}void CCh1_1View::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView){ CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView); if (bActivate) { ASSERT(pActivateView == this); OnDoRealize((WPARAM)m_hWnd, 0); // same as SendMessage(WM_DOREALIZE); }}void CCh1_1View::OnEditCopy() { // 复制当前图像 // 获取文档 CCh1_1Doc* pDoc = GetDocument(); // 打开剪贴板 if (OpenClipboard()) { // 更改光标形状 BeginWaitCursor(); // 清空剪贴板 EmptyClipboard(); // 复制当前图像到剪贴板 SetClipboardData (CF_DIB, CopyHandle((HANDLE) pDoc->GetHDIB()) ); // 关闭剪贴板 CloseClipboard(); // 恢复光标 EndWaitCursor(); }}void CCh1_1View::OnEditPaste() { // 粘贴图像 // 创建新DIB HDIB hNewDIB = NULL; // 打开剪贴板 if (OpenClipboard()) { // 更改光标形状 BeginWaitCursor(); // 读取剪贴板中的图像 hNewDIB = (HDIB) CopyHandle(::GetClipboardData(CF_DIB)); // 关闭剪贴板 CloseClipboard(); // 判断是否读取成功 if (hNewDIB != NULL) { // 获取文档 CCh1_1Doc* pDoc = GetDocument(); // 替换DIB,同时释放旧DIB对象 pDoc->ReplaceHDIB(hNewDIB); // 更新DIB大小和调色板 pDoc->InitDIBData(); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 重新设置滚动视图大小 SetScrollSizes(MM_TEXT, pDoc->GetDocSize()); // 实现新的调色板 OnDoRealize((WPARAM)m_hWnd,0); // 更新视图 pDoc->UpdateAllViews(NULL); } // 恢复光标 EndWaitCursor(); }}void CCh1_1View::OnUpdateEditCopy(CCmdUI* pCmdUI) { // 如果当前DIB对象不空,复制菜单项有效 pCmdUI->Enable(GetDocument()->GetHDIB() != NULL);}void CCh1_1View::OnUpdateEditPaste(CCmdUI* pCmdUI) { // 如果当前剪贴板中有DIB对象,粘贴菜单项有效 pCmdUI->Enable(::IsClipboardFormatAvailable(CF_DIB));}void CCh1_1View::OnViewIntensity() { // 查看当前图像灰度直方图 // 获取文档 CCh1_1Doc* pDoc = GetDocument(); // 指向DIB的指针 LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推) if (::DIBNumColors(lpDIB) != 256) { // 提示用户 MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 返回 return; } // 更改光标形状 BeginWaitCursor(); // 创建对话框 CDlgIntensity dlgPara; // 初始化变量值 dlgPara.m_lpDIBBits = lpDIBBits; dlgPara.m_lWidth = ::DIBWidth(lpDIB); dlgPara.m_lHeight = ::DIBHeight(lpDIB); dlgPara.m_iLowGray = 0; dlgPara.m_iUpGray = 255; // 显示对话框,提示用户设定平移量 if (dlgPara.DoModal() != IDOK) { // 返回 return; } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); }//////////////////////////////////////////////////////////////////////////////////////// 图像点运算//void CCh1_1View::OnPointInvert() { // 图像反色 // 获取文档 CCh1_1Doc* pDoc = GetDocument(); // 指向DIB的指针 LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 线性变换的斜率 FLOAT fA; // 线性变换的截距 FLOAT fB; // 反色操作的线性变换的方程是-x + 255 fA = -1.0; fB = 255.0; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的反色,其它的可以类推) if (::DIBNumColors(lpDIB) != 256) { // 提示用户 MessageBox("目前只支持256色位图的反色!", "系统提示" , MB_ICONINFORMATION | MB_OK); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 返回 return; } // 更改光标形状 BeginWaitCursor(); // 调用LinerTrans()函数反色 LinerTrans(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), fA, fB); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); }void CCh1_1View::OnPointLiner() { // 线性变换 // 获取文档 CCh1_1Doc* pDoc = GetDocument(); // 指向DIB的指针 LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 创建对话框 CDlgLinerPara dlgPara; // 线性变换的斜率 FLOAT fA; // 线性变换的截距 FLOAT fB; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的线性变换,其它的可以类推) if (::DIBNumColors(lpDIB) != 256) { // 提示用户 MessageBox("目前只支持256色位图的线性变换!", "系统提示" , MB_ICONINFORMATION | MB_OK); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 返回 return; } // 初始化变量值 dlgPara.m_fA = 2.0; dlgPara.m_fB = -128.0; // 显示对话框,提示用户设定平移量 if (dlgPara.DoModal() != IDOK) { // 返回 return; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -