www.pudn.com > Xread2.rar > Xread2View.cpp


// Xread2View.cpp : implementation of the CXread2View class 
// 
 
#include "stdafx.h" 
#include "Xread2.h" 
#include "ConvertDLG.h" 
#include "Xread2Doc.h" 
#include "Xread2View.h" 
#include "LChangDLG.h" 
#include "FilterDLG.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
#define DIB_HEADER_MARKER   ((WORD) ('M' << 8) | 'B') 
///////////////////////////////////////////////////////////////////////////// 
// CXread2View 
 
IMPLEMENT_DYNCREATE(CXread2View, CScrollView) 
 
BEGIN_MESSAGE_MAP(CXread2View, CScrollView) 
	//{{AFX_MSG_MAP(CXread2View) 
	ON_COMMAND(ID_CONVERT, OnConvert) 
	ON_COMMAND(ID_LINE_CHANG, OnLineChang) 
	ON_COMMAND(ID_SMOOTH, OnSmooth) 
	ON_COMMAND(ID_RUIHUA, OnRuihua) 
	ON_COMMAND(ID_RYSZ, OnRysz) 
	//}}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() 
 
///////////////////////////////////////////////////////////////////////////// 
// CXread2View construction/destruction 
 
CXread2View::CXread2View() 
{ 
	// TODO: add construction code here 
 
} 
 
CXread2View::~CXread2View() 
{ 
} 
 
BOOL CXread2View::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CScrollView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CXread2View drawing 
 
void CXread2View::OnDraw(CDC* pDC) 
{ 
		// 显示等待光标 
	BeginWaitCursor(); 
 
	CXread2Doc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc);                     // 
 
	// 获取DIB 
	HDIB hDIB = pDoc->GetHDIB(); 
	 
	// 判断DIB是否为空 
	if (hDIB != NULL) 
	{ 
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); 
		 
		// 获取DIB宽度 
		pDoc->m_width = (int) ::DIBWidth(lpDIB); 
		int cxDIB = (int) ::DIBWidth(lpDIB); 
		 
		// 获取DIB高度 
		pDoc->m_height = (int) ::DIBHeight(lpDIB); 
		int cyDIB = (int) ::DIBHeight(lpDIB); 
 
		::GlobalUnlock((HGLOBAL) hDIB); 
		 
		CRect rcDIB; 
		rcDIB.top = rcDIB.left =0; 
		rcDIB.right = cxDIB+rcDIB.top; 
		rcDIB.bottom = cyDIB+rcDIB.left; 
		 
		CRect rcDest; 
		rcDest = rcDIB; 
 
		// 定义滚动条的滚动范围 
		CSize csSroll; 
		csSroll.cx = rcDIB.right; 
		csSroll.cy = rcDIB.bottom; 
		SetScrollSizes(MM_TEXT, csSroll); 
 
		::PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(), 
			&rcDIB, pDoc->GetDocPalette()); 
	} 
	 
	// 恢复正常光标 
	EndWaitCursor(); 
} 
 
void CXread2View::OnInitialUpdate() 
{ 
	CScrollView::OnInitialUpdate(); 
 
	CSize sizeTotal; 
	// TODO: calculate the total size of this view 
	sizeTotal.cx = sizeTotal.cy = 100; 
	SetScrollSizes(MM_TEXT, sizeTotal); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CXread2View printing 
 
BOOL CXread2View::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CXread2View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CXread2View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CXread2View diagnostics 
 
#ifdef _DEBUG 
void CXread2View::AssertValid() const 
{ 
	CScrollView::AssertValid(); 
} 
 
void CXread2View::Dump(CDumpContext& dc) const 
{ 
	CScrollView::Dump(dc); 
} 
 
CXread2Doc* CXread2View::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CXread2Doc))); 
	return (CXread2Doc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CXread2View message handlers 
 
void CXread2View::OnConvert()  
{ 
	// TODO: Add your command handler code here 
		 
	CConvertDLG m_dlg; 
	m_dlg.m_width=1024; 
	m_dlg.m_height=1024; 
 
	if(m_dlg.DoModal()==IDOK)  
	{ 
	 
		UpdateData(true); 
	//	ConvertRawToBmp(m_dlg.m_RAW,m_dlg.m_BMP,m_dlg.m_width,m_dlg.m_height); 
		CFile file_raw,file_bmp; 
		CFileException fe; 
		HDIB m_hDIB; 
	     
		 
		if (!file_raw.Open(m_dlg.m_RAW, CFile::modeReadWrite | CFile::shareDenyNone|CFile::typeBinary, &fe)) 
		{ 
			return ; 
		} 
		DWORD	dwBitsSize = file_raw.GetLength(); 
		m_hDIB=(HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize); 
		if (m_hDIB== 0) 
		{ 
			return ; 
		} 
		LPSTR pDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB); 
		unsigned char*p; 
 
		p=(unsigned char *)pDIB; 
		for(int i=1;i<=m_dlg.m_height;i++) 
		{ 
 
			if(m_dlg.m_Color==0) 
				file_raw.Seek(m_dlg.m_width*(-i),CFile::end); 
			else 
				file_raw.Seek(m_dlg.m_width*3*(-i),CFile::end); 
 
			{ 
				if(m_dlg.m_Color==0) 
				{ 
					file_raw.Read(pDIB,sizeof(BYTE)*m_dlg.m_width); 
					pDIB+=m_dlg.m_width; 
				} 
				else 
				{ 
					file_raw.Read(pDIB,sizeof(BYTE)*3*m_dlg.m_width); 
					for(int j=0;j<3*m_dlg.m_width;j++) 
					{ 
						unsigned char tempR=*(pDIB+j); 
						unsigned char tempG=*(pDIB+j+1); 
						unsigned char tempB=*(pDIB+j+2); 
						*(pDIB+j+2)=tempB;  
                                                *(pDIB+j)=tempG;  
 	                                        *(pDIB+j+1)=tempR; 
					} 
					pDIB+=3*m_dlg.m_width; 
				} 
			} 
	 
		} 
		pDIB=(char *)p; 
 
		if (!file_bmp.Open(m_dlg.m_BMP, CFile::modeCreate|CFile::modeWrite |CFile::shareDenyNone, &fe)) 
		{ 
			return ; 
		} 
 
	/////////////////////////////////////////////////////////// 
	SetCursor(LoadCursor(NULL,IDC_WAIT)); 
 
	BITMAPFILEHEADER    bmfHdr;     // Header for Bitmap file  
 
	BITMAPINFOHEADER	bmpinfo;       // Pointer to DIB info structure  
 
    bmfHdr.bfType = DIB_HEADER_MARKER;  // "BM"  
	if(m_dlg.m_Color==0) 
	{ 
	    bmfHdr.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256+dwBitsSize; 
	    bmfHdr.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;  
	} 
 
	if(m_dlg.m_Color==1) 
	{ 
	    bmfHdr.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwBitsSize; 
	    bmfHdr.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);  
	} 
    bmfHdr.bfReserved1 = 0;  
    bmfHdr.bfReserved2 = 0;  
 
 
	//////////////////////////////////////////////////// 
	long bits=8*m_dlg.m_width; 
	bmpinfo.biHeight=m_dlg.m_height; 
    bmpinfo.biWidth=m_dlg.m_width; 
	bmpinfo.biSize=(DWORD)sizeof(BITMAPINFOHEADER);//40 
    bmpinfo.biPlanes=(WORD)1; 
	if(m_dlg.m_Color==0) 
		bmpinfo.biBitCount=(WORD)8;//8 
	if(m_dlg.m_Color==1) 
	    bmpinfo.biBitCount=(WORD)24;//24 
    bmpinfo.biCompression=BI_RGB; 
    bmpinfo.biSizeImage=WIDTHBYTES(bits)*m_dlg.m_height; 
    bmpinfo.biXPelsPerMeter=0; 
    bmpinfo.biYPelsPerMeter=0; 
    bmpinfo.biClrUsed=0;//256 
    bmpinfo.biClrImportant=0; 
 
 
	//////////////////////////////////////////////////// 
	RGBQUAD pPal[256]; 
 
	for( i=0;i<256;i++) 
	{ 
		pPal[i].rgbBlue=i; 
		pPal[i].rgbGreen=i; 
		pPal[i].rgbRed=i; 
		pPal[i].rgbReserved=0; 
	} 
	//////////////////////////////////////////////////// 
 
	//////////////////////////////////////////////////// 
	//---------------------------------------------------------------- 
	TRY 
	{ 
 
		file_bmp.Write(&bmfHdr, sizeof(BITMAPFILEHEADER)); 
		file_bmp.Write(&bmpinfo, sizeof(BITMAPINFOHEADER)); 
		if(m_dlg.m_Color==0) 
			file_bmp.Write(pPal, sizeof(RGBQUAD)*256); 
		file_bmp.WriteHuge(pDIB,dwBitsSize); 
 
	} 
	CATCH (CException, e) 
	{ 
        SetCursor(LoadCursor(NULL,IDC_ARROW));      
	    ::GlobalUnlock((HANDLE)m_hDIB); 
	    return; 
	} 
	END_CATCH 
       //------------------------------------------------------------ 
        file_bmp.Close(); 
	SetCursor(LoadCursor(NULL,IDC_ARROW));      
	::GlobalUnlock((HANDLE)m_hDIB); 
	return; 
   
	}	 
} 
 
void CXread2View::OnLineChang()  
{ 
	// TODO: Add your command handler code here 
	int max=255,min=0; 
	CLChangDLG m_dlgc; 
	if(m_dlgc.DoModal()==IDOK)  
	{ 
	CXread2Doc *pDoc=GetDocument(); 
	HDIB hDib=pDoc->m_hDIB; 
	if(hDib!=NULL) 
	{ 
	LPSTR lpdib=(LPSTR)GlobalLock((HGLOBAL)hDib); 
	int width=DIBWidth(lpdib); 
	int  height=DIBHeight(lpdib); 
	LPSTR lpDibBits=FindDIBBits(lpdib); 
	int bitcount=((LPBITMAPINFOHEADER)lpdib)->biBitCount; 
	if(bitcount==8) 
	{ 
		for(int i=0;im_hDIB; 
   if (hDIB==NULL)    
	   return; 
  LPSTR lpDIB=(LPSTR)GlobalLock((HGLOBAL)hDIB); 
   int width=DIBWidth(lpDIB); 
   int height=DIBHeight(lpDIB); 
  LPSTR lpDIBBits=FindDIBBits(lpDIB); 
  int bitcount=((LPBITMAPINFOHEADER)lpDIB)->biBitCount;		 
	// 给模板数组赋初值 
	PixelValue[0]=0.1; 
	PixelValue[1]=0.1; 
	PixelValue[2]=0.1; 
	PixelValue[3]=0.1; 
	PixelValue[4]=0.2; 
	PixelValue[5]=0.1; 
	PixelValue[6]=0.1; 
	PixelValue[7]=0.1; 
	PixelValue[8]=0.1; 
   LPSTR	lpNewDIBBits; 
	HLOCAL	hNewDIBBits; 
	unsigned char*	lpSrc; 
	unsigned char*	lpDst; 
    long   i,j,k,l; 
	double	fResult; 
	long lLineBytes= WIDTHBYTES(width*8); 
	hNewDIBBits = LocalAlloc(LHND, lLineBytes*height); 
	lpNewDIBBits = (char * )LocalLock(hNewDIBBits); 
	memcpy(lpNewDIBBits, lpDIBBits, lLineBytes * height); 
	for(i = iTempMY; i  255) 
			{ 
				* lpDst = 255; 
			} 
			else if(fResult<0)  fResult=0; 
			else 
			{ 
				* lpDst = (unsigned char) (fResult + 0.5); 
			} 
			 
		} 
	} 
	memcpy(lpDIBBits, lpNewDIBBits, lLineBytes*height); 
	LocalUnlock(hNewDIBBits); 
	LocalFree(hNewDIBBits); 
    //	return TRUE; 
	InvalidateRect(NULL,TRUE);	 
	 
} 
 
void CXread2View::OnRuihua()  
{ 
	// TODO: Add your command handler code here 
	 
	UpdateData(true); 
	 CXread2Doc* pDoc=GetDocument(); 
	int		iTempH; 
	int		iTempW; 
    int		iTempMX; 
	int		iTempMY; 
	double	PixelValue[9]; 
    HDIB hDIB; 
    hDIB=pDoc->m_hDIB; 
   if (hDIB==NULL)    
	   return; 
  LPSTR lpDIB=(LPSTR)GlobalLock((HGLOBAL)hDIB); 
   int width=DIBWidth(lpDIB); 
   int height=DIBHeight(lpDIB); 
  LPSTR lpDIBBits=FindDIBBits(lpDIB); 
  int bitcount=((LPBITMAPINFOHEADER)lpDIB)->biBitCount;		 
                     
	iTempW = 3;              // 拉普拉斯模板参数 
	iTempH = 3; 
 
	iTempMX = 1; 
	iTempMY = 1; 
	PixelValue[0] = -0.1; 
	PixelValue[1] = -0.1; 
	PixelValue[2] = -0.1; 
	PixelValue[3] = -0.1; 
	PixelValue[4] = 0.9; 
	PixelValue[5] = -0.1; 
	PixelValue[6] = -0.1; 
	PixelValue[7] = -0.1; 
	PixelValue[8] = -0.1; 
 
	LPSTR	lpNewDIBBits; 
	HLOCAL	hNewDIBBits; 
	unsigned char*	lpSrc; 
	unsigned char*	lpDst; 
    long   i,j,k,l; 
	double	fResult; 
	long lLineBytes= WIDTHBYTES(width*8); 
	hNewDIBBits = LocalAlloc(LHND, lLineBytes*height); 
	lpNewDIBBits = (char * )LocalLock(hNewDIBBits); 
	memcpy(lpNewDIBBits, lpDIBBits, lLineBytes * height); 
 
	for(i = iTempMY; i  255) 
			{ 
				* lpDst = 255; 
			} 
			else 
			{ 
				* lpDst = (unsigned char) (fResult + 0.5); 
			} 
			 
		} 
	} 
	memcpy(lpDIBBits, lpNewDIBBits, lLineBytes*height); 
	LocalUnlock(hNewDIBBits); 
	LocalFree(hNewDIBBits); 
    InvalidateRect(NULL,TRUE);	 
} 
 
void CXread2View::OnRysz()  
{ 
	// TODO: Add your command handler code here 
		// TODO: Add your command handler code here 
	CFilterDLG m_dlg; 
	m_dlg.m_Num1=0; 
	m_dlg.m_Num2=0; 
    m_dlg.m_Num3=0; 
    m_dlg.m_Num4=0; 
    m_dlg.m_Num5=0; 
	m_dlg.m_Num6=0; 
	m_dlg.m_Num7=0; 
	m_dlg.m_Num8=0; 
	m_dlg.m_Num9=0; 
 
 
	if(m_dlg.DoModal()==IDOK)  
	{ 
	UpdateData(true); 
	 CXread2Doc* pDoc=GetDocument(); 
	int		iTempH; 
	int		iTempW; 
    int		iTempMX; 
	int		iTempMY; 
	double	PixelValue[9]; 
    HDIB hDIB; 
    hDIB=pDoc->m_hDIB; 
   if (hDIB==NULL)    
	   return; 
  LPSTR lpDIB=(LPSTR)GlobalLock((HGLOBAL)hDIB); 
   int width=DIBWidth(lpDIB); 
   int height=DIBHeight(lpDIB); 
  LPSTR lpDIBBits=FindDIBBits(lpDIB); 
  int bitcount=((LPBITMAPINFOHEADER)lpDIB)->biBitCount;		 
                     
	iTempW = 3;               
	iTempH = 3; 
 
	iTempMX = 1; 
	iTempMY = 1; 
	PixelValue[0] = m_dlg.m_Num1; 
	PixelValue[1] = m_dlg.m_Num2; 
	PixelValue[2] = m_dlg.m_Num3; 
	PixelValue[3] = m_dlg.m_Num4; 
	PixelValue[4] = m_dlg.m_Num5; 
	PixelValue[5] = m_dlg.m_Num6; 
	PixelValue[6] = m_dlg.m_Num7; 
	PixelValue[7] = m_dlg.m_Num8; 
	PixelValue[8] = m_dlg.m_Num9; 
 
	LPSTR	lpNewDIBBits; 
	HLOCAL	hNewDIBBits; 
	unsigned char*	lpSrc; 
	unsigned char*	lpDst; 
    long   i,j,k,l; 
	double	fResult; 
	long lLineBytes= WIDTHBYTES(width*8); 
	hNewDIBBits = LocalAlloc(LHND, lLineBytes*height); 
	lpNewDIBBits = (char * )LocalLock(hNewDIBBits); 
	memcpy(lpNewDIBBits, lpDIBBits, lLineBytes * height); 
 
	for(i = iTempMY; i  255) 
			{ 
				* lpDst = 255; 
			} 
			else 
			{ 
				* lpDst = (unsigned char) (fResult + 0.5); 
			} 
			 
		} 
	} 
	memcpy(lpDIBBits, lpNewDIBBits, lLineBytes*height); 
	LocalUnlock(hNewDIBBits); 
	LocalFree(hNewDIBBits); 
    InvalidateRect(NULL,TRUE);	 
	} 
}