CSkin博客

标题: 【C#十六进制显示器】编写的十六进制显示控件 [打印本页]

作者: crystal_lz    时间: 2014-11-13 22:42
标题: 【C#十六进制显示器】编写的十六进制显示控件
效果图:

介绍:

说明:
1.说说思路吧 首先你得有数据吧?所以控件必然有个属性为byte[]类型,而控件需要做的就是将这个byte数组的数据绘制出来,如同刚才上面说的。
如果只是展示不需要选中什么的 很好处理,直接DrawString就行了每行取出byte数组的十六个数据:
[C#] 纯文本查看 复制代码
g.DrawString(addr.ToString("X").PadLeft(8,'0') + "  " 
    + BitConverter.ToString(byte[],index,len).Replace('-',' ')
    + "  " + Encoding.ASCII.GetString(byte[],index,len));


2.差不多就是上面的代码,但是由于这里我需要选中,所以我要知道我鼠标点下的时候,在那个数据上。
所以我需要知道每个绘制的数据的坐标,所以我的做法就是,每个数据每个数据的绘制,虽然影响效率不过也没啥了,所以我在代码中放了两个变量:
[C#] 纯文本查看 复制代码
/// <summary>
/// 16进制数据每个字符的偏移量
/// </summary>
protected int[] m_nArrHexLeftOffset;
/// <summary>
/// ASCII数据每个字符的偏移量
/// </summary>
protected int[] m_nArrAscLeftOffset;


3.两个的长度都是16,分别保存十六进制和ASCII字符所需要绘制的X坐标、Y坐标我不需要保存因为有字体的Height属性。
每绘制一行Y坐标+=一个字体的Height就行了,鼠标点击的时候,也可以知道点击在第几行的字上面。
所以绘制的代码我是差不度这样的:
[C#] 纯文本查看 复制代码
protected virtual void DrawHex(Graphics g) {
    int len = this._TopLineStartIndex + m_nLinesForDraw;
    if (len > m_nLineCount) len = m_nLineCount;
    for (int i = this._TopLineStartIndex; i < len; i++) {
        string strDraw = (this._StartAddr + i * 16).ToString("X").PadLeft(8, '0') + "  ";
        //g.DrawString(strDraw, this.Font, Brushes.Blue, this._LeftOffset,
        //(i - this._TopLineStartIndex + 1) * this.Font.Height);
        //百度网盘那个用的是上面这句 自己改  csdn的是下面这句
        TextRenderer.DrawText(g, strDraw, this.Font, new Point(this._LeftOffset,
            (i - this._TopLineStartIndex + 1) * this.Font.Height), this._AddrColor);
        int index = i * 16;
        for (int j = 0; j < 16; j++) {
            TextRenderer.DrawText(g, this._ByteData[index].ToString("X")
                    .PadLeft(2, '0'), this.Font,
                new Point(m_nArrHexLeftOffset[j] + this._LeftOffset,
                    (i - this._TopLineStartIndex + 1) * this.Font.Height),
                clrHexForeColor, clrHexBackColor);
            TextRenderer.DrawText(g,
                    ((char)(this._ByteData[index] == 0 ? (byte)'.' : this._ByteData[index]))
                        .ToString(), this.Font,
                new Point(m_nArrAscLeftOffset[j] + this._LeftOffset, (
                    i - this._TopLineStartIndex + 1) * this.Font.Height),
                clrASCIIForeColor, clrASCIIBackColor);
            if (++index == this._ByteData.Length) return;
        }
    }
}


4.其他具体细节自己看源码吧
博文来自:http://www.clzf.co/blog.php?id=29

案例源码下载: HexBoxControl.rar (82.32 KB, 下载次数: 125, 售价: 1 金钱)

作者: hhjj331    时间: 2014-11-22 22:20
太贵了啊·!!
作者: 胡帅    时间: 2014-11-29 18:28

作者: hambor    时间: 2014-12-29 20:02
不错,支持楼主!
作者: thinhils    时间: 2014-12-30 11:07
大哥,錢都給你了
作者: gts    时间: 2016-9-26 02:06
下载备用,多谢提供!
作者: wtf3505    时间: 2016-10-25 00:16
初学者下载学习下
作者: Liam    时间: 2016-11-4 22:57
666666666
作者: xifengcanyue    时间: 2017-1-12 20:03
虽然没用到,不过在其他方面倒是有些启发
作者: livehu5188    时间: 2017-10-30 22:56
钱都不够了哎
作者: whble    时间: 2018-10-2 12:21
正好需要 感谢
作者: whble    时间: 2018-10-2 12:22
正好需要 谢谢
作者: 881966    时间: 2018-12-4 18:59
谢谢分享,学习学习
作者: 881966    时间: 2018-12-6 13:24
谢谢分享,下载收藏
作者: lucky500    时间: 2018-12-28 03:54
谢谢 楼主的分享啊
作者: jacksonwong    时间: 2019-5-25 12:01
谢谢分享!
作者: cheng_5230    时间: 2020-6-18 11:28
支持谢谢。
作者: 维以不永伤    时间: 2020-8-29 22:57
不错哈。。。。。。。。




欢迎光临 CSkin博客 (http://bbs.cskin.net/) Powered by Discuz! X3.2