⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linjunjuanview.cpp

📁 图像处理软件,功能比较基础
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// linjunjuanView.cpp : implementation of the CLinjunjuanView class
//

#include "stdafx.h"
#include "linjunjuan.h"

#include "linjunjuanDoc.h"
#include "linjunjuanView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#ifndef CMAINFRAME_H
#define CMAINFRAME_H
#include "MainFrm.h"
#endif
/////////////////////////////////////////////////////////////////////////////
// CLinjunjuanView
int left,up;


IMPLEMENT_DYNCREATE(CLinjunjuanView, CScrollView)

BEGIN_MESSAGE_MAP(CLinjunjuanView, CScrollView)
	//{{AFX_MSG_MAP(CLinjunjuanView)
	ON_WM_SETFOCUS()
	ON_WM_KILLFOCUS()
	ON_WM_DESTROY()
	ON_WM_CREATE()
	ON_COMMAND(ID_BRIGHT_CONTRAST, OnBrightContrast)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_COMMAND(ID_COPY, OnCopy)
	ON_COMMAND(IDC_PASTE, OnPaste)
	ON_COMMAND(ID_CHECKCLIP, OnCheckclip)
	ON_COMMAND(ID_IMAGE_SELECTRECT, OnImageSelectrect)
	ON_UPDATE_COMMAND_UI(ID_IMAGE_SELECTRECT, OnUpdateImageSelectrect)
	ON_COMMAND(ID_IMAGE_REVERSE, OnImageReverse)
	ON_WM_VSCROLL()
	ON_WM_HSCROLL()
	ON_UPDATE_COMMAND_UI(ID_COPY, OnUpdateCopy)
	ON_COMMAND(IDM_SEE_PIXEL, OnSeePixel)
	ON_WM_TIMER()
	ON_COMMAND(ID_DIG_1000, OnDig1000)
	ON_UPDATE_COMMAND_UI(IDM_SEE_PIXEL, OnUpdateSeePixel)
	ON_COMMAND(IDM_DRAW_LINE, OnDrawLine)
	ON_WM_LBUTTONDBLCLK()
	ON_UPDATE_COMMAND_UI(ID_DIG_1000, OnUpdateDig1000)
	ON_COMMAND(IDM_PRODUCE_MASK, OnProduceMask)
	ON_COMMAND(IDM_AIR_DRAW, OnAirDraw)
	ON_COMMAND(IDM_ALL_DRAW, OnAllDraw)
	//}}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)
	ON_MESSAGE(WM_HOTKEY,OnHotKey)//加入热键响应函数 
	ON_MESSAGE(WM_GOODBYE,OnGoodBye)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLinjunjuanView construction/destruction

CLinjunjuanView::CLinjunjuanView()
{
	flagfresh=TRUE;
	fBlocking=FALSE;
	fValidBox=FALSE;
	rectSelect=FALSE;
	left=0;
	up=0;
	m_pDlgexit=1;
	m_pDlg = new CPixel(this);
	fCircling=FALSE;
	first=TRUE;
	fShowCircling=FALSE;
	drawmark=FALSE;
	drawmark_all=FALSE;
	

}

CLinjunjuanView::~CLinjunjuanView()
{
	delete m_pDlg;


}

BOOL CLinjunjuanView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

    	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CLinjunjuanView drawing
void CLinjunjuanView::OnInitial()
{
	
	int row,col;
	CSize sizeTotal;	
	CLinjunjuanDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);	
	row =  (int)(pDoc->orgpic.row*pDoc->rate);
	col =  (int)(pDoc->orgpic.col*pDoc->rate);	
	sizeTotal.cx =col;
	sizeTotal.cy =row;
	SetScrollSizes(MM_TEXT, sizeTotal);
	if(theApp.m_Pot.x > DX) theApp.m_Pot = CPoint(10,10);
	int cx = sizeTotal.cx + sm_cxframe;
	int cy = sizeTotal.cy + sm_cyframe;
	cx = (cx > DX) ? DX:cx; 
	cy = (cy > DY) ? DY:cy;
	

	GetParentFrame()->MoveWindow( CRect(theApp.m_Pot , CSize(cx,cy)) , TRUE );
	
	
}

void CLinjunjuanView::OnDraw(CDC* pDC)
{
	CBitmap bitmap;
	CDC memDC;
	HPALETTE hPal=NULL;
	HPALETTE hOldPal=NULL;	
	CLinjunjuanDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	
	if (pDoc->flagpic)
	{
		if(pDoc->flagsmall_big)
		{
			OnInitial();						
			flagfresh=TRUE;
			pDoc->flagsmall_big=FALSE;
		}
		if (pDoc->anotherflag==FALSE)
		{
			if(flagfresh)
			{
				pic=pDoc->Org();
				rectdest.left=rectdest.top=rectdib.left=rectdib.top=0;
				rectdib.right=pic.col;
				rectdib.bottom=pic.row;
				rectdest.bottom=(int)(pic.row*pDoc->rate);
				rectdest.right=(int)(pic.col*pDoc->rate);			
				flagfresh=FALSE;
				pPal=pDoc->GetDocPalette();
				hDib=pDoc->GetHDIB();
			}		
			PaintDIB(pDC->m_hDC,&rectdest,hDib,&rectdib,pPal);	
		}
		else
		{
			pPal=pDoc->GetDocPalette();
			if (pPal != NULL)
			{
				hPal = (HPALETTE) pPal->m_hObject;
				hOldPal =SelectPalette(pDC->m_hDC, hPal, TRUE);
				//  RealizePalette(hDC);
			}
/*		
			RECT rect;
HBRUSH hBrush;
for (int i=0;i<65;i++)
{
	rect.left=i*100/64;
	rect.top=0;
	rect.right=(i+1)*100/64;
	rect.bottom=90;
	hBrush =CreateSolidBrush(PALETTEINDEX(i));	
	FillRect(pDC->m_hDC,&rect,hBrush);
	DeleteObject(hBrush);
}*/

			bitmap.CreateCompatibleBitmap(pDC,pDoc->orgpic.row,pDoc->orgpic.col);
			memDC.CreateCompatibleDC(pDC);
			memDC.SelectObject(&bitmap);
			for(int i=0;i<pDoc->orgpic.row;i++)
				for(int j=0;j<pDoc->orgpic.col;j++)
					memDC.SetPixel(j,i,RGB(pDoc->orgpic.p[i][j],pDoc->orgpic.p[i][j],pDoc->orgpic.p[i][j]));	
				pDC->BitBlt(0,0,pDoc->orgpic.row,pDoc->orgpic.col,&memDC,0,0,SRCCOPY);

  if (hOldPal != NULL)
				{
					::SelectPalette(pDC->m_hDC, hOldPal,TRUE);
					//	GetPaletteEntries(::SelectPalette(hDC, hOldPal,TRUE),0,1,tty);
				}
		}
	}
	if(fBlocking)
	{
		CPen newPen(PS_DOT,1,(COLORREF)0);
		pDC->SetROP2(R2_NOT);
		CPen* pOldPen=pDC->SelectObject(&newPen);
		pDC->SelectObject(GetStockObject(HOLLOW_BRUSH));
		pDC->Rectangle(ptBeg.x+GetScrollPos(SB_HORZ),ptBeg.y+GetScrollPos(SB_VERT),ptEnd.x+GetScrollPos(SB_HORZ),ptEnd.y+GetScrollPos(SB_VERT));
		pDC->SelectObject(pOldPen);
	}
	if(fValidBox)
	{		
		CPen newPen(PS_DOT,1,(COLORREF)0);
		CPen* pOldPen=pDC->SelectObject(&newPen);
		pDC->SelectObject(GetStockObject(HOLLOW_BRUSH));
		pDC->Rectangle(ptBoxBeg.x+GetScrollPos(SB_HORZ),ptBoxBeg.y+GetScrollPos(SB_VERT),ptBoxEnd.x+GetScrollPos(SB_HORZ),ptBoxEnd.y+GetScrollPos(SB_VERT));
		pDC->SelectObject(pOldPen);
	}
	if(fCircling)
	{
	
			CPen newPen(PS_SOLID,8,(RGB(255,0,0)));
			CPen* pOldPen=pDC->SelectObject(&newPen);					
			pDC->SelectObject(GetStockObject(HOLLOW_BRUSH));
			pDC->SetROP2(R2_NOT);
			pDC->Ellipse(ptEllipseBeg1.x+left,ptEllipseBeg1.y+up,ptEllipseEnd1.x+left,ptEllipseEnd1.y+up);
			pDC->Ellipse(ptEllipseBeg2.x+left,ptEllipseBeg2.y+up,ptEllipseEnd2.x+left,ptEllipseEnd2.y+up);	
			pDC->SelectObject(pOldPen);
		
	}
	if(fShowCircling)
		{
			CPen newPen(PS_SOLID,3,(RGB(255,0,0)));
			CPen* pOldPen=pDC->SelectObject(&newPen);						
			pDC->SelectObject(GetStockObject(HOLLOW_BRUSH));		
			pDC->Ellipse(ptEllipseBeg1.x,ptEllipseBeg1.y,ptEllipseEnd1.x,ptEllipseEnd1.y);
			pDC->Ellipse(ptEllipseBeg2.x,ptEllipseBeg2.y,ptEllipseEnd2.x,ptEllipseEnd2.y);				
			pDC->SelectObject(pOldPen);
		}
	if(drawmark)
	{
		pDC->SelectObject(GetStockObject(HOLLOW_BRUSH));		
		
		CPen newPen(PS_SOLID,1,(RGB(255,255,255)));
		CPen* pOldPen=pDC->SelectObject(&newPen);						
		pDC->Rectangle(markfirst1.x,markfirst1.y,markfirst1.x+128,markfirst1.y+128);			
		pDC->SelectObject(pOldPen);

		CPen newPen2(PS_SOLID,1,(RGB(0,0,0)));
		pOldPen=pDC->SelectObject(&newPen2);						
		pDC->Rectangle(markfirst2.x,markfirst2.y,markfirst2.x+128,markfirst2.y+128);			
		pDC->SelectObject(pOldPen);
		CPen newPen3(PS_SOLID,1,(RGB(255,0,0)));
		pOldPen=pDC->SelectObject(&newPen3);						
		pDC->Rectangle(markfirst3.x,markfirst3.y,markfirst3.x+128,markfirst3.y+128);			
		pDC->SelectObject(pOldPen);
	}
	if(drawmark_all)
	{
		pDC->SelectObject(GetStockObject(HOLLOW_BRUSH));		
		
		CPen newPen(PS_SOLID,1,(RGB(255,255,255)));
		CPen* pOldPen=pDC->SelectObject(&newPen);						
		pDC->Rectangle(markfirst_all.x,markfirst_all.y,markfirst_all.x+82,markfirst_all.y+51);			
		pDC->SelectObject(pOldPen);
	}
}

void CLinjunjuanView::OnInitialUpdate()
{
	
	CScrollView::OnInitialUpdate();
	int row,col;
	CSize sizeTotal;
	
	CLinjunjuanDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
    sm_cxmaximized=GetSystemMetrics(SM_CXMAXIMIZED);
	sm_cymaximized=GetSystemMetrics(SM_CYMAXIMIZED);
	DX = sm_cxmaximized - 100 ;
	DY = sm_cymaximized - 100 ;
	if (pDoc->flagpic)
	{
	row =  (int)(pDoc->orgpic.row*pDoc->rate);
	col =  (int)(pDoc->orgpic.col*pDoc->rate);
	}
	else 
	{
		row=100;
		col=100;
	}
	// TODO: calculate the total size of this view
	sizeTotal.cx =col;
	sizeTotal.cy =row;
	SetScrollSizes(MM_TEXT, sizeTotal);
	if(theApp.m_Pot.x > DX) theApp.m_Pot = CPoint(10,10);
	sm_cxframe=3*GetSystemMetrics(SM_CXFRAME);
	sm_cyframe=GetSystemMetrics(SM_CYMIN) + GetSystemMetrics(SM_CYFRAME);
	int cx = sizeTotal.cx + sm_cxframe;
	int cy = sizeTotal.cy + sm_cyframe;
	cx = (cx > DX) ? DX:cx; 
	cy = (cy > DY) ? DY:cy;
	GetParentFrame()->MoveWindow( CRect(theApp.m_Pot , CSize(cx,cy)) , TRUE );
}




/////////////////////////////////////////////////////////////////////////////
// CLinjunjuanView printing

BOOL CLinjunjuanView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CLinjunjuanView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CLinjunjuanView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CLinjunjuanView diagnostics

#ifdef _DEBUG
void CLinjunjuanView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CLinjunjuanView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CLinjunjuanDoc* CLinjunjuanView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLinjunjuanDoc)));
	return (CLinjunjuanDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CLinjunjuanView message handlers


void CLinjunjuanView::OnSetFocus(CWnd* pOldWnd) 
{
	CScrollView::OnSetFocus(pOldWnd);
	
	CLinjunjuanDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CMainFrame * pMainfrm = (CMainFrame*) AfxGetMainWnd();
	CStatusBar * pStatus = &pMainfrm->m_wndStatusBar;

	if( !pDoc->flagpic ) 	return ;
	int row = pDoc->orgpic.row;
	int col = pDoc->orgpic.col;
	CString rowtmp,coltmp;
	rowtmp.Format("行: %d",row);
	coltmp.Format("列: %d",col);	


	CString tmp;
	tmp = pStatus->GetPaneText(3); // index of ID_INDICATOR_ROW
	tmp = pStatus->GetPaneText(4); // index of ID_INDICATOR_COL
	tmp = pStatus->GetPaneText(1); // index of ID_INDICATOR_X 
	tmp = pStatus->GetPaneText(2); // index of ID_INDICATOR_Y 

	pStatus->SetPaneText( 3 , rowtmp, TRUE);
	pStatus->SetPaneText( 4 , coltmp, TRUE);
	pStatus->SetPaneText( 1 , 0, TRUE);
	pStatus->SetPaneText( 2 , 0, TRUE);
	
	
	
}

void CLinjunjuanView::OnKillFocus(CWnd* pNewWnd) 
{
	
	CScrollView::OnKillFocus(pNewWnd);
	
	CLinjunjuanDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CMainFrame * pMainfrm = (CMainFrame*) AfxGetMainWnd();
	CStatusBar * pStatus = &pMainfrm->m_wndStatusBar;

	CString rowtmp,coltmp;
	rowtmp = "      ";
	coltmp = "      ";
	pStatus->SetPaneText( 1 , rowtmp, TRUE);
	pStatus->SetPaneText( 2 , coltmp, TRUE);
	
	
}


LRESULT CLinjunjuanView::OnHotKey(WPARAM wParam,LPARAM lParam) 
{ 
    if(wParam==1001||wParam==1002)//响应热键,显示主窗口 
    { 
     
        AfxGetMainWnd()->ShowWindow(SW_SHOW); 
    } 
    return 0; 
} 

LRESULT CLinjunjuanView::OnGoodBye(WPARAM wParam,LPARAM lParam)
{
	m_pDlg->DestroyWindow();
	m_pDlgexit=TRUE;
	return 0;

}

	

void CLinjunjuanView::OnDestroy() 
{
	CScrollView::OnDestroy();
	
	::UnregisterHotKey(m_hWnd,1001);    //删除热键 
    ::UnregisterHotKey(m_hWnd,1002); 
	
}

int CLinjunjuanView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CScrollView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	 //注册热键 ctrl+shit+Q 
    RegisterHotKey(m_hWnd,1001,MOD_SHIFT,'Q'); 
    RegisterHotKey(m_hWnd,1002,MOD_SHIFT,'q'); 
	
	return 0;
}

void CLinjunjuanView::OnBrightContrast() 
{
	CBright dlg;
	dlg.pDoc=GetDocument();
	dlg.pDoc->anotherflag=TRUE;
	if (dlg.DoModal()==IDOK)
	{
		
	}
	else 
	{
		if ((GetDocument()->m_hDIB=ChangeToHDIB(GetDocument()->orgpic,0))==NULL)
		return ;
		GetDocument()->flagsmall_big=TRUE;
		GetDocument()->UpdateAllViews(NULL);
	}
	dlg.pDoc->anotherflag=FALSE;
	
}


void CLinjunjuanView::DrawBoxOutLine(POINT ptBeg,POINT ptEnd)
{
	
    CPen newPen(PS_DOT,1,(COLORREF)0);   	
    currentDC=CLinjunjuanView::GetDC();
	currentDC->SetROP2(R2_NOT);
	CPen* pOldPen=currentDC->SelectObject(&newPen);
	currentDC->SelectObject(GetStockObject(HOLLOW_BRUSH));
	currentDC->Rectangle(ptBeg.x/*+GetScrollPos(SB_HORZ)*/,ptBeg.y/*+GetScrollPos(SB_VERT)*/,ptEnd.x/*+GetScrollPos(SB_HORZ)*/,ptEnd.y/*+GetScrollPos(SB_VERT)*/);
	currentDC->SelectObject(pOldPen);
	CLinjunjuanView::ReleaseDC(currentDC);

	//void DrawDragRect(LPCRECT lpRect, SIZE size, LPCRECT lpRectLast, SIZE sizeLast, 
	//	CBrush* pBrush = NULL,  = NULL ); 

}






void CLinjunjuanView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	
//	DrawBoxOutLine(ptBeg,ptEnd);
	if(rectSelect==TRUE)
	{
		ptBeg.x=ptEnd.x=point.x;
		ptBeg.y=ptEnd.y=point.y;
		DrawBoxOutLine(ptBeg,ptEnd);//?
		CLinjunjuanView::SetCapture();
		SetCursor(LoadCursor(NULL,IDC_CROSS));
		fBlocking=TRUE;
	}

	CScrollView::OnLButtonDown(nFlags, point);
}

void CLinjunjuanView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if(fBlocking)
	{
		DrawBoxOutLine(ptBeg,ptEnd);
		ptBoxBeg=ptBeg;
		ptBoxEnd.x=point.x;
		ptBoxEnd.y=point.y;
		ReleaseCapture();
		SetCursor(LoadCursor(NULL,IDC_ARROW));
		fBlocking = FALSE;
		fValidBox = TRUE;	
		if(m_pDlgexit==FALSE)
			{
				char *buffer;
				buffer= new char [7];
				_itoa(ptBeg.x+GetScrollPos(SB_HORZ),buffer,10);
				m_pDlg->m_block_x=buffer;
				_itoa(ptBeg.y+GetScrollPos(SB_VERT),buffer,10);
				m_pDlg->m_block_y=buffer;
				_itoa(abs(ptEnd.x-ptBeg.x),buffer,10);
				m_pDlg->m_block_length=buffer;
				_itoa(abs(ptEnd.y-ptBeg.y),buffer,10);				
				m_pDlg->m_block_width=buffer;
				delete []buffer;
			}
		Invalidate(FALSE);
	}  
	CScrollView::OnLButtonUp(nFlags, point);
}

void CLinjunjuanView::OnMouseMove(UINT nFlags, CPoint point) 
{
	CLinjunjuanDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CMainFrame * pMainfrm = (CMainFrame*) AfxGetMainWnd();
	CStatusBar * pStatus = &pMainfrm->m_wndStatusBar;

	mousepoint=point;
	xtmp.Format("X: %d",mousepoint.x);
	ytmp.Format("Y: %d",mousepoint.y);

	CString tmp;
	tmp = pStatus->GetPaneText(3); // index of ID_INDICATOR_ROW
	tmp = pStatus->GetPaneText(4); // index of ID_INDICATOR_COL
	pStatus->SetPaneText( 1 , xtmp, TRUE);
	pStatus->SetPaneText( 2 , ytmp, TRUE);
		if(fCircling)
	{
		
		{
			SetCursor(LoadCursor(NULL,IDC_CROSS));
			if(first)
			{
				first=FALSE;
			}
			else
			{
				
				currentDC=CLinjunjuanView::GetDC();
				CPen newPen(PS_SOLID,8,(RGB(255,0,0)));
				CPen* pOldPen=currentDC->SelectObject(&newPen);
				currentDC->SetROP2(R2_NOT);		
				currentDC->SelectObject(GetStockObject(HOLLOW_BRUSH));
				currentDC->Ellipse(ptEllipseBeg1.x,ptEllipseBeg1.y,ptEllipseEnd1.x,ptEllipseEnd1.y);
				currentDC->Ellipse(ptEllipseBeg2.x,ptEllipseBeg2.y,ptEllipseEnd2.x,ptEllipseEnd2.y);
				currentDC->SelectObject(pOldPen);
				CLinjunjuanView::ReleaseDC(currentDC);		
			}		
			ptEllipseBeg1.x=point.x-inner_circle;
			ptEllipseBeg1.y=point.y-inner_circle;
			ptEllipseEnd1.x=point.x+inner_circle;
			ptEllipseEnd1.y=point.y+inner_circle;
			ptEllipseBeg2.x=point.x-outer_circle;
			ptEllipseBeg2.y=point.y-outer_circle;
			ptEllipseEnd2.x=point.x+outer_circle;
			ptEllipseEnd2.y=point.y+outer_circle;	
			currentDC=CLinjunjuanView::GetDC();
			CPen newPen(PS_SOLID,8,(RGB(250,0,0)));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -