📄 bmpdemoview.cpp
字号:
// bmpDemoView.cpp : implementation of the CBmpDemoView class
//
#include "stdafx.h"
#include "bmpDemo.h"
#include "bmpDemoDoc.h"
#include "bmpDemoView.h"
#include "memBitmap.h"
#include "mmsystem.h"
#include "stdio.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CBmpDemoView
IMPLEMENT_DYNCREATE(CBmpDemoView, CScrollView)
BEGIN_MESSAGE_MAP(CBmpDemoView, CScrollView)
//{{AFX_MSG_MAP(CBmpDemoView)
ON_COMMAND(ID_HCHANGE, OnHchange)
ON_WM_SIZE()
ON_COMMAND(ID_LARGEN, OnLargen)
ON_COMMAND(ID_LESSEN, OnLessen)
ON_COMMAND(ID_REVERT, OnRevert)
ON_COMMAND(ID_VCHANGE, OnVchange)
ON_COMMAND(ID_CW, OnCw)
ON_COMMAND(ID_CCW, OnCcw)
ON_COMMAND(ID_MODULE, OnModule)
ON_COMMAND(ID_GRAYIZE, OnGrayize)
ON_COMMAND(ID_HISTOGRAM, OnHistogram)
ON_COMMAND(ID_ZFTJHS, OnZftjhs)
ON_COMMAND(ID_BRIGHTEN, OnBrighten)
ON_COMMAND(ID_DARKEN, OnDarken)
ON_COMMAND(ID_DFT, OnDft)
ON_COMMAND(ID_NDFT, OnNdft)
ON_COMMAND(ID_FFT, OnFft)
ON_COMMAND(ID_NFFT, OnNfft)
ON_COMMAND(ID_HPFILTER, OnHpfilter)
ON_COMMAND(ID_LPFILTER, OnLpfilter)
ON_COMMAND(ID_BPFILTER, OnBpfilter)
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
ON_WM_MOUSEMOVE()
ON_COMMAND(ID_THPFILTER, OnThpfilter)
ON_COMMAND(ID_TLPFILTER, OnTlpfilter)
ON_COMMAND(ID_EXPHPFILTER, OnExphpfilter)
ON_COMMAND(ID_EXPLPFILTER, OnExplpfilter)
ON_COMMAND(ID_ENLARGE, OnEnlarge)
ON_UPDATE_COMMAND_UI(ID_NFFT, OnUpdateNfft)
ON_UPDATE_COMMAND_UI(ID_NDFT, OnUpdateNdft)
ON_WM_DESTROY()
ON_COMMAND(ID_IMAGEPROPERTY, OnImageproperty)
ON_COMMAND(ID_NEGATIVE, OnNegative)
ON_COMMAND(ID_SinNoise, OnSinNoise)
ON_COMMAND(ID_SlowChange, OnSlowChange)
ON_COMMAND(ID_ZhongZhiFilter, OnZhongZhiFilter)
ON_COMMAND(ID_GreyDuiShuBianHuan, OnGreyDuiShuBianHuan)
ON_COMMAND(ID_ROTATE, OnRotate)
ON_COMMAND(ID_RandomShow, OnRandomShow)
ON_WM_KEYDOWN()
ON_COMMAND(ID_TestFunction, OnTestFunction)
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CBmpDemoView construction/destruction
CBmpDemoView::CBmpDemoView()
{
// TODO: add construction code here
flag=FALSE;
ToolStatus=ARROW;
}
CBmpDemoView::~CBmpDemoView()
{
}
BOOL CBmpDemoView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CBmpDemoView drawing
void CBmpDemoView::OnDraw(CDC* pDC)
{
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect r;
GetClientRect(&r);
CPoint p=GetScrollPosition();
r.right+=p.x;
r.bottom+=p.y;
CBrush brush(RGB(0,0,0));
pDC->FillRect(&r,&brush);
int width=r.right-r.left;
int height=r.bottom-r.top;
OriX=width-pDoc->m_mViewBmp.GetWidth();
OriY=height-pDoc->m_mViewBmp.GetHeight();
OriX/=2;
OriY/=2;
OriX=OriX>0?OriX:0;
OriY=OriY>0?OriY:0;
pDoc->m_mViewBmp.Display(OriX,OriY,pDC);
/* OriX=width-pDoc->m_mBmp.GetDispWidth();
OriY=height-pDoc->m_mBmp.GetDispHeight();
OriX/=2;
OriY/=2;
OriX=OriX>0?OriX:0;
OriY=OriY>0?OriY:0;
pDoc->m_mBmp.Display(OriX,OriY,pDoc->m_mBmp.GetDispWidth(),pDoc->m_mBmp.GetDispHeight(),pDC);
*/
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CBmpDemoView printing
BOOL CBmpDemoView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CBmpDemoView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CBmpDemoView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CBmpDemoView diagnostics
#ifdef _DEBUG
void CBmpDemoView::AssertValid() const
{
CScrollView::AssertValid();
}
void CBmpDemoView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CBmpDemoDoc* CBmpDemoView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBmpDemoDoc)));
return (CBmpDemoDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CBmpDemoView message handlers
BOOL CBmpDemoView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
if(!CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext))
return FALSE;
return TRUE;
}
void CBmpDemoView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->GetPathName()=="\0")return;
int cx=pDoc->m_mBmp.GetDispWidth();
int cy=pDoc->m_mBmp.GetDispHeight();
CWnd *pwnd=GetParent();
CRect r1;
r1.left=0; r1.right=cx;
r1.top=0; r1.bottom=cy;
pwnd->CalcWindowRect(&r1,1);
int x1,y1;
x1=r1.right-r1.left+4;
y1=r1.bottom-r1.top+4;
CWnd *frame=pwnd->GetParent();
frame->GetClientRect(&r1);
x1=min(x1,(r1.right-r1.left)*2/3);
y1=min(y1,(r1.bottom-r1.top)*5/6);
pwnd->SetWindowPos(&wndTop,0,0,x1,y1,SWP_NOMOVE);
CSize size;
size.cx=cx-1;
size.cy=cy-1;
SetScrollSizes(MM_TEXT,size);
}
void CBmpDemoView::SetScroll()
{
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->GetPathName()=="\0")return;
int cx=pDoc->m_mBmp.GetDispWidth();
int cy=pDoc->m_mBmp.GetDispHeight();
CSize size;
size.cx=cx-1;
size.cy=cy-1;
SetScrollSizes(MM_TEXT,size);
}
void CBmpDemoView::OnHchange()
{
// TODO: Add your command handler code here
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnHchange();
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
}
void CBmpDemoView::OnSize(UINT nType, int cx, int cy)
{
ViewWidth=cx;
ViewHeight=cy;
CScrollView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
}
void CBmpDemoView::OnLargen()
{
// TODO: Add your command handler code here
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
BeginWaitCursor();
pDoc->m_mBmp.SetScale(1);
pDoc->m_mBmp.DataToView(pDoc->m_mViewBmp);
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
CStatusBar* pStatus=(CStatusBar*)
AfxGetApp()->m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR);
if(pStatus)
{
CString str;
int x=(int)(pDoc->m_mBmp.GetScale()*100);
str.Format("%i%%",x);
pStatus->SetPaneText(3,str);
}
EndWaitCursor();
}
void CBmpDemoView::OnLessen()
{
// TODO: Add your command handler code here
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
BeginWaitCursor();
pDoc->m_mBmp.SetScale(-1);
pDoc->m_mBmp.DataToView(pDoc->m_mViewBmp);
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
CStatusBar* pStatus=(CStatusBar*)
AfxGetApp()->m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR);
if(pStatus)
{
CString str;
int x=(int)(pDoc->m_mBmp.GetScale()*100);
str.Format("%i%%",x);
pStatus->SetPaneText(3,str);
}
EndWaitCursor();
}
void CBmpDemoView::OnRevert()
{
// TODO: Add your command handler code here
BeginWaitCursor();
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
float s=pDoc->m_mBmp.GetScale();
pDoc->OnRevert();
pDoc->m_mBmp.SetScale(s);
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
EndWaitCursor();
}
void CBmpDemoView::OnVchange()
{
// TODO: Add your command handler code here
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnVchange();
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
}
void CBmpDemoView::OnCw()
{
// TODO: Add your command handler code here
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnCw();
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
PlaySound("bounce.wav",NULL,SND_FILENAME);
}
void CBmpDemoView::OnCcw()
{
// TODO: Add your command handler code here
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnCcw();
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
}
void CBmpDemoView::OnModule()
{
// TODO: Add your command handler code here
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_ModuleDialog.DoModal()==IDOK)
{
BeginWaitCursor();
pDoc->OnModule();
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
EndWaitCursor();
}
}
void CBmpDemoView::OnGrayize()
{
// TODO: Add your command handler code here
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnGrayize();
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
}
void CBmpDemoView::OnHistogram()
{
// TODO: Add your command handler code here
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnHistogram();
class ZftDialog dlg1;
dlg1.DoModal();
}
void CBmpDemoView::OnZftjhs()
{
// TODO: Add your command handler code here
BeginWaitCursor();
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnZftjhs();
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
EndWaitCursor();
}
void CBmpDemoView::OnBrighten()
{
// TODO: Add your command handler code here
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnBrighten();
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
}
void CBmpDemoView::OnDarken()
{
// TODO: Add your command handler code here
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnDarken();
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
}
void CBmpDemoView::OnDft()
{
// TODO: Add your command handler code here
BeginWaitCursor();
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnDft();
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
EndWaitCursor();
/* CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//直接做DFT,为教学之用
BeginWaitCursor();
#define WIDTH 123 //定义图象宽度
#define HEIGHT 160 //定义图象高度
Complex Wn1[WIDTH]; //水平方向的变换核
Complex Wn2[HEIGHT]; //垂直方向的变换核
Complex InData[HEIGHT][WIDTH]; //图象
// Complex OutData[HEIGHT][WIDTH]; //变换结果
int i,j,k;
for(i=0;i<WIDTH;i++) //预先计算水平方向的变换核
{
Wn1[i].Re =cos(-2.0*PIE*i/WIDTH);
Wn1[i].Im =sin(-2.0*PIE*i/WIDTH);
}
for(i=0;i<HEIGHT;i++) //预先计算垂直方向的变换核
{
Wn2[i].Re =cos(-2.0*PIE*i/HEIGHT);
Wn2[i].Im =sin(-2.0*PIE*i/HEIGHT);
}
for(i=0;i<HEIGHT;i++) //图象灰度转为数据
for(j=0;j<WIDTH;j++)
{
COLORREF color=pDoc->m_mBmp.GetPixel(j,i);
double r=(double)GetRValue(color);
double g=(double)GetGValue(color);
double b=(double)GetBValue(color);
InData[i][j].Re =r*0.3+g*0.59+b*0.11;
InData[i][j].Im =0;
}
for(i=0;i<HEIGHT;i++) //频域移位半个周期
for(j=0;j<WIDTH;j++)
if((i+j)%2==1)InData[i][j]*=-1;
Complex temp1[WIDTH],temp2[WIDTH]; //暂时保存变换数据
for(k=0;k<HEIGHT;k++) //在水平方向上做一维DFT
{
for(i=0;i<WIDTH;i++) //取得指定行的数据
temp1[i]=InData[k][i];
for(i=0;i<WIDTH;i++) //对该行做一维DFT
{
temp2[i].Re=temp2[i].Im=0;
for(j=0;j<WIDTH;j++)
temp2[i]+=temp1[j]*Wn1[(i*j)%WIDTH];
}
for(i=0;i<WIDTH;i++) //变换结果写回二维矩阵
InData[k][i]=temp2[i]/sqrt(WIDTH);
}
Complex temp3[HEIGHT],temp4[HEIGHT]; //暂时保存变换数据
for(k=0;k<WIDTH;k++) //在垂直方向上做一维DFT
{
for(i=0;i<HEIGHT;i++) //取得指定列的数据
temp3[i]=InData[i][k];
for(i=0;i<HEIGHT;i++) //对该列做一维DFT
{
temp4[i].Re=temp4[i].Im=0;
for(j=0;j<HEIGHT;j++)
temp4[i]+=temp3[j]*Wn2[(i*j)%HEIGHT];
}
for(i=0;i<HEIGHT;i++) //变换结果写回二维矩阵
InData[i][k]=temp4[i]/sqrt(HEIGHT);
}
for(i=0;i<HEIGHT;i++) //数据化为图象
for(j=0;j<WIDTH;j++)
{
double temp=InData[i][j].abs();
if(temp>255)temp=255;
COLORREF c=RGB((BYTE)temp,(BYTE)temp,(BYTE)temp);
pDoc->m_mBmp.SetPixel(j,i,c);
}
CClientDC dc(this);
pDoc->m_mBmp.Display(0,0,&dc);
EndWaitCursor();
*/
}
void CBmpDemoView::OnNdft()
{
// TODO: Add your command handler code here
BeginWaitCursor();
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnNdft();
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
EndWaitCursor();
}
void CBmpDemoView::OnFft()
{
// TODO: Add your command handler code here
BeginWaitCursor();
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnFft();
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
EndWaitCursor();
}
void CBmpDemoView::OnNfft()
{
// TODO: Add your command handler code here
BeginWaitCursor();
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnNfft();
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
EndWaitCursor();
}
void CBmpDemoView::OnHpfilter()
{
// TODO: Add your command handler code here
FilterDialog dlg1;
dlg1.SetFlag(2);
if(dlg1.DoModal()==IDOK)
{
BeginWaitCursor();
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnHpfilter(dlg1.m_min);
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
EndWaitCursor();
}
}
void CBmpDemoView::OnLpfilter()
{
// TODO: Add your command handler code here
FilterDialog dlg1;
dlg1.SetFlag(1);
if(dlg1.DoModal()==IDOK)
{
BeginWaitCursor();
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnLpfilter(dlg1.m_max);
CRect r;
GetClientRect(&r);
SetScroll();
InvalidateRect(&r,TRUE);
UpdateWindow();
EndWaitCursor();
}
}
void CBmpDemoView::OnBpfilter()
{
// TODO: Add your command handler code here
FilterDialog dlg1;
dlg1.SetFlag(0);
if(dlg1.DoModal()==IDOK)
{
BeginWaitCursor();
CBmpDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->OnBpfilter(dlg1.m_min,dlg1.m_max);
CRect r;
GetClientRect(&r);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -