📄 hexedvw.cpp
字号:
else
m_dwFlags &= ~HVW_READ_ONLY;
m_dwFlags |= HVW_UPDATE;
}
void CHexEditView::SetOptions(DWORD dwFlags)
{
m_dwFlags &= HVW_EXTENDED;
m_dwFlags |= (dwFlags & HVW_EXTENDED) | HVW_UPDATE;
}
void CHexEditView::SetBPR(int bpr)
{
m_bpr = bpr;
m_dwFlags |= HVW_UPDATE;
}
void CHexEditView::OnLButtonDown(UINT nFlags, CPoint point)
{
SetFocus();
if(!m_pData || !*m_pData)
return;
if(nFlags & MK_SHIFT)
{
m_selStart = m_currentAddress;
}
CPoint pt = CalcPos(point.x, point.y);
if(pt.x > -1)
{
m_editPos = pt;
pt.x *= m_nullWidth;
pt.y *= m_lineHeight;
if(pt.x == 0 && (m_dwFlags & HVW_SHOW_ADDRESS))
CreateAddressCaret();
else
CreateEditCaret();
SetCaretPos(pt);
if(nFlags & MK_SHIFT)
{
m_selEnd = m_currentAddress;
if(m_currentMode == EDIT_HIGH || m_currentMode == EDIT_LOW)
m_selEnd++;
RedrawWindow();
}
}
if(!(nFlags & MK_SHIFT))
{
if(DragDetect(this->m_hWnd, point))
{
m_selStart = m_currentAddress;
m_selEnd = m_selStart;
SetCapture();
}
else
{
BOOL bsel = m_selStart != 0xffffffff;
m_selStart = 0xffffffff;
m_selEnd = 0xffffffff;
if(bsel)
RedrawWindow();
}
}
if(!IsSelected())
{
ShowCaret();
}
}
void CHexEditView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
nFlags; point;
}
CPoint CHexEditView::CalcPos(int x, int y)
{
y /= m_lineHeight;
if(y < 0 || y > m_lpp)
return CPoint(-1, -1);
if(y * m_bpr > *m_length)
return CPoint(-1, -1);
x += m_nullWidth;
x /= m_nullWidth;
int xp;
if((m_dwFlags & HVW_SHOW_ADDRESS) && x <= (m_dwFlags & HVW_WIDE_ADDRESS ? 8 : 4))
{
m_currentAddress = m_topindex + (m_bpr * y);
m_currentMode = EDIT_NONE;
return CPoint(0, y);
}
xp = (m_offHex / m_nullWidth) + m_bpr * 3;
if((m_dwFlags & HVW_SHOW_HEX) && x < xp)
{
if(x%3)
x--;
m_currentAddress = m_topindex + (m_bpr * y) + (x - (m_offHex / m_nullWidth)) / 3;
m_currentMode = ((x%3) & 0x01) ? EDIT_LOW : EDIT_HIGH;
return CPoint(x, y);
}
xp = (m_offAscii / m_nullWidth) + m_bpr;
if((m_dwFlags & HVW_SHOW_ASCII) && x <= xp)
{
m_currentAddress = m_topindex + (m_bpr * y) + (x - (m_offAscii / m_nullWidth));
m_currentMode = EDIT_ASCII;
return CPoint(x, y);
}
return CPoint(-1,-1);
}
void CHexEditView::CreateAddressCaret()
{
DestroyCaret();
CreateSolidCaret(m_nullWidth * (m_dwFlags & HVW_WIDE_ADDRESS ? 8 : 4), m_lineHeight);
}
void CHexEditView::CreateEditCaret()
{
DestroyCaret();
CreateSolidCaret(m_nullWidth, m_lineHeight);
}
void CHexEditView::OnMouseMove(UINT nFlags, CPoint point)
{
if(!m_pData || !*m_pData)
return;
if(nFlags & MK_LBUTTON && m_selStart != 0xffffffff)
{
CRect rc;
GetClientRect(&rc);
if(!rc.PtInRect(point))
{
if(point.y < 0)
{
OnVScroll(SB_LINEUP, 0, NULL);
point.y = 0;
}
else if(point.y > rc.Height())
{
OnVScroll(SB_LINEDOWN, 0, NULL);
point.y = rc.Height() -1;
}
}
//
// we are selecting
//
int seo = m_selEnd;
CPoint pt = CalcPos(point.x, point.y);
if(pt.x > -1)
{
m_selEnd = m_currentAddress;
if(m_currentMode == EDIT_HIGH || m_currentMode == EDIT_LOW)
m_selEnd++;
}
if(IsSelected())
DestroyCaret();
if(seo != m_selEnd)
RedrawWindow();
}
}
void CHexEditView::UpdateScrollbars()
{
return;
HWND hWnd = GetSafeHwnd ();
SCROLLINFO si;
si.cbSize = sizeof (SCROLLINFO);
si.fMask = SIF_ALL;
si.nMin = 0;
si.nMax = *m_length / m_bpr - 1;
si.nPage = m_lpp;
si.nPos = m_topindex / m_bpr;
// SetScrollInfo (SB_VERT, &si, TRUE);
::SetScrollInfo (hWnd, SB_VERT, &si, TRUE);
if(si.nMax > (int) si.nPage)
// EnableScrollBar (SB_VERT, ESB_ENABLE_BOTH);
::EnableScrollBar (hWnd, SB_VERT, ESB_ENABLE_BOTH);
CRect rc;
GetClientRect (&rc);
si.nMin = 0;
si.nMax =((m_dwFlags & HVW_SHOW_ADDRESS ? (m_dwFlags & HVW_WIDE_ADDRESS ? 8 : 4) : 0) +
(m_dwFlags & HVW_SHOW_HEX ? m_bpr * 3 : 0) +
(m_dwFlags & HVW_SHOW_ASCII ? m_bpr : 0) ) * m_nullWidth;
si.nPage = 1;
si.nPos = 0;
// SetScrollInfo (SB_HORZ, &si, TRUE);
::SetScrollInfo (hWnd, SB_HORZ, &si, TRUE);
}
inline BOOL CHexEditView::IsSelected()
{
return m_selStart != 0xffffffff;
}
void CHexEditView::OnLButtonUp(UINT nFlags, CPoint point)
{
if(IsSelected())
ReleaseCapture();
CWnd::OnLButtonUp(nFlags, point);
}
void CHexEditView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
nFlags;nRepCnt;
if(!m_pData || !*m_pData)
return;
if(nChar == _T ('\t'))
return;
if(GetKeyState(VK_CONTROL) & 0x80000000)
{
switch(nChar)
{
case 0x03:
if(IsSelected())
OnEditCopy();
return;
case 0x16:
OnEditPaste();
return;
case 0x18:
if(IsSelected())
OnEditCut();
return;
case 0x1a:
OnEditUndo();
return;
}
}
if(nChar == 0x08)
{
if(m_currentAddress > 0)
{
m_currentAddress--;
SelDelete(m_currentAddress, m_currentAddress+1);
RepositionCaret(m_currentAddress);
RedrawWindow();
}
return;
}
SetSel(-1, -1);
if (!(m_dwFlags & HVW_READ_ONLY))
switch(m_currentMode)
{
case EDIT_NONE:
return;
case EDIT_HIGH:
case EDIT_LOW:
if((nChar >= _T ('0') && nChar <= _T ('9')) || (nChar >= _T ('a') && nChar <= _T ('f')))
{
UINT b = nChar - _T ('0');
if(b > 9)
b = 10 + nChar - _T ('a');
if(m_currentMode == EDIT_HIGH)
{
(*m_pData)[m_currentAddress] = (unsigned char)(((*m_pData)[m_currentAddress] & 0x0f) | (b << 4));
}
else
{
(*m_pData)[m_currentAddress] = (unsigned char)(((*m_pData)[m_currentAddress] & 0xf0) | b);
}
CDocument *pDoc = GetDocument ();
pDoc->SetModifiedFlag ();
Move(1,0);
}
break;
case EDIT_ASCII:
{
(*m_pData)[m_currentAddress] = (unsigned char)nChar;
CDocument *pDoc = GetDocument ();
pDoc->SetModifiedFlag ();
Move(1,0);
}
break;
}
RedrawWindow();
}
void CHexEditView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
nFlags; nRepCnt;
BOOL bShift = GetKeyState(VK_SHIFT) & 0x80000000;
BOOL bac = (m_dwFlags & HVW_NO_ADDRESS_CHANGE) != 0;
m_dwFlags |= HVW_NO_ADDRESS_CHANGE;
switch(nChar)
{
case VK_DOWN:
if(bShift)
{
if(!IsSelected())
{
m_selStart = m_currentAddress;
}
Move(0,1);
m_selEnd = m_currentAddress;
if(m_currentMode == EDIT_HIGH || m_currentMode == EDIT_LOW)
m_selEnd++;
RedrawWindow();
break;
}
else
SetSel(-1, -1);
Move(0,1);
break;
case VK_UP:
if(bShift)
{
if(!IsSelected())
{
m_selStart = m_currentAddress;
}
Move(0,-1);
m_selEnd = m_currentAddress;
RedrawWindow();
break;
}
else
SetSel(-1, -1);
Move(0,-1);
break;
case VK_LEFT:
if(bShift)
{
if(!IsSelected())
{
m_selStart = m_currentAddress;
}
Move(-1,0);
m_selEnd = m_currentAddress;
RedrawWindow();
break;
}
else
SetSel(-1, -1);
Move(-1,0);
break;
case VK_RIGHT:
if(bShift)
{
if(!IsSelected())
{
m_selStart = m_currentAddress;
}
Move(1,0);
m_selEnd = m_currentAddress;
if(m_currentMode == EDIT_HIGH || m_currentMode == EDIT_LOW)
m_selEnd++;
RedrawWindow();
break;
}
else
SetSel(-1, -1);
Move(1,0);
break;
case VK_PRIOR:
if(bShift)
{
if(!IsSelected())
{
m_selStart = m_currentAddress;
}
OnVScroll(SB_PAGEUP, 0, NULL);
Move(0,0);
m_selEnd = m_currentAddress;
RedrawWindow();
break;
}
else
SetSel(-1, -1);
OnVScroll(SB_PAGEUP, 0, NULL);
Move(0,0);
break;
case VK_NEXT:
if(bShift)
{
if(!IsSelected())
{
m_selStart = m_currentAddress;
}
OnVScroll(SB_PAGEDOWN, 0, NULL);
Move(0,0);
m_selEnd = m_currentAddress;
RedrawWindow();
break;
}
else
SetSel(-1, -1);
OnVScroll(SB_PAGEDOWN, 0, NULL);
Move(0,0);
break;
case VK_HOME:
if(bShift)
{
if(!IsSelected())
{
m_selStart = m_currentAddress;
}
if(GetKeyState(VK_CONTROL) & 0x80000000)
{
OnVScroll(SB_THUMBTRACK, 0, NULL);
Move(0,0);
}
else
{
m_currentAddress /= m_bpr;
m_currentAddress *= m_bpr;
Move(0,0);
}
m_selEnd = m_currentAddress;
RedrawWindow();
break;
}
else
SetSel(-1, -1);
if(GetKeyState(VK_CONTROL) & 0x80000000)
{
OnVScroll(SB_THUMBTRACK, 0, NULL);
m_currentAddress = 0;
Move(0,0);
}
else
{
m_currentAddress /= m_bpr;
m_currentAddress *= m_bpr;
Move(0,0);
}
break;
case VK_END:
if(bShift)
{
if(!IsSelected())
{
m_selStart = m_currentAddress;
}
if(GetKeyState(VK_CONTROL) & 0x80000000)
{
m_currentAddress = *m_length-1;
OnVScroll(SB_THUMBTRACK, ((*m_length+(m_bpr/2)) / m_bpr) - m_lpp, NULL);
Move(0,0);
}
else
{
m_currentAddress /= m_bpr;
m_currentAddress *= m_bpr;
m_currentAddress += m_bpr - 1;
if(m_currentAddress > *m_length)
m_currentAddress = *m_length-1;
Move(0,0);
}
m_selEnd = m_currentAddress;
RedrawWindow();
break;
}
else
SetSel(-1, -1);
if(GetKeyState(VK_CONTROL) & 0x80000000)
{
m_currentAddress = *m_length-1;
if(m_dwFlags & HVW_HALF_PAGE)
OnVScroll(SB_THUMBTRACK, 0, NULL);
else
OnVScroll(SB_THUMBTRACK, ((*m_length+(m_bpr/2)) / m_bpr) - m_lpp, NULL);
Move(0,0);
}
else
{
m_currentAddress /= m_bpr;
m_currentAddress *= m_bpr;
m_currentAddress += m_bpr - 1;
if(m_currentAddress > *m_length)
m_currentAddress = *m_length-1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -