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

📄 myeditview.cpp

📁 小编辑器(存在问题
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MyEditView.cpp : implementation of the CMyEditView class
//

#include "stdafx.h"
#include "MyEdit.h"

#include "MyEditDoc.h"
#include "MyEditView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CMyEditView

IMPLEMENT_DYNCREATE(CMyEditView, CView)

BEGIN_MESSAGE_MAP(CMyEditView, CView)
	//{{AFX_MSG_MAP(CMyEditView)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_SIZE()
	ON_WM_MOUSEWHEEL()
	ON_WM_HSCROLL()
	ON_WM_VSCROLL()
	ON_WM_CHAR()
	ON_WM_SETFOCUS()
	ON_WM_KILLFOCUS()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyEditView construction/destruction

CMyEditView::CMyEditView()
{
	// TODO: add construction code here

}

CMyEditView::~CMyEditView()
{
}

BOOL CMyEditView::PreCreateWindow(CREATESTRUCT& cs)
{
//	CWnd *pParentWnd=CWnd::FromHandlePermanent(cs.hwndParent);
//	if(pParentWnd==NULL || !pParentWnd->IsKindOf(RUNTIME_CLASS(CSplitterWnd)))
//	{
		cs.style|=(WS_HSCROLL|WS_VSCROLL);
//	}
//	cs.lpszClass=AfxRegisterWndClass(CS_DBLCLKS);
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMyEditView drawing

void CMyEditView::OnDraw(CDC* pDC)
{
	///////////////////////////////////////////////
	CMyEditDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	///////////////////////////////////////////////

	CRect rc;
	GetClientRect(rc);

	if(m_text==NULL)
	{
		pDC->FillRect(rc,&CBrush(RGB(255,255,255)));
		return;
	}

	CDC dc;
	dc.CreateCompatibleDC(pDC);

	CBitmap bm;
	bm.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
	dc.SelectObject(bm);
	dc.SetBoundsRect(&rc,DCB_DISABLE);

	CFont font;
	font.CreateFont(m_LineHeight,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,0);
	CFont* oldFont=dc.SelectObject(&font);

	CBrush bkBrush(RGB(255,255,255));
    dc.FillRect(rc, &bkBrush);
	
	UINT lineCY, lineCX;
	UINT dwPos;
	char currentchar[200];       //20

	m_HexStart = m_CharWidth * (14 - m_LeftChar);//计算二进制开始显示的位置
	m_TextStart = m_HexStart + m_CharWidth * 302;//计算ASCII码开始显示的位置

	for(UINT i = 0; i < m_PageRows; i++)//按行处理
	{
		lineCY = i * m_LineHeight;
		sprintf(currentchar, "%08Xh:", (m_TopLine+i-1)*100);

		dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
		dc.SetBkColor(RGB(255,255,255));

		dc.TextOut (m_CharWidth*(2-m_LeftChar), lineCY, currentchar);//显示地址

		memcpy(currentchar,&m_text[(m_TopLine+i-1)*100],100);
		currentchar[100] = '\0';
		if((m_TopLine+i)*100 > m_CharCount)
		{
			currentchar[m_CharCount%100] = '\0';
		}
		dc.TextOut (m_TextStart, lineCY, currentchar);//先打印本行的字符串,这样可以显示非ASCII文本

		for(UINT j = 0; j < 100; j++)
		{
			dwPos = j + (m_TopLine+i-1)*100;

			if(dwPos > (m_CharCount-1))
				goto bitblt;
			
			if((dwPos >= m_SelStart && dwPos <= m_SelEnd) || (dwPos <= m_SelStart && dwPos >= m_SelEnd))//被选中则反色处理
			{
				dc.SetBkColor(::GetSysColor ( COLOR_HIGHLIGHT ));
				dc.SetTextColor(::GetSysColor ( COLOR_HIGHLIGHTTEXT ));

				lineCX = m_TextStart + j * m_CharWidth ;
				sprintf(currentchar, "%c", m_text[dwPos]);
				dc.TextOut (lineCX, lineCY, currentchar);
			}
			else
			{
				dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
				dc.SetBkColor(RGB(255,255,255));
			}

			lineCX = m_HexStart + j * m_CharWidth *3 ;
			sprintf(currentchar, "%02X", ((UCHAR *)m_text)[dwPos]);
			dc.TextOut (lineCX, lineCY, currentchar);

			if(dwPos == m_SelEnd)//计算当前要编辑的字符位置
			{
				dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
				dc.SetBkColor(RGB(0,0,0));
				UCHAR cHex = m_text[dwPos];
				if(m_bFirst)
				{
					cHex = cHex & 0xf0;
					cHex = cHex >> 4;
					sprintf(currentchar, "%X", cHex);
					dc.TextOut (lineCX, lineCY, currentchar);
				}
				else
				{
					lineCX = m_HexStart + j * m_CharWidth *3 + m_CharWidth;
					cHex = cHex & 0x0f;
					sprintf(currentchar, "%X", cHex);
					dc.TextOut (lineCX, lineCY, currentchar);
				}
			}
		}
	}
/*	m_TextStart = m_HexStart + m_CharWidth * 50;//计算ASCII码开始显示的位置

	for(UINT i = 0; i < m_PageRows; i++)//按行处理
	{
		lineCY = i * m_LineHeight;
		sprintf(currentchar, "%08Xh:", (m_TopLine+i)*16);

		dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
		dc.SetBkColor(RGB(255,255,255));

		dc.TextOut (m_CharWidth*(2-m_LeftChar), lineCY, currentchar);//显示地址

		memcpy(currentchar,&m_text[(m_TopLine+i-1)*16],16);
		currentchar[16] = '\0';
		if((m_TopLine+i)*16 > m_CharCount)
		{
			currentchar[m_CharCount%16] = '\0';
		}
		dc.TextOut (m_TextStart, lineCY, currentchar);//先打印本行的字符串,这样可以显示非ASCII文本

		for(UINT j = 0; j < 16; j++)
		{
			dwPos = j + (m_TopLine+i-1)*16;

			if(dwPos > (m_CharCount-1))
				goto bitblt;
			
			if((dwPos >= m_SelStart && dwPos <= m_SelEnd) || (dwPos <= m_SelStart && dwPos >= m_SelEnd))//被选中则反色处理
			{
				dc.SetBkColor(::GetSysColor ( COLOR_HIGHLIGHT ));
				dc.SetTextColor(::GetSysColor ( COLOR_HIGHLIGHTTEXT ));

				lineCX = m_TextStart + j * m_CharWidth ;
				sprintf(currentchar, "%c", m_text[dwPos]);
				dc.TextOut (lineCX, lineCY, currentchar);
			}
			else
			{
				dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
				dc.SetBkColor(RGB(255,255,255));
			}

			lineCX = m_HexStart + j * m_CharWidth *3 ;
			sprintf(currentchar, "%02X", ((UCHAR *)m_text)[dwPos]);
			dc.TextOut (lineCX, lineCY, currentchar);

			if(dwPos == m_SelEnd)//计算当前要编辑的字符位置
			{
				dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
				dc.SetBkColor(RGB(0,0,0));
				UCHAR cHex = m_text[dwPos];
				if(m_bFirst)
				{
					cHex = cHex & 0xf0;
					cHex = cHex >> 4;
					sprintf(currentchar, "%X", cHex);
					dc.TextOut (lineCX, lineCY, currentchar);
				}
				else
				{
					lineCX = m_HexStart + j * m_CharWidth *3 + m_CharWidth;
					cHex = cHex & 0x0f;
					sprintf(currentchar, "%X", cHex);
					dc.TextOut (lineCX, lineCY, currentchar);
				}
			}
		}
	}
*/
bitblt:
	pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &dc, 0, 0, SRCCOPY);
	dc.DeleteDC ();
}

/////////////////////////////////////////////////////////////////////////////
// CMyEditView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CMyEditView diagnostics

#ifdef _DEBUG
void CMyEditView::AssertValid() const
{
	CView::AssertValid();
}

void CMyEditView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

////////////////////////////////////////////////////////////       多加的       ///////////////////////////////////////
CMyEditDoc* CMyEditView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyEditDoc)));
	return (CMyEditDoc*)m_pDocument;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyEditView message handlers

void CMyEditView::SetText(char *input, int len)
{
	m_text = input;

	m_CharCount = len;
	m_Rows = m_CharCount/100;    //16

	m_TopLine = 1;
	m_LeftChar = 0;
	m_SelStart = 0;
	m_SelEnd = 0;
	m_StartDrag = FALSE;
	m_bFirst = TRUE;

	CFont font;
	m_LineHeight = 16;
	font.CreateFont ( m_LineHeight, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, 0 );
	CFont* oldFont = GetDC()->SelectObject ( &font );
	
	CSize size = GetDC()->GetTextExtent ("A");
	m_LineHeight = size.cy;
	m_CharWidth = size.cx ;

	GetPageRowCols();
	SetVertScrollBar();
	SetHorzScrollBar();
}

void CMyEditView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
}

void CMyEditView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	GetPageRowCols();
	SetVertScrollBar();
	SetHorzScrollBar();
}

//计算每一页可显示的行数和列数
void CMyEditView::GetPageRowCols()
{
	CRect rc;
	GetClientRect(rc);
	m_PageRows =  rc.Height ()/m_LineHeight;
	m_PageCols = rc.Width ()/m_CharWidth;
}

//以下设置滚动条的位置等信息
void CMyEditView::SetVertScrollBar()
{	
	if((m_Rows - m_TopLine +  2) < m_PageRows) m_TopLine = 1;

	SCROLLINFO si;
	ZeroMemory(&si,sizeof(si));
	si.cbSize = sizeof(si);
	si.fMask = SIF_DISABLENOSCROLL | SIF_PAGE | SIF_POS | SIF_RANGE;
	si.nMin = 0;
	si.nMax = m_Rows;
	si.nPage = m_PageRows;
	si.nPos = m_TopLine-1;

⌨️ 快捷键说明

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