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