?? 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 + -