📄 linjunjuanview.cpp
字号:
// 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 + -