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);
}
}