C# 十六进制显示界面 WinHex类似界面 转换十六进制显示 编程器界面显示源代码

界面展示
C# 十六进制显示界面 WinHex类似界面 转换十六进制显示 编程器界面显示源代码_第1张图片
代码展示:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
//若有不明白的地方可以咨询qq457452016   欢迎交流
namespace 编程器//---------命名空间
{
    public partial class hex : UserControl   //公共部分类
    {
        //private--私有
        private string fileName = "";//--------------------------打开的文件名字保存起来------------ok
        private byte[] fileBytes = null;//------------------------定义数组--保存缓存文件---------------------ok
        private Font cFont = new Font("Consolas", 9);//----------Consolas---是一套等宽字体的字型,属无衬线字体==所有字符串显示字体----ok
        private int startLine = 0; //滚动条最小值,存储滚动条的动态值
        private int totalLines =1;//滚动条最大值
        const int WHEEL_DELTA = 120;//-----鼠标滚动的固定值-固定分辨率--------------------ok
        private int numBytesInLine = 32;//获取此参数设置滚动条的最大值------------------------------
        private int numBytesInLine2 = 32;//单行显示字符个数---单行显示字符串个数设置---------------------------
        private int hSpacing = 2;//边框与地址间距   FF  FF  之间的间距设置-----------ok
        private int vSpacing = 1;//字符串--上下字符的间距---------------------------ok
        private int xStart; //"0x00000000"   宽度
        private int yStart;//----------------高度                                                                                      
        private SizeF byteSize; // 00 字体所占用的xy大小,,,SizeF=存储矩形的高度和宽度--用来获取字体的大小---ok
        private int byte8 = 1;//-------文件大小显示B
        private int KB1024 = 1;//------文件大小显示KB
        private int LineHeight //获取  00字体高度+上下间距
        { get { return (int)Math.Ceiling(byteSize.Height + vSpacing); } }//byteSize.Height==字体的高度//vSpacing=1
        private int ColumnWidth//获取  00字体宽度+左右间距
        { get { return (int)Math.Ceiling(byteSize.Width + hSpacing); }  }//byteSize.Width==字体的宽度//hSpacing=2
        public int NumBytesInLine//--------
        {
            get { return numBytesInLine; }//-加载文件-第二步----获取此参数定义滚动条的最大值
            set { numBytesInLine = value; }
        }
        public hex()//程序入口函数---
        {
            InitializeComponent();
            //以下下代码控制屏幕刷新----------去掉会出现闪烁
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);//忽略窗口消息,减少闪烁
            SetStyle(ControlStyles.UserPaint, true);//控件自行绘制,而不是通过操作系统
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);//控件首先在缓存区绘制,而不是在屏幕上,这样减少闪烁
            SetStyle(ControlStyles.ResizeRedraw, true);//调整大小时重新绘制控件    
            SetStyle(ControlStyles.UserMouse, true);//控件完成自己的鼠标处理,因而鼠标事件不由操作系统处理。
            ComputeMetrics();//-----------字体字符测量函数---- 测量字体高度和宽度
        }//------------------------ComputeMetrics();//-----------字体字符测量函数---- 测量字体高度和宽度
        private void ComputeMetrics()//-----------字体字符测量函数 测量字体高度和宽度
        {
            var g = CreateGraphics();//为控件创建一个界面==绘图
            byteSize = g.MeasureString("00", cFont);//SizeF=存储有序浮点数,矩形----测量字体(00)所占的空间=高度和宽度===================后面显示其他时候备用
                                                    // xStart = (int)g.MeasureString("0x00000000", cFont).Width + hSpacing * 3;
            xStart = (int)g.MeasureString("0x00000000", cFont).Width + hSpacing;//xStart=0x00000000的宽度+1间距
            yStart = 1;
        }//--------------- yStart = 1;

        public string FileName//-----------------加载文件-第一步-----------------public=公众的---------------------------地址名字传递给这个位置
        {
            get { return fileName; } //-----------------------------获取名字
            set                      //--------------------------------------------------设置名字
            {
                if (value != null) fileName = value;
                else fileName = "";
               
               if (fileName.Length > 0) LoadFile(fileName);//-----------------地址名字不为空--启动   LoadFile(fileName)
            }
        }
        private void LoadFile(string fileName)//-加载文件-第二步-----------------private=私有的---------------
        {
            textBox1.Text = "";//清空text
            fileBytes = File.ReadAllBytes(fileName);//----File.ReadAllBytes--函数读取全部字节--打开二进制文件内容-全部读取到数组
            totalLines = fileBytes.Length / NumBytesInLine;//--设置滚动条最大位置====字节数/每行占的字节数,NumBytesInLine=32
            vScrollBar1.Minimum = 0;//--------------------设置滚动条最小位置
            vScrollBar1.Maximum = totalLines;//-----------设置滚动条最大位置
            vScrollBar1.Value = 0;//----------------------滚动条位置设置为0
            byte8 = fileBytes.Length;//获取字节数
            textBox1.Text = byte8.ToString() + "=byte=FF=8Bit      ";//显示字节数字
            KB1024 = byte8 / 1024;
            textBox1.Text += KB1024.ToString() + "KB      ";//显示KB
            KB1024 = KB1024 / 1024;
            textBox1.Text += KB1024.ToString() + "MB";//显示MB
            Refresh();//------------Refresh()--------------------- Refresh()----------------调用函数
        }//--------最后调用刷新函数---Refresh()-----------加载文件--和名字
        public override void Refresh()//---------加载文件-第三步----------执行刷新服务
        {
            base.Refresh();//重写刷新方法
        }//刷新-------override==覆盖了一个方法并且对其重写------------
        protected override void OnMouseWheel(MouseEventArgs e)//-鼠标滚动事件发生----protected=受保护的
        {
            base.OnMouseWheel(e);//----------重写-鼠标滚动事件
            int offset = e.Delta / WHEEL_DELTA;//--------鼠标转动值/120--------鼠标初始值120-----------120固定值
            if (Control.ModifierKeys.HasFlag(Keys.Control)) offset *= 32;//如果按住ctrl--加速转动,一次滚动32行
            StartLine -= offset;//------//StartLine-offset=-StartLine//--将滚动后的数字传递给滚动条当前位置                 
        }override==覆盖了一个方法并且对其重写

        private int StartLine//---设置滚动条的位置---------滚动条开始位置---
        {
            get { return startLine; }
            set
            {
                if (value < 0) startLine = 0;//startLine=滚动条最小值,设置滚动条的最小值

                else if (value >= totalLines - 1) startLine = totalLines - 1;//totalLines=滚动条最大值,设置滚动条的最大值

                else startLine = value;//滚动条的现在值

                vScrollBar1.Value = startLine;//------------------传递给滚动条
                Refresh();//------------------------刷新
            }
        }


        protected override void OnPaint(PaintEventArgs e)//获取要在其中进行绘画的矩形。-----------protected=受保护的-override=覆盖--------
        {
            base.OnPaint(e);//重新创建此控件---油漆事件?----e=Drawing
            var g = e.Graphics;//---获取用于绘制的图形------------------------------e=画布
            //public Graphics Graphics { get; }=用于绘画的 System.Drawing.Graphics 对象                              
            g.FillRectangle(Brushes.LightGray, e.ClipRectangle);//填充矩形内部颜色--Brushes.LightGray=浅灰色-----------------------------背景颜色
            //解释:填充 System.Drawing.Rectangle 结构指定的矩形的内部。
            // 参数1:确定填充特性的 System.Drawing.Brush。
            //参数2:System.Drawing.Rectangle 结构,它表示要填充的矩形。
            if (fileBytes != null)//    判断字符串数组内容不为空
            {
                int y = yStart;//定义y轴开始位置      yStart=1=------0000----------高度   
                int line = StartLine;//滚动条最小值,存储滚动条的动态值
                while (y < e.ClipRectangle.Bottom)//字体高度 小于 底部==为真,执行循环
                {
                    //lineAddress=地址字符串  
                   int lineAddress = numBytesInLine * line;//numBytesInLine=====32 *  滚动条最小值或者滚动条的动态值

                     //转换成十六进制 填充到8位  转换成大写                                  
                   var addrString = "0x" + Convert.ToString(lineAddress, 16).PadLeft(8, '0').ToUpper();//地址栏==数据设置

                    //绘制字符串-------------------------地址栏数据绘制
                    //参数1--地址字符串
                    //参数2字体cFont
                    //参数3-字体颜色   --Brushes.Black
                    //参数4坐标--PointF(x,y)            --hSpacing=1=边框与地址间距,Y=yStart=1
                    g.DrawString(addrString, cFont, Brushes.Black, new PointF(hSpacing, y));
               

                    for (int i = 0; i < numBytesInLine2; ++i)//-numBytesInLine2=   单行显示字符串个数设置      -------字符串循环显示函数---------numBytesInLine=32
                    {
                        int pos = i + numBytesInLine * line;//(line=滚动条的动态值)*(numBytesInLine=32)+i=行数值
                        if (pos >= fileBytes.Length) break;//pos   大于或者等于字符串值--退出


                        //显示文字调用4--坐标
                        //xStart==="0x00000000" 后面的x坐标值      宽度
                        //ColumnWidth =00   后面的x坐标值          宽度
                        //y轴开始位置=1
                        var point = new Point(xStart + i * ColumnWidth, y);
                        //提取要显示的字符串
                        //(line=滚动条的动态值)*(numBytesInLine=32)+i=行数值                                                                                                                                  
                        var byt = fileBytes[pos];
                        //显示文字调用1    转换成十六进制字符串----填充2位---转换成大写     
                        var byteString = Convert.ToString(byt, 16).PadLeft(2, '0').ToUpper();//ToUpper()转换大写形式--PadLeft=填充                       
                        //显示文字调用3  画刷=字体颜色  Brushes.Blue=蓝色                           
                        var brush = Brushes.Blue;
                                                 // if (byt == 0) brush = Brushes.Gray;//Gray=灰色---判断字符是00,显示灰色
                        g.DrawString(byteString, cFont, brush, point);//显示标记的字符串
                        //参数1字符串---参数2字体--参数3画刷颜色---参数 4布局
                        //参数2字体cFont=Consolas---是一套等宽字体的字型,属无衬线字体==所有字符串显示字体
                        //参数3画刷
                        //参数4坐标
                    }

                    line++;//(line=滚动条的动态值)
                    y += LineHeight;//LineHeight=00字体高度
                }
            }
        }//override==覆盖了一个方法并且对其重写-------------------------ok






    }// public partial class hex : UserControl-结束
}//全局大括号

你可能感兴趣的:(c#)