作者: crystal_lz
查看: 10034|回复: 17
打印 上一主题 下一主题

[源码] 【C#十六进制显示器】编写的十六进制显示控件

[复制链接]
跳转到指定楼层
楼主
crystal_lz 发表于 2014-11-13 22:42:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
查看: 10034|回复: 17
效果图:

介绍:
  • 因为最近需要所以写了一个,如果控件只是单纯的显示数据,不用选中什么的到是很好处理,直接g.DrawString绘制出来就是了。
  • 但是这里我全部是用的TextRenderer.DrawText() 因为貌似TextRenderer绘制文本的时候,可以带上文本背景色这样绘制选中文本就方便了。
  • 虽然可以用DrawRectangle和DrawString达到同样效果,但是太麻烦了感觉,但是很遗憾貌似TextRenderer在指定颜色的时候A通道无效。
  • 也是就是说无法绘制透明效果的文字来着,不过算了,没有人会设置透明的文字颜色吧。

说明:
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

案例源码下载:
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 转播转播
回复 论坛版权

使用道具 举报

沙发
hhjj331 发表于 2014-11-22 22:20:20 | 只看该作者
太贵了啊·!!
板凳
胡帅 发表于 2014-11-29 18:28:27 | 只看该作者
回复

使用道具 举报

地板
hambor 发表于 2014-12-29 20:02:41 | 只看该作者
不错,支持楼主!
5#
thinhils 发表于 2014-12-30 11:07:32 | 只看该作者
大哥,錢都給你了
6#
gts 发表于 2016-9-26 02:06:15 | 只看该作者
下载备用,多谢提供!
7#
wtf3505 发表于 2016-10-25 00:16:22 | 只看该作者
初学者下载学习下
8#
Liam 发表于 2016-11-4 22:57:42 | 只看该作者
666666666
回复

使用道具 举报

9#
xifengcanyue 发表于 2017-1-12 20:03:34 | 只看该作者
虽然没用到,不过在其他方面倒是有些启发
10#
livehu5188 发表于 2017-10-30 22:56:19 | 只看该作者
钱都不够了哎
您需要登录后才可以回帖 登录 | 加入CSkin博客

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|CSkin ( 粤ICP备13070794号

Powered by Discuz! X3.2  © 2001-2013 Comsenz Inc.  Designed by ARTERY.cn
GMT+8, 2024-4-24 06:06, Processed in 0.728059 second(s), 33 queries , Gzip On.

快速回复 返回顶部 返回列表