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

📄 hexedvw.cpp

📁 一个完整的编辑器的代码(很值得参考
💻 CPP
📖 第 1 页 / 共 3 页
字号:
  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 + -