📄 hexeditview.cpp
字号:
void CHexEditView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CView::OnVScroll(nSBCode, nPos, pScrollBar);
// VERIFY(GetScrollInfo(SB_VERT, &sy));
SCROLLINFO si;
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
VERIFY(GetScrollInfo(SB_VERT, &si));
switch (nSBCode)
{
case SB_TOP:
m_nTopLine = 0;
break;
case SB_BOTTOM:
m_nTopLine = m_nRows - m_nPageRows + 1;
break;
case SB_LINEUP:
m_nTopLine = m_nTopLine - 1;
break;
case SB_LINEDOWN:
m_nTopLine = m_nTopLine + 1;
break;
case SB_PAGEUP:
m_nTopLine = m_nTopLine - si.nPage + 1;
break;
case SB_PAGEDOWN:
m_nTopLine = m_nTopLine + si.nPage - 1;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
m_nTopLine = si.nTrackPos+1;
break;
default:
return;
}
if((m_nTopLine + m_nPageRows -2) > m_nRows)
m_nTopLine = m_nRows - m_nPageRows + 2;
if(m_nTopLine < 0)
m_nTopLine = 0;
// sy.nPos = m_nTopLine;
SetVertScrollBar();
//Invalidate(FALSE);
}
void CHexEditView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CView::OnHScroll(nSBCode, nPos, pScrollBar);
SCROLLINFO si;
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
VERIFY(GetScrollInfo(SB_HORZ, &si));
switch (nSBCode)
{
case SB_LEFT:
m_nLeftChar = 0;
break;
case SB_BOTTOM:
m_nLeftChar = 80 - m_nPageCols + 1;
break;
case SB_LINEUP:
m_nLeftChar = m_nLeftChar - 1;
break;
case SB_LINEDOWN:
m_nLeftChar = m_nLeftChar + 1;
break;
case SB_PAGEUP:
m_nLeftChar = m_nLeftChar - si.nPage + 1;
break;
case SB_PAGEDOWN:
m_nLeftChar = m_nLeftChar + si.nPage - 1;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
m_nLeftChar = si.nTrackPos;
break;
default:
return;
}
if((m_nLeftChar + m_nPageCols - 2) > 80)
m_nLeftChar = 80 - m_nPageCols +2;
if(m_nLeftChar < 0)
m_nLeftChar = 0;
// sx.nPos = m_nLeftChar;
SetHorzScrollBar();
}
BOOL CHexEditView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(zDelta > 0)
{
m_nTopLine = --m_nTopLine < 0 ? 0 : m_nTopLine;
}
else
{
if((m_nTopLine + m_nPageRows -2) < m_nRows)
m_nTopLine+=1;
}
// sy.nPos = m_nTopLine;
SetVertScrollBar();
SetHorzScrollBar();
return CView::OnMouseWheel(nFlags, zDelta, pt);
}
//16进制编辑有关函数
void CHexEditView::OnSetFocus(CWnd* pOldWnd)
{
CView::OnSetFocus(pOldWnd);
// TODO: 在此处添加消息处理程序代码
m_bFocused = TRUE;
}
void CHexEditView::OnKillFocus(CWnd* pNewWnd)
{
CView::OnKillFocus(pNewWnd);
// TODO: 在此处添加消息处理程序代码
m_bFocused = FALSE;
}
void CHexEditView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CView::OnLButtonDown(nFlags, point);
m_bStartDrag = TRUE;
// m_bFirst = FALSE;
m_bFirst = TRUE;
m_noriStart = m_nSelStart = m_nSelEnd = PointPos(point);
//comSelStart = comSelEnd = comSel;
//SelectPointStart[0] = SelectPointEnd[0] = SelectPoint[0];
//SelectPointStart[1] = SelectPointEnd[1] = SelectPoint[1];
Invalidate(FALSE);
}
void CHexEditView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CView::OnLButtonUp(nFlags, point);
/* if(m_bStartDrag)
{
//SelectPoint = CPoint(-1,-1);
Invalidate(FALSE);
m_bStartDrag = FALSE;
m_bFirst = FALSE;
}
*/
if(m_bStartDrag)
{
m_nSelEnd = PointPos(point);
if(m_nSelEnd < m_noriStart)
{
m_nSelStart = m_nSelEnd;
m_nSelEnd = m_noriStart;
}
else
{
m_nSelStart = m_noriStart;
}
Invalidate(FALSE);
m_bStartDrag = FALSE;
}
}
void CHexEditView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CView::OnMouseMove(nFlags, point);
if(m_bStartDrag)
{
m_nSelEnd = PointPos(point);
//comSelEnd = comSel;
//SelectPointEnd[0] = SelectPoint[0];
//SelectPointEnd[1] = SelectPoint[1];
if(m_nSelEnd < m_noriStart) //反向选择
{
m_nSelStart = m_nSelEnd;
m_nSelEnd = m_noriStart;
}
else
{
m_nSelStart = m_noriStart;
}
Invalidate(FALSE);
}
}
void CHexEditView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CView::OnChar(nChar, nRepCnt, nFlags);
UINT input;
UCHAR cHex = strText[m_nSelEnd];
if(nChar > 47 && nChar < 58)
{
input = nChar - 48;
}
else if (nChar > 64 && nChar < 71)
{
input = nChar - 64 + 9;
}
else if (nChar > 96 && nChar < 103)
{
input = nChar - 96 + 9;
}
else
{
return;
}
if(m_bFirst)
{
input = input << 4;
cHex = cHex & 0x0f;
cHex = cHex | input;
m_bFirst = FALSE;
strText[m_nSelEnd] = cHex;
}
else
{
cHex = cHex & 0xf0;
cHex = cHex | input;
m_bFirst = TRUE;
strText[m_nSelEnd] = cHex;
m_nSelEnd ++;
}
if(m_nSelEnd == m_nCharCount)
{
m_nCharCount = m_nSelEnd + 1;
m_nRows = m_nCharCount/16;
}
//溢出处理
if(block*block_num <= m_nCharCount)
{
block_num++;
strText = (char *)realloc(strText,block*block_num);
}
m_nSelStart = m_nSelEnd;
ChangeTop();
ChangeLeft();
Invalidate(FALSE);
}
//对键盘方向键处理
BOOL CHexEditView::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg->message == WM_KEYDOWN)
{
switch (LOWORD(pMsg->wParam))
{
case VK_LEFT:
OnCharLeft();
break;
case VK_RIGHT:
OnCharRight();
break;
case VK_UP:
OnLineUp();
break;
case VK_DOWN:
OnLineDown();
break;
default:
break;
}
}
return CView::PreTranslateMessage(pMsg);
}
void CHexEditView::OnCharLeft()
{
if(m_bFirst && m_nSelEnd > 0)
{
m_nSelEnd--;
m_bFirst = FALSE;
}
else
{
m_bFirst = TRUE;
}
ChangeTop();
ChangeLeft();
m_nSelStart = m_nSelEnd;
Invalidate(FALSE);
}
void CHexEditView::OnCharRight()
{
if(m_bFirst)
{
m_bFirst = FALSE;
}
else if( (int)m_nSelEnd < m_nCharCount-1)
{
m_bFirst = TRUE;
m_nSelEnd++;
}
ChangeTop();
ChangeLeft();
m_nSelStart = m_nSelEnd;
Invalidate(FALSE);
}
void CHexEditView::OnLineUp()
{
if(m_nSelEnd > 15)
m_nSelEnd = m_nSelEnd - 16;
ChangeTop();
ChangeLeft();
m_nSelStart = m_nSelEnd;
Invalidate(FALSE);
}
void CHexEditView::OnLineDown()
{
if((int)m_nSelEnd + 16 < m_nCharCount)
m_nSelEnd = m_nSelEnd + 16;
else
m_nSelEnd = m_nCharCount-1;
ChangeTop();
ChangeLeft();
m_nSelStart = m_nSelEnd;
Invalidate(FALSE);
}
BOOL CHexEditView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此添加专用代码和/或调用基类
CWnd *pParentWnd = CWnd::FromHandlePermanent(cs.hwndParent);
if (pParentWnd == NULL || ! pParentWnd->IsKindOf(RUNTIME_CLASS(CSplitterWnd)))
{
// View must always create its own scrollbars,
// if only it's not used within splitter
cs.style |= (WS_HSCROLL | WS_VSCROLL);
}
cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS);
return CView::PreCreateWindow(cs);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -