QQ登录

只需一步,快速开始

上位机MFC实现十六进制编辑框

[ 复制链接 ]
效果演示
上位机MFC实现十六进制编辑框.gif
例程实现在编辑框中添加十六进制和ASCII文本,可以通过单选框选择是否显示。
地址也可以通过选择设置,效果如上图。
例程使用的两文件可以在帖子底部使用或直接下载工程源代码使用:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:Ctest.rar 
文件大小:47.71 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我



实现过程
1.同样也是新建一个工程,这里建立基于对话框的工程,
按照上图添加单选框,编辑框,与滑块控件,并进行界面排序。

2.复制例程目录两文件HEXEDITCTRL.CPP,HEXEDITCTRL.H到自己工程根目录中,
并导入到工程,两文件源代码可以在帖子底部复制使用。
操作之后,自己的工程目录内就多出了一个集成类CHexEdit,如下图:
2019-07-05_151709.jpg

3.紧接着就产类的使用。
在主对话框头文件内包含#include "hexeditctrl.h"
并添加变量
        //{{AFX_DATA(CCtestDlg)
        enum { IDD = IDD_CTEST_DIALOG };
        CSliderCtrl        m_slider;
        CHexEdit        m_Edit;
        //}}AFX_DATA

void CCtestDlg:oDataExchange(CDataExchange* pDX)
{
        CDialog:oDataExchange(pDX);
        DDX_Control(pDX, IDC_SLIDER1, m_slider);
        DDX_Control(pDX, IDC_HEXEDIT1, m_Edit);
        //}}AFX_DATA_MAP
}

并初始化变量
        m_slider.SetRange(1, 16);
        m_slider.SetPos(8);


编译时会提示少一个菜单ID,CG_IDR_POPUP_HEX_EDIT,
添加或从例程复制使用。

4.添加几个单选框的点击处理函数
  1. void CHexEditDlg::OnCheck1()
  2. {
  3.         UpdateData(TRUE);
  4.         m_Edit.SetOptions(m_address, m_hex, m_ascii, m_48);
  5.         m_Edit.RedrawWindow();
  6. }

  7. void CHexEditDlg::OnCheck2()
  8. {
  9.         UpdateData(TRUE);
  10.         m_Edit.SetOptions(m_address, m_hex, m_ascii, m_48);
  11.         m_Edit.RedrawWindow();
  12. }

  13. void CHexEditDlg::OnCheck3()
  14. {
  15.         UpdateData(TRUE);
  16.         m_Edit.SetOptions(m_address, m_hex, m_ascii, m_48);
  17.         m_Edit.RedrawWindow();
  18. }

  19. void CHexEditDlg::OnCheck4()
  20. {
  21.         UpdateData(TRUE);
  22.         m_Edit.SetOptions(m_address, m_hex, m_ascii, m_48);
  23.         m_Edit.RedrawWindow();
  24. }
复制代码


运行程序,就可以点击界面的几个单选框查看效果,
编辑框自带的文本可以通过去除集成类头文件的#define DEMO 1,去除。

5.最后就滑块功能的实现,在主对话框添加对消息WM_HSCROLL的处理便可:
void CCtestDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
        m_Edit.SetBPR(m_slider.GetPos());
        m_Edit.RedrawWindow();
        CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

下面是两个文件的源代码:
  1. /////////////////////////////////////////////////////////////////////////////
  2. // CHexEdit window

  3. class CHexEdit : public CEdit
  4. {
  5. // Construction
  6. public:
  7.         CHexEdit();

  8.         enum EDITMODE{       
  9.                         EDIT_NONE,
  10.                         EDIT_ASCII,
  11.                         EDIT_HIGH,
  12.                         EDIT_LOW
  13.         } ;
  14. // Attributes
  15. public:
  16.         LPBYTE                m_pData;                        // pointer to data
  17.         int                        m_length;                        // length of data
  18.         int                        m_topindex;                        // offset of first visible byte on screen

  19.         int                        m_currentAddress;        // address under cursor
  20.         EDITMODE        m_currentMode;                // current editing mode: address/hex/ascii
  21.         int                        m_selStart;                        // start address of selection
  22.         int                        m_selEnd;                        // end address of selection

  23.         int                        m_bpr;                                // byte per row
  24.         int                        m_lpp;                                // lines per page
  25.         BOOL                m_bShowAddress;
  26.         BOOL                m_bShowAscii;
  27.         BOOL                m_bShowHex;
  28.         BOOL                m_bAddressIsWide;
  29.        
  30.         BOOL                m_bNoAddressChange;        // internally used
  31.         BOOL                m_bHalfPage;
  32.        
  33.         CFont                m_Font;
  34.         int                        m_lineHeight;
  35.         int                        m_nullWidth;
  36.         BOOL                m_bUpdate;

  37.         int                        m_offHex,
  38.                                 m_offAscii,
  39.                                 m_offAddress;

  40.         CPoint                m_editPos;

  41. // Operations
  42. public:

  43. // Overrides
  44.         // ClassWizard generated virtual function overrides
  45.         //{{AFX_VIRTUAL(CHexEdit)
  46.         public:
  47.         virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
  48.         protected:
  49.         virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
  50.         //}}AFX_VIRTUAL

  51. // Implementation
  52. public:
  53.         int GetData(LPBYTE p, int len);
  54.         void SetData(LPBYTE p, int len);
  55.         CSize GetSel(void);
  56.         void SetSel(int s, int e);
  57.         void SetBPR(int bpr);
  58.         void SetOptions(BOOL a, BOOL h, BOOL c, BOOL w);
  59.         virtual ~CHexEdit();

  60.         // Generated message map functions
  61. protected:
  62.         void                ScrollIntoView(int p);
  63.         void                RepositionCaret(int p);
  64.         void                Move(int x, int y);
  65.         inline BOOL IsSelected(void);
  66.         void                UpdateScrollbars(void);
  67.         void                CreateEditCaret(void);
  68.         void                CreateAddressCaret(void);
  69.         CPoint                CalcPos(int x, int y);
  70.         void                SelInsert(int s, int l);
  71.         void                SelDelete(int s, int e);
  72.         inline void NormalizeSel(void);
  73.         afx_msg void OnContextMenu(CWnd*, CPoint point);
  74.         //{{AFX_MSG(CHexEdit)
  75.         afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
  76.         afx_msg void OnKillFocus(CWnd* pNewWnd);
  77.         afx_msg void OnPaint();
  78.         afx_msg void OnSetFocus(CWnd* pOldWnd);
  79.         afx_msg void OnSize(UINT nType, int cx, int cy);
  80.         afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
  81.         afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
  82.         afx_msg UINT OnGetDlgCode();
  83.         afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  84.         afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  85.         afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
  86.         afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  87.         afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  88.         afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
  89.         afx_msg void OnEditClear();
  90.         afx_msg void OnEditCopy();
  91.         afx_msg void OnEditCut();
  92.         afx_msg void OnEditPaste();
  93.         afx_msg void OnEditSelectAll();
  94.         afx_msg void OnEditUndo();
  95.         //}}AFX_MSG

  96.         DECLARE_MESSAGE_MAP()
  97. };
复制代码
  1. // HexEdit.cpp : Defines the class behaviors for the application.
  2. //

  3. #include "stdafx.h"
  4. #include "HexEditCtrl.h"
  5. #include <ctype.h>
  6. #include <afxole.h>
  7. #include <afxdisp.h>
  8. #include "resource.h"

  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif


  14. char hextable[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  15. #define TOHEX(a, b)        {*b++ = hextable[a >> 4];*b++ = hextable[a&0xf];}
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CHexEdit
  18. #define DEMO 1
  19. CHexEdit::CHexEdit()
  20. {
  21. #if !defined(DEMO)
  22.         m_pData                        = NULL;                // pointer to data
  23.         m_length                = 0;                // length of data
  24. #else
  25.         m_pData                        = (LPBYTE)malloc(0x40);
  26.         for(int i = 0; i < 0x40; i++)
  27.                 m_pData[i] = i;
  28. #endif
  29.         m_length                = 0x40;
  30.         m_topindex                = 0;
  31.         m_bpr                        = 8;                // byte per row
  32.         m_lpp                        = 1;

  33.         m_bShowHex                = TRUE;
  34.         m_bShowAscii        = TRUE;
  35.         m_bShowAddress        = TRUE;
  36.         m_bAddressIsWide= TRUE;                // 4/8 byte address

  37.         m_offAddress        = 0;
  38.         m_offHex                = 0;
  39.         m_offAscii                = 0;

  40.         m_bUpdate = TRUE;                        // update font info
  41.         m_bNoAddressChange = FALSE;
  42.         m_currentMode = EDIT_NONE;

  43.         m_editPos.x = m_editPos.y = 0;
  44.         m_currentAddress = 0;
  45.         m_bHalfPage = TRUE;

  46.         m_selStart        = 0xffffffff;
  47.         m_selEnd        = 0xffffffff;

  48.         m_Font.CreateFont(-12, 0,0,0,0,0,0,0,0,0,0,0,0, "Courier New");

  49.         AfxOleInit();
  50. }

  51. CHexEdit::~CHexEdit()
  52. {
  53. }


  54. BEGIN_MESSAGE_MAP(CHexEdit, CEdit)
  55.         ON_WM_CONTEXTMENU()
  56.         //{{AFX_MSG_MAP(CHexEdit)
  57.         ON_WM_CHAR()
  58.         ON_WM_KILLFOCUS()
  59.         ON_WM_PAINT()
  60.         ON_WM_SETFOCUS()
  61.         ON_WM_SIZE()
  62.         ON_WM_VSCROLL()
  63.         ON_WM_HSCROLL()
  64.         ON_WM_GETDLGCODE()
  65.         ON_WM_ERASEBKGND()
  66.         ON_WM_LBUTTONDOWN()
  67.         ON_WM_LBUTTONDBLCLK()
  68.         ON_WM_MOUSEMOVE()
  69.         ON_WM_LBUTTONUP()
  70.         ON_WM_KEYDOWN()
  71.         ON_COMMAND(ID_EDIT_CLEAR, OnEditClear)
  72.         ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
  73.         ON_COMMAND(ID_EDIT_CUT, OnEditCut)
  74.         ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
  75.         ON_COMMAND(ID_EDIT_SELECT_ALL, OnEditSelectAll)
  76.         ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
  77.         //}}AFX_MSG_MAP
  78. END_MESSAGE_MAP()

  79. /////////////////////////////////////////////////////////////////////////////
  80. // CHexEdit message handlers


  81. void CHexEdit::OnPaint()
  82. {
  83.         CPaintDC pdc(this); // device context for painting

  84.         CRect rc;
  85.         GetClientRect(rc);
  86.        
  87.         CDC        dc;
  88.         dc.CreateCompatibleDC(CDC::FromHandle(pdc.m_ps.hdc));
  89.         CBitmap bm;

  90.         bm.CreateCompatibleBitmap(CDC::FromHandle(pdc.m_ps.hdc), rc.Width(), rc.Height());
  91.         dc.SelectObject(bm);

  92.         CBrush b;
  93.         b.CreateSolidBrush(RGB(0xff,0xff,0xff));
  94.         dc.FillRect(rc, &b);

  95.         ASSERT(m_currentAddress >= 0);
  96.         ASSERT(m_topindex >= 0);

  97.         dc.SelectObject(m_Font);
  98.         int                height                = 0;
  99.         int                x,y;
  100.         char        buf[256];

  101.         x = rc.TopLeft().x;
  102.         y = rc.TopLeft().y;

  103.         dc.SetBoundsRect(&rc, DCB_DISABLE);

  104.         if(m_pData)
  105.         {
  106.                 //
  107.                 // get char dimensions
  108.                 //
  109.                 if(m_bUpdate)
  110.                 {
  111.                         dc.GetCharWidth('0', '0', &m_nullWidth);
  112.                         CSize sz = dc.GetTextExtent("0", 1);
  113.                         m_lineHeight = sz.cy;
  114.                        
  115.                         m_offHex        = m_bShowAddress ? (m_bAddressIsWide ? m_nullWidth * 9 : m_nullWidth * 5) : 0;
  116.                         m_offAscii        = m_bShowAddress ? (m_bAddressIsWide ? m_nullWidth * 9 : m_nullWidth * 5) : 0;
  117.                         m_offAscii += m_bShowHex         ? (m_bpr * 3 * m_nullWidth) : 0;

  118.                         m_lpp = rc.Height() / m_lineHeight;
  119.                         m_bHalfPage = FALSE;
  120.                         if(m_lpp * m_bpr > m_length)
  121.                         {
  122.                                 m_lpp = (m_length + (m_bpr/2)) / m_bpr ;
  123.                                 if(m_length % m_bpr != 0)
  124.                                 {
  125.                                         m_bHalfPage = TRUE;
  126.                                         m_lpp++;
  127.                                 }
  128.                         }
  129.                         m_bUpdate = FALSE;
  130.                         UpdateScrollbars();
  131.                 }

  132.                 TRACE("%i %i\n", m_topindex, m_selStart);
  133.                
  134.                 height = rc.Height() / m_lineHeight;
  135.                 height *= m_lineHeight;

  136.                 if(m_bShowAddress)
  137.                 {
  138.                         char fmt[8] = {'%','0','8','l','X'};
  139.                         fmt[2] = m_bAddressIsWide ? '8' : '4';
  140.                         int w = m_bAddressIsWide ? 8 : 4;
  141.                         y = 0;
  142.                         CRect rcd = rc;
  143.                         rcd.TopLeft().x = m_offAddress;
  144.                         for(int         i = m_topindex; (i < m_length) && (rcd.TopLeft().y < height); i+= m_bpr)
  145.                         {
  146.                                 sprintf(buf, fmt, i);
  147.                                 dc.DrawText(buf, w, rcd, DT_LEFT|DT_TOP|DT_SINGLELINE|DT_NOPREFIX);
  148.                                 rcd.TopLeft().y += m_lineHeight;
  149.                         }
  150.                 }
  151.                 if(m_bShowHex)
  152.                 {
  153.                         y = 0;
  154.                         CRect rcd = rc;
  155.                         rcd.TopLeft().x = x = m_offHex;

  156.                         if(m_selStart != 0xffffffff && (m_currentMode == EDIT_HIGH || m_currentMode == EDIT_LOW))
  157.                         {
  158.                                 int         i;
  159.                                 int         n = 0;
  160.                                 int         selStart = m_selStart, selEnd = m_selEnd;
  161.                                 if(selStart > selEnd)
  162.                                         selStart ^= selEnd ^= selStart ^= selEnd;

  163.                                 for(i = m_topindex; (i < selStart) && (y < height); i++)
  164.                                 {
  165.                                         char* p = &buf[0];
  166.                                         TOHEX(m_pData[i], p);
  167.                                         *p++ = ' ';
  168.                                         dc.TextOut(x, y, buf, 3);
  169.                                         x += m_nullWidth * 3;
  170.                                         n++;
  171.                                         if(n == m_bpr)
  172.                                         {
  173.                                                 n = 0;
  174.                                                 x = m_offHex;
  175.                                                 y += m_lineHeight;
  176.                                         }
  177.                                 }
  178.                                 dc.SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));
  179.                                 dc.SetBkColor(GetSysColor(COLOR_HIGHLIGHT));
  180.                                 for(; (i < selEnd) && (i < m_length) && (y < height); i++)
  181.                                 {
  182.                                         char* p = &buf[0];
  183.                                         TOHEX(m_pData[i], p);
  184.                                         *p++ = ' ';
  185.                                         dc.TextOut(x, y, buf, 3);
  186.                                         x += m_nullWidth * 3;
  187.                                         n++;
  188.                                         if(n == m_bpr)
  189.                                         {
  190.                                                 n = 0;
  191.                                                 x = m_offHex;
  192.                                                 y += m_lineHeight;
  193.                                         }
  194.                                 }
  195.                                 dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
  196.                                 dc.SetBkColor(GetSysColor(COLOR_WINDOW));
  197.                                 for(; (i < m_length) && (y < height); i++)
  198.                                 {
  199.                                         char* p = &buf[0];
  200.                                         TOHEX(m_pData[i], p);
  201.                                         *p++ = ' ';
  202.                                         dc.TextOut(x, y, buf, 3);
  203.                                         x += m_nullWidth * 3;
  204.                                         n++;
  205.                                         if(n == m_bpr)
  206.                                         {
  207.                                                 n = 0;
  208.                                                 x = m_offHex;
  209.                                                 y += m_lineHeight;
  210.                                         }
  211.                                 }
  212.                         }
  213.                         else
  214.                         {
  215.                                 for(int         i = m_topindex; (i < m_length) && (rcd.TopLeft().y < height);)
  216.                                 {
  217.                                         char* p = &buf[0];
  218.                                         for(int         n = 0; (n < m_bpr) && (i < m_length); n++)
  219.                                         {
  220.                                                 TOHEX(m_pData[i], p);
  221.                                                 *p++ = ' ';
  222.                                                 i++;
  223.                                         }
  224.                                         while(n < m_bpr)
  225.                                         {
  226.                                                 *p++ = ' ';        *p++ = ' ';        *p++ = ' ';
  227.                                                 n++;
  228.                                         }

  229.                                         dc.DrawText(buf, m_bpr*3, rcd, DT_LEFT|DT_TOP|DT_SINGLELINE|DT_NOPREFIX);
  230.                                         rcd.TopLeft().y += m_lineHeight;
  231.                                 }
  232.                         }
  233.                 }
  234.                 if(m_bShowAscii)
  235.                 {
  236.                         y = 0;
  237.                         CRect rcd = rc;
  238.                         rcd.TopLeft().x = x = m_offAscii;
  239.                         if(m_selStart != 0xffffffff && m_currentMode == EDIT_ASCII)
  240.                         {
  241.                                 int         i;
  242.                                 int         n = 0;
  243.                                 int         selStart = m_selStart, selEnd = m_selEnd;
  244.                                 if(selStart > selEnd)
  245.                                         selStart ^= selEnd ^= selStart ^= selEnd;

  246.                                 for(i = m_topindex; (i < selStart) && (y < height); i++)
  247.                                 {
  248.                                         buf[0] = isprint(m_pData[i]) ? m_pData[i] : '.';
  249.                                         dc.TextOut(x, y, buf, 1);
  250.                                         x += m_nullWidth;
  251.                                         n++;
  252.                                         if(n == m_bpr)
  253.                                         {
  254.                                                 n = 0;
  255.                                                 x = m_offAscii;
  256.                                                 y += m_lineHeight;
  257.                                         }
  258.                                 }
  259.                                 dc.SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));
  260.                                 dc.SetBkColor(GetSysColor(COLOR_HIGHLIGHT));
  261.                                 for(; (i < selEnd) && (y < height); i++)
  262.                                 {
  263.                                         buf[0] = isprint(m_pData[i]) ? m_pData[i] : '.';
  264.                                         dc.TextOut(x, y, buf, 1);
  265.                                         x += m_nullWidth;
  266.                                         n++;
  267.                                         if(n == m_bpr)
  268.                                         {
  269.                                                 n = 0;
  270.                                                 x = m_offAscii;
  271.                                                 y += m_lineHeight;
  272.                                         }
  273.                                 }
  274.                                 dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
  275.                                 dc.SetBkColor(GetSysColor(COLOR_WINDOW));
  276.                                 for(; (i < m_length) && y < height; i++)
  277.                                 {
  278.                                         buf[0] = isprint(m_pData[i]) ? m_pData[i] : '.';
  279.                                         dc.TextOut(x, y, buf, 1);
  280.                                         x += m_nullWidth;
  281.                                         n++;
  282.                                         if(n == m_bpr)
  283.                                         {
  284.                                                 n = 0;
  285.                                                 x = m_offAscii;
  286.                                                 y += m_lineHeight;
  287.                                         }
  288.                                 }
  289.                         }
  290.                         else
  291.                         {
  292.                                 for(int         i = m_topindex; (i < m_length) && (rcd.TopLeft().y < height);)
  293.                                 {
  294.                                         char* p = &buf[0];
  295.                                         for(int         n = 0; (n < m_bpr) && (i < m_length); n++)
  296.                                         {
  297.                                                 *p++ = isprint(m_pData[i]) ? m_pData[i] : '.';
  298.                                                 i++;
  299.                                         }
  300.                                         dc.DrawText(buf, n, rcd, DT_LEFT|DT_TOP|DT_SINGLELINE|DT_NOPREFIX);
  301.                                         rcd.TopLeft().y += m_lineHeight;
  302.                                 }
  303.                         }
  304.                 }
  305.         }
  306.         pdc.BitBlt(0, 0, rc.Width(), rc.Height(), &dc, 0, 0, SRCCOPY);
  307. }

  308. void CHexEdit::OnSetFocus(CWnd* pOldWnd)
  309. {
  310.         if(m_pData && !IsSelected())
  311.         {
  312.                 if(m_editPos.x == 0 && m_bShowAddress)
  313.                         CreateAddressCaret();
  314.                 else
  315.                         CreateEditCaret();
  316.                 SetCaretPos(m_editPos);
  317.                 ShowCaret();
  318.         }
  319.         CWnd::OnSetFocus(pOldWnd);
  320. }

  321. void CHexEdit::OnKillFocus(CWnd* pNewWnd)
  322. {
  323.         DestroyCaret();
  324.         CWnd::OnKillFocus(pNewWnd);
  325. }

  326. void CHexEdit::OnSize(UINT nType, int cx, int cy)
  327. {
  328.         CEdit::OnSize(nType, cx, cy);
  329. }

  330. void CHexEdit::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  331. {
  332.         pScrollBar;
  333.         if(!m_pData)
  334.                 return;

  335.         int oa = m_topindex;
  336.         switch(nSBCode)
  337.         {
  338.                 case SB_LINEDOWN:
  339.                         if(m_topindex < m_length - m_lpp*m_bpr)
  340.                         {
  341.                                 //ScrollWindow(0, -m_lineHeight, rc);
  342.                                 m_topindex += m_bpr;
  343.                                 RedrawWindow();
  344.                         }
  345.                         break;
  346.                
  347.                 case SB_LINEUP:
  348.                         if(m_topindex > 0)
  349.                         {
  350.                                 //ScrollWindow(0, m_lineHeight, rc);
  351.                                 m_topindex -= m_bpr;
  352.                                 RedrawWindow();
  353.                         }
  354.                         break;
  355.                
  356.                 case SB_PAGEDOWN:
  357.                         if(m_topindex < m_length - m_lpp*m_bpr)
  358.                         {
  359.                                 m_topindex += m_bpr * m_lpp;
  360.                                 if(m_topindex > m_length - m_lpp*m_bpr)
  361.                                         m_topindex = m_length - m_lpp*m_bpr;
  362.                                 RedrawWindow();
  363.                         }
  364.                         break;

  365.                 case SB_PAGEUP:
  366.                         if(m_topindex > 0)
  367.                         {
  368.                                 m_topindex -= m_bpr * m_lpp;
  369.                                 if(m_topindex < 0)
  370.                                         m_topindex = 0;
  371.                                 RedrawWindow();
  372.                         }
  373.                         break;

  374.                 case SB_THUMBTRACK:
  375.                         m_topindex = nPos * m_bpr;
  376.                         RedrawWindow();
  377.                         break;
  378.         }
  379.         ::SetScrollPos(this->m_hWnd, SB_VERT, m_topindex / m_bpr, TRUE);
  380.         if(!m_bNoAddressChange)
  381.                 m_currentAddress += (m_topindex - oa);
  382.         RepositionCaret(m_currentAddress);
  383. }

  384. void CHexEdit::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  385. {
  386.         nSBCode;nPos; pScrollBar;
  387. }

  388. UINT CHexEdit::OnGetDlgCode()
  389. {
  390.         return DLGC_WANTALLKEYS;
  391. }

  392. BOOL CHexEdit::PreCreateWindow(CREATESTRUCT& cs)
  393. {
  394.         cs.style |= WS_HSCROLL|WS_VSCROLL;
  395.         return CEdit::PreCreateWindow(cs);
  396. }

  397. BOOL CHexEdit::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
  398. {
  399.         dwStyle |= WS_HSCROLL|WS_VSCROLL;
  400.         BOOL bRet = CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
  401.         if(bRet)
  402.                 SetFont(&m_Font);
  403.         return bRet;
  404. }

  405. BOOL CHexEdit::OnEraseBkgnd(CDC* pDC)
  406. {
  407.         pDC;
  408.         return TRUE;
  409. }

  410. void CHexEdit::SetOptions(BOOL a, BOOL h, BOOL c, BOOL w)
  411. {
  412.         m_bShowHex                = h;
  413.         m_bShowAscii        = c;
  414.         m_bShowAddress        = a;
  415.         m_bAddressIsWide= w;                // 4/8 byte address
  416.         m_bUpdate                = TRUE;
  417. }

  418. void CHexEdit::SetBPR(int bpr)
  419. {
  420.         m_bpr = bpr;
  421.         m_bUpdate                = TRUE;
  422. }

  423. void CHexEdit::OnLButtonDown(UINT nFlags, CPoint point)
  424. {
  425.         SetFocus();
  426.         if(!m_pData)
  427.                 return;

  428.         if(nFlags & MK_SHIFT)
  429.         {
  430.                 m_selStart = m_currentAddress;
  431.         }
  432.         CPoint pt = CalcPos(point.x, point.y);
  433.         if(pt.x > -1)
  434.         {
  435.                 m_editPos = pt;
  436.                 pt.x *= m_nullWidth;
  437.                 pt.y *= m_lineHeight;
  438.                
  439.                 if(pt.x == 0 && m_bShowAddress)
  440.                         CreateAddressCaret();
  441.                 else
  442.                         CreateEditCaret();

  443.                 SetCaretPos(pt);
  444.                 if(nFlags & MK_SHIFT)
  445.                 {
  446.                         m_selEnd = m_currentAddress;
  447.                         if(m_currentMode == EDIT_HIGH || m_currentMode == EDIT_LOW)
  448.                                 m_selEnd++;
  449.                         RedrawWindow();
  450.                 }
  451.         }
  452.         if(!(nFlags & MK_SHIFT))
  453.         {
  454.                 if(DragDetect(this->m_hWnd, point))
  455.                 {
  456.                         m_selStart = m_currentAddress;
  457.                         m_selEnd   = m_selStart;
  458.                         SetCapture();
  459.                 }
  460.                 else
  461.                 {
  462.                         BOOL bsel = m_selStart != 0xffffffff;

  463.                         m_selStart = 0xffffffff;
  464.                         m_selEnd   = 0xffffffff;
  465.                         if(bsel)
  466.                                 RedrawWindow();
  467.                 }
  468.         }
  469.         if(!IsSelected())
  470.         {
  471.                 ShowCaret();
  472.         }
  473. }

  474. void CHexEdit::OnLButtonDblClk(UINT nFlags, CPoint point)
  475. {
  476.         nFlags; point;
  477. }

复制代码

回复

使用道具 举报

快速回复 返回列表 客服中心 搜索