仙五前修改吧 关注:172贴子:15,453

C#学习笔记

只看楼主收藏回复

其实就是记录一些百度到的七七八八的东西,以便以后使用更方便


IP属地:浙江1楼2015-04-04 18:19回复
    上面画的矩形,画完之后松开就没有了。我曾一句句去注释,没发现哪一句是把矩形弄消失的,经过思考和研究认为,ControlPaint.DrawReversibleFrame的特点就是这样,矩形难以存留。不过以上代码已经把画的矩形记录下来了,有没有办法再画一个,让他永久留下呢?
    试想一张纸上有一幅图,我们在上面画矩形,有两张方法:
    一是直接拿笔画,相对应的有ControlPaint.Border或者pictureBox1.DrawRectangle。悲剧的是这是不可逆操作,画脏了怎么办?要清楚,只能把图重新加载过。另外还有一个Graphics.Save偏方,也是要重新加载的,万一这期间用户换了张图怎么办?所以这种方法不可取。
    二是拿张矩形边框的纸盖上去,相对应的就是使用带边框的panel或者picturebox控件盖上去,好处在于要消失消失,要出现出现,还可随意移动,十分灵活。悲剧的是,纸是不透明的——你画的矩形,是实心的。当然你可以想办法把控件的背景调成Transparent,或者干脆载一张alpha通道全黑的图来使其透明。但这并没有用,因为透明控件显示的是其父控件的内容,我们加载图的控件是picturebox,它不可能作为父控件。
    因此我并没有找到一个十分合适的方法,画了矩形立马消失,那就消失吧....


    IP属地:浙江4楼2015-04-04 19:01
    回复
      加载非主流图形,或者说更好的加载图像:
      这里得拜谢下http://bbs.csdn.net/topics/390510431 的12楼,为了回答这个帖子的问题,这位前辈研究了FreeImage库的使用方法,并且写出了源代码,我们只要下载他的文件就可以了……
      移植使用方法:
      把他的示例中bin\release下的freeimagenet.dll和freeimage.dll拿到自己的bin\release(dubug)下,在解决方案中引用freeimagenet.dll。然后新建一个类,把他的类FreeImageToBitmap.cs所有代码拷贝到你的解决方案中,注意要使用unsafe编译。
      在主窗体中,使用internal Bitmap Bmp;要从文件获得位图Bitmap,就Bmp = (Bitmap)FreeImageToBitmap.LoadImageFormFreeImage(file);
      要加载,就pictureBox1.Image=Bmp。他给的源代码是用的Canvas,这玩意我不会用,弄了一个小时没弄出来


      IP属地:浙江5楼2015-04-04 19:12
      回复
        读二进制文件:
        C#入门经典上介绍了两种处理文件的方法,一个是FileStream,一个是StreamReader/Writer,前者可以读取文件指针位置,可以移动指针,但只能读写字节或者字节数组;后者可以按各种类型的数据读写,但不能移动指针。这两种方式显然都不好用。
        我是搜索了好久才发现一个俱全的方法:使用BinaryReader/Writer。
        Binary读取数据的能力很强,有各种类型可以读,但是读字符串的方式比较诡异,必须要字符串前面有个单字节整数表示长度,所以可以这样来读取定长字符串:
        byte[] chs = uv.ReadBytes(count);
        string str = Encoding.GetEncoding("GB2312").GetString(chs);
        先写到一个字节数组里面,再转成字符串。其中转字符串用到了GB2312编码,目测五前所有文件都这么编码的。一开始用的默认编码,因为以为uvlist的路径都是英文,所以怎么读都不成功,直到发现了一个“测试",我晕啊。
        要从字符串还原为字符数组,用
        byte[] chs = Encoding.GetEncoding("GB2312").GetBytes((string)str);
        注意这个还原是默认带上'\0'的,也就是chs.Length是一般的字符串长度加上1,正好和uvlist一致。一开始我以为要手动加,所以也一直操作失败来着。
        Binary还可以获取指针位置或者移动指针,与指针相关的操作为BinaryReader.BaseStream,比如BinaryReader.BaseStream.Seek(12, SeekOrigin.Begin);
        BinaryReader.BaseStream.Position(返回long型)


        IP属地:浙江6楼2015-04-04 19:23
        回复
          绘ComboBox
          我读文件,一个个条目绘到ComboBox中。第一份成果,str修改器,读2W条数据居然要五分钟,我当时对计算机的运行速度没有准确把握,认为这是正常的,后来一步步注释,才发现居然是这个地方出了问题,真是完全没有想到。
          在MSDN发现ComboBox方法里面有一个叫做BeginUpdate的东西,用了之后ComboBox会暂停绘制,再用EndUpdate就会一次性绘制好。问题就在这里,如果你不这样操作,每次添加条目时,ComboBox都会被重新画一次,条目多了自然耗时间就长了。五分钟到三秒钟,就这个障碍而已。


          IP属地:浙江7楼2015-04-04 19:27
          回复
            新建的窗体,如果是ShowDialog,那么新窗体使用Close不会自动Dispose
            (真的假的?)


            IP属地:浙江9楼2015-04-04 19:53
            回复
              http://pan.baidu.com/s/1c0rTJzi
              Compress类,利用内置的压缩和解压单个文件的方法,提供了压缩文件夹或者文件组的功能,并可以解压。
              GZip.Decompress(压缩包所在目录,解压的目录,压缩包名字)。后面还有几个参数也可填,不填默认为覆盖已存在文件(但不会覆盖文件夹,相当于合并操作)。
              GZip.Compress是压缩,类中已经自带提示。


              IP属地:浙江10楼2015-04-26 17:04
              收起回复
                之前百度到一个类,封装了ReadProcessMemory和WriteProcessMemory等API用来做内存修改器。
                但是他只能读int32很不好用,我得自己写函数,读了整数后转换成字节数组,再转换成需要的格式……
                下面是我百度了很久才写出来的一个类,支持各大格式
                其实很简单,使用unsafe编程就可以用c语言的方法了。


                IP属地:浙江13楼2015-06-24 22:37
                回复
                  unsafe class Memory
                  {
                  private static int hProcess;
                  #region API
                  [DllImport("kernel32.dll")]
                  public static extern bool ReadProcessMemory
                  (
                  int hProcess,
                  int lpBaseAddress,
                  void* lpBuffer,
                  int nSize,
                  int *lpNumberOfBytesRead
                  );
                  [DllImport("kernel32.dll")]
                  public static extern bool ReadProcessMemory
                  (
                  int hProcess,
                  int lpBaseAddress,
                  char[] lpBuffer,
                  int nSize,
                  int* lpNumberOfBytesRead
                  );
                  [DllImportAttribute("kernel32.dll")]
                  public static extern bool WriteProcessMemory
                  (
                  int hProcess,
                  int lpBaseAddress,
                  void *lpBuffer,
                  int nSize,
                  int* lpNumberOfBytesWritten
                  );
                  [DllImportAttribute("kernel32.dll")]
                  public static extern bool WriteProcessMemory
                  (
                  int hProcess,
                  int lpBaseAddress,
                  char[] lpBuffer,
                  int nSize,
                  int* lpNumberOfBytesWritten
                  );
                  [DllImportAttribute("kernel32.dll")]
                  public static extern int OpenProcess
                  (
                  int dwDesiredAccess,
                  bool bInheritHandle,
                  int dwProcessId
                  );
                  #endregion
                  public static bool GetProcessByName(string processName)
                  {
                  Process[] arrayProcess = Process.GetProcessesByName(processName);
                  foreach (Process p in arrayProcess)
                  {
                  hProcess = OpenProcess(0x1F0FFF, false, p.Id);
                  return true;
                  }
                  return false;
                  }
                  public static int ReadInt32(int lpBaseAddress)
                  {
                  int num;
                  int temp;
                  ReadProcessMemory(hProcess, lpBaseAddress, &num, sizeof(int), &temp);
                  return num;
                  }
                  public static float ReadSingle(int lpBaseAddress)
                  {
                  float num;
                  int temp;
                  ReadProcessMemory(hProcess, lpBaseAddress, &num, sizeof(float), &temp);
                  return num;
                  }
                  public static double ReadDouble(int lpBaseAddress)
                  {
                  double num;
                  int temp;
                  ReadProcessMemory(hProcess, lpBaseAddress, &num, sizeof(double), &temp);
                  return num;
                  }
                  public static string ReadString(int lpBaseAddress, int bytenum)
                  {
                  char[] s = new char[bytenum];
                  int temp;
                  ReadProcessMemory(hProcess, lpBaseAddress, s, bytenum, &temp);
                  return new string(s);
                  }
                  public static void WriteMemory(int lpBaseAddress, int num)
                  {
                  int temp;
                  WriteProcessMemory(hProcess, lpBaseAddress, &num, sizeof(int), &temp);
                  }
                  public static void WriteMemory(int lpBaseAddress, float num)
                  {
                  int temp;
                  WriteProcessMemory(hProcess, lpBaseAddress, &num, sizeof(float), &temp);
                  }
                  public static void WriteMemory(int lpBaseAddress, double num)
                  {
                  int temp;
                  WriteProcessMemory(hProcess, lpBaseAddress, &num, sizeof(double), &temp);
                  }
                  public static void WriteMemory(int lpBaseAddress, string s)
                  {
                  int temp;
                  char[] cs = s.ToArray();
                  WriteProcessMemory(hProcess, lpBaseAddress,cs, sizeof(int), &temp);
                  }
                  }


                  IP属地:浙江14楼2015-06-24 23:03
                  收起回复
                    新建一个类,比如叫做ListViewHelper,然后输入以下内容
                    using System;
                    using System.Collections.Generic;
                    using System.Linq;
                    using System.Text;
                    namespace 命名空间
                    {
                    /// <summary>
                    /// 对ListView点击列标题自动排序功能
                    /// </summary>
                    public class ListViewHelper
                    {
                    /// <summary>
                    /// 构造函数
                    /// </summary>
                    public ListViewHelper()
                    {
                    //
                    // TODO: 在此处添加构造函数逻辑
                    //
                    }
                    public static void ListView_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
                    {
                    System.Windows.Forms.ListView lv = sender as System.Windows.Forms.ListView;
                    // 检查点击的列是不是现在的排序列.
                    if (e.Column == (lv.ListViewItemSorter as ListViewColumnSorter).SortColumn)
                    {
                    // 重新设置此列的排序方法.
                    if ((lv.ListViewItemSorter as ListViewColumnSorter).Order == System.Windows.Forms.SortOrder.Ascending)
                    {
                    (lv.ListViewItemSorter as ListViewColumnSorter).Order = System.Windows.Forms.SortOrder.Descending;
                    }
                    else
                    {
                    (lv.ListViewItemSorter as ListViewColumnSorter).Order = System.Windows.Forms.SortOrder.Ascending;
                    }
                    }
                    else
                    {
                    // 设置排序列,默认为正向排序
                    (lv.ListViewItemSorter as ListViewColumnSorter).SortColumn = e.Column;
                    (lv.ListViewItemSorter as ListViewColumnSorter).Order = System.Windows.Forms.SortOrder.Ascending;
                    }
                    // 用新的排序方法对ListView排序
                    ((System.Windows.Forms.ListView)sender).Sort();
                    }
                    }
                    /// <summary>
                    /// 继承自IComparer
                    /// </summary>
                    public class ListViewColumnSorter : System.Collections.IComparer
                    {
                    /// <summary>
                    /// 指定按照哪个列排序
                    /// </summary>
                    private int ColumnToSort;
                    /// <summary>
                    /// 指定排序的方式
                    /// </summary>
                    private System.Windows.Forms.SortOrder OrderOfSort;
                    /// <summary>
                    /// 声明CaseInsensitiveComparer类对象
                    /// </summary>
                    private System.Collections.CaseInsensitiveComparer ObjectCompare;
                    /// <summary>
                    /// 构造函数
                    /// </summary>
                    public ListViewColumnSorter()
                    {
                    // 默认按第一列排序
                    ColumnToSort = 0;
                    // 排序方式为不排序
                    OrderOfSort = System.Windows.Forms.SortOrder.None;
                    // 初始化CaseInsensitiveComparer类对象
                    ObjectCompare = new System.Collections.CaseInsensitiveComparer();
                    }
                    /// <summary>
                    /// 重写IComparer接口.
                    /// </summary>
                    /// <param name="x">要比较的第一个对象</param>
                    /// <param name="y">要比较的第二个对象</param>
                    /// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
                    public int Compare(object x, object y)
                    {
                    int compareResult;
                    System.Windows.Forms.ListViewItem listviewX, listviewY;
                    // 将比较对象转换为ListViewItem对象
                    listviewX = (System.Windows.Forms.ListViewItem)x;
                    listviewY = (System.Windows.Forms.ListViewItem)y;
                    string xText = listviewX.SubItems[ColumnToSort].Text;
                    string yText = listviewY.SubItems[ColumnToSort].Text;
                    int xInt, yInt;
                    if (int.TryParse(xText, out xInt) && int.TryParse(yText, out yInt)) //是否全为数字
                    {
                    //比较数字
                    compareResult = CompareInt(xInt, yInt);
                    }
                    else
                    {
                    //比较对象
                    compareResult = ObjectCompare.Compare(xText, yText);
                    }
                    // 根据上面的比较结果返回正确的比较结果
                    if (OrderOfSort == System.Windows.Forms.SortOrder.Ascending)
                    {
                    // 因为是正序排序,所以直接返回结果
                    return compareResult;
                    }
                    else if (OrderOfSort == System.Windows.Forms.SortOrder.Descending)
                    {
                    // 如果是反序排序,所以要取负值再返回
                    return (-compareResult);
                    }
                    else
                    {
                    // 如果相等返回0
                    return 0;
                    }
                    }
                    /// <summary>
                    /// 比较两个数字的大小
                    /// </summary>
                    /// <param name="ipx">要比较的第一个对象</param>
                    /// <param name="ipy">要比较的第二个对象</param>
                    /// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
                    private int CompareInt(int x, int y)
                    {
                    if (x > y)
                    {
                    return 1;
                    }
                    else if (x < y)
                    {
                    return -1;
                    }
                    else
                    {
                    return 0;
                    }
                    }
                    /// <summary>
                    /// 获取或设置按照哪一列排序.
                    /// </summary>
                    public int SortColumn
                    {
                    set
                    {
                    ColumnToSort = value;
                    }
                    get
                    {
                    return ColumnToSort;
                    }
                    }
                    /// <summary>
                    /// 获取或设置排序方式.
                    /// </summary>
                    public System.Windows.Forms.SortOrder Order
                    {
                    set
                    {
                    OrderOfSort = value;
                    }
                    get
                    {
                    return OrderOfSort;
                    }
                    }
                    }
                    }


                    IP属地:浙江16楼2015-07-12 17:26
                    回复
                      然后只需要
                      private void Form1_Load(object sender, EventArgs e)
                      {
                      this.listView1.ListViewItemSorter = new ListViewColumnSorter();
                      this.listView1.ColumnClick += new ColumnClickEventHandler(ListViewHelper.ListView_ColumnClick);
                      }
                      即可


                      IP属地:浙江17楼2015-07-12 17:26
                      回复
                        几点说明:
                        1.原文http://blog.csdn.net/nanwang314/article/details/6086507,被我删了一部分,就是关于IP地址判断的,我一般用不到。
                        2.比较的各项中,如果有一项并没有对应的列内容,就会出错。
                        3.比较的原理是:如果两个都是可以转换成数字的字符串,就比较数字大小(有符号int),否则按字符串方法比较。所以用的时候可能需要自行修改比较方法。


                        IP属地:浙江18楼2015-07-12 17:28
                        回复
                          用backgroundworker处理异步真是方便多了。注意: report之前要thread.sleep一下,具体时间可以测试着定,最低可以是0,称作“交出时间片”,不然UI就锁死了


                          IP属地:浙江来自Android客户端19楼2015-07-28 17:08
                          回复
                            以后还是尽量多试试WPF好了Y(^o^)Y


                            IP属地:浙江来自Android客户端20楼2015-07-28 22:00
                            回复
                              StringBuilder myInfo =new StringBuilder( "欢迎使用 ASP.NET MVC! ");
                              ///////////////////获取MYSQ看数据返回值////////////////////////////
                              MySqlConnection myconn = null;
                              MySqlCommand mycom = null;
                              MySqlDataReader myrec = null;
                              //连接字符串拼装
                              myconn = new MySqlConnection("Host = localhost;Database = test;Username = root;Password = *");
                              //连接
                              myconn.Open();
                              if (myconn.State.ToString() == "Open")
                              {
                              myInfo.AppendLine( "<br> 连接MYSQL成功");
                              }
                              //查询命令赋值,可以写多条语句,多条语句之间用;号隔开
                              mycom = new MySqlCommand("select * from world.city where Population>10000000", myconn);
                              myrec = mycom.ExecuteReader();
                              //一次次读,读不到就结束
                              while (myrec.Read())
                              {
                              myInfo .AppendLine( myrec["ID"] + " " + myrec["Name"]);
                              }
                              //////关闭相关对象
                              myrec.Close();
                              myconn.Close();
                              Console.Write(myInfo);
                              Console.ReadKey();
                              唉呀妈呀搞了一下午终于连上数据库了!!!!


                              IP属地:浙江21楼2015-09-24 17:12
                              回复