2019.01.05 Update:

自學C# 至今已經1年多了,總算是比較習慣,學了很多有的沒有的東西,網路上的資源真不少,但C#真的滿危險的,輕輕鬆鬆的就被反組譯回來,只差沒有註解看起來比較痛苦而以。至今整理了很多資料,自己寫了許多範例小程式,

 

2017.11月初開始自學C#,至今也快一個月了,從學生時期到現在都用BCB,也遇過要學Delphi,或許是同公司所產的工具,使用習慣上改變不大,但改程微軟的工具後,實在是滿不習慣的,很多實後會覺得Borland幫使用者做了不少事情,使用上就很順手,比方說刪除Method,刪除元件,大量元件命名,複製元件,拉元件位置...等初期動做,很多都是Boland 好用,就算變成XE,還是很好用。

 

廢話不多說了,先整理一下這個月有整理的筆記。

 

@的用意

              @"C:\Temp\test.txt" or "C:\\Temp\\test.txt"

 

執行檔路徑

              string str = System.Windows.Forms.Application.StartupPath;

              Result: C:\xxx\xxx

 

路徑是否存在(using System.IO)

              File.Exists(String)

 

CommaText的處理

              List<String> csv=new List<String>();

              csv="1,2,3".Split(',').ToList<string>();

 

反轉

              Array.Reverse();

              List<T>.Reverse

 

已經定義的顏色(using System.Drawing)

              Color.Red

 

Key Event

              視窗(Forms)對於鍵盤消息的捕獲主要通過三個事件:

              KeyDownKeyPressKeyUp

              其中非字元鍵不會引發KeyPress事件;但非字元鍵卻可以引發KeyDown          KeyUp事件。

 

方向鍵,VKey:

              上38, 40, 37, 39

 

RefOut ,類似C++傳參考、傳址,

int testnum=10;

void MyTest1(out int num)

{

    num=testnum;

}

ref需要給預設值才能傳入、out需要給值才能離開

 

找字串

              String.IndexOf(String)

 

陣列

1 陣列[]:

      byte[] buf = new byte[10];

      buf[0] = 10;

2 陣列List:

      List<byte> buf = new List<byte>();

      buf.Add(10);

3 陣列 Array:

      Array myArr = Array.CreateInstance(typeof(byte), 10);

    myArr.SetValue(10, 0);

4 陣列 ArrayList:

      ArrayList myAL = new ArrayList();

      myAL.Add(10);

5 堆疊 Stack:

      Stack<byte> buf = new Stack<byte>();

      StringList.Push(10);

6 對列 Queue:

      Queue<byte> buf = new Queue<byte>();

      StringList.Enqueue(10);

 

螢幕大小

Screen.PrimaryScreen.Bounds.Width;

Screen.PrimaryScreen.Bounds.Height

 

物件概念

每個class 必須new才能使用

每個物件雖然沒有跟C++一樣加*,但是必須當作有*

Ex:

Class1 a = new Class1();

Class1 b = a;//僅指標

Class1 c = new Class1();

c=a;  //c原本建立的物件會遺失。

 

複製一份出來

this.MemberwiseClone();

使用的前提是在自己的class中,

如果變數是存[],使用上沒甚麼影響

如果變數是存[],要小心,修改複製出來的內容,原本的變數也會跟著修改

 

文字盒加一行資料

RichTextBox.AppendText(String+"\r\n");

 

對話窗

DialogResult MessageBox.Show(String);

DialogResult MessageBox.Show(String,String);

DialogResult MessageBox.Show(String,String,MessageBoxButtons);

Ex:

DialogResult ret MessageBox.Show("This is a book.", "Info", MessageBoxButtons.YesNo);

if(ret==DialogResult.No) return;

 

extern

              C#中的extern 是給載入DLL用,EX:

        [DllImport("kernel32")]

        private static extern long WritePrivateProfileString(string section,

            string key, string val, string filePath);

 

元件太多導致畫面刷新速度過慢,複寫Form的方法

//Form上的Code:

protected override CreateParams CreateParams

{

    get

    {

        CreateParams cp = base.CreateParams;

        cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED

        return cp;

    }

}

 

              //UserControlCode :

protected override CreateParams CreateParams

{

    get

    {

        var parms = base.CreateParams;

        parms.Style &= ~0x02000000;  // Turn off WS_CLIPCHILDREN

        return parms;

    }

}

         

載圖方式

PictureBox.Image=Properties.Resources.圖檔

PictureBox.Image=Image.FromFile(String)

PictureBox.Image=Bitmap;

PictureBox.Load(String)

Bitmap bmp=new Bitmap(String);

Bitmap bmp=new Bitmap(Image);

Bitmap bmp=Properties.Resources.圖檔

Bitmap bmp=PictureBox.Image as Bitmap;

Graphics g=PictureBox.CreateGraphics();

Graphics g=Graphics.FromImage(Bitmap);

Graphics g=Graphics.FromImage(Image);

 

取得RGB方式

Color Bitmap.GetPixel(int x, int y)

Image(無繪圖功能,可從檔案、BitmapStream匯入)

System.Object

  System.MarshalByRefObject

    System.Drawing.Image

      System.Drawing.Bitmap

        System.Drawing.Imaging.Metafile

 

Bitmap(大部分功能繼承Image,但有SetPixel可以繪圖)

System.Object

  System.MarshalByRefObject

    System.Drawing.Image

      System.Drawing.Bitmap

 

Graphics(有許多繪圖指令,但與ImageBitmap無直接關係)

  System.Object

    System.MarshalByRefObject

      System.Drawing.Graphics

 

畫圖方式1

PaintEventArgs even = new PaintEventArgs(pictureBox1.CreateGraphics(),new Rectangle()) ;

even.Graphics.DrawRectangle(new Pen(Brushes.Black, 1), 10, 10, 50, 50);

 

畫圖方式2

Graphics g=pictureBox1.CreateGraphics();

g.DrawRectangle(new Pen(Brushes.Black, 1), 10, 10, 50, 50);

 

畫圖方式3

Bitmap bmp = pictureBox1.Image as Bitmap;

for (int i = 10; i <= 50; i++)

{

    bmp.SetPixel(i, 10, Color.Black);

    bmp.SetPixel(i, 50, Color.Black);

    bmp.SetPixel(10, i, Color.Black);

    bmp.SetPixel(50, i, Color.Black);

}

pictureBox1.Refresh();

 

會有問題的繪圖方式

pictureBox1.Image = Properties.Resources.Add;

Graphics g = pictureBox1.CreateGraphics();

g.DrawRectangle(new Pen(Brushes.Black, 1), new Rectangle(10, 10, 20, 20));//會被原始圖檔復原

           改成這樣就OK

Graphics g = pictureBox1.CreateGraphics();

g.DrawImage(Properties.Resources.Add,new Point());

g.DrawRectangle(new Pen(Brushes.Black, 1), new Rectangle(10, 10, 20, 20));

 

但上面這種方法會有刷新就消失的問題,只適合在event裡面做,最終改成下面這種方式

Bitmap bmp=new Bitmap(65,65);            

Graphics g = Graphics.FromImage(bmp);

g.DrawImage(Properties.Resources.Add, new Point());

g.DrawRectangle(new Pen(Brushes.Black, 1), new Rectangle(10, 10, 20, 20));

pic_SetupDressIcon1.Image = bmp;

 

去背

Bitmap bmp = Properties.Resources.Add;

bmp.MakeTransparent(Color.White);

pictureBox1.Image = bmp;

or

pictureBox1.Image = Properties.Resources.Add;

(pictureBox1.Image as Bitmap).MakeTransparent(Color.White);

 

記憶體釋放

              目前已知需要手動釋放的有 Graphics

 

繪圖關鍵字

DrawXXXX 只畫路徑不填滿物件

FillXXXX 只填滿物件不畫路徑

 

繪圖眉角

DrawRectangle(Pen, left, top, width, height);

EX: g.DrawRectangle(new Pen(Color.Black,1), 0, 0, 99, 99);

解說: 實際位置從(0,0) ~ (99,99) 影像實際大小為 100x100

使用時,長寬會多1pixel; 最小長寬設定1 (2x2)

FillRectangle(Brush, left, top, width, height);

EX: g.FillRectangle(new SolidBrush(Color.Red), 0, 0, 100, 100);

解說: 實際位置從(0,0) ~ (99,99) 影像實際大小為 100x100

最小長寬設定1 (1x1)

Arc 弧線

Pie 扇形

Bezier 貝茲曲線

Curve 曲線

Ellipse 圓形

Rectangle 矩形

Line

Polygon 多邊形

 

設定選擇的DataGridView

              dataGridView1.CurrentCell = dataGridView1.Rows[index].Cells[0];

 

去頭尾空白

              String.Trim()

 

字串長度

              String.Length

 

TabControl換頁

              TabControl.SelectedTab

 

主程式執行序暫時釋放

              Application.DoEvents()

 

Char 長度

              目前我使用VS2013這個版次,字元是以Unicode儲存,因此中文、英文都           1個字元,跟以往習慣不同。

 

Interface

              介面不可有任何實作的部分,EX:

public interface ITest

{

    int Code { get; set;}

    void Encode(String cmd);

}

宣告 class 繼承ITest後,滑鼠移動到ITest,右鍵,可以選擇實作介面,會自動將介面中需要實作的程式碼都自動產生出來

 

在類別宣告時的 partial (局部) 的意思

       我在VS2013中發現程式碼被分開的現象,將視窗所自動產生的程式碼被獨     立到Designer.cs,但就會有兩個同名的class,因此它加上了partial,   告訴編譯器,宣告這只是程式碼的一部分。

 

委派函式 delegate

       簡單講,就是C++中的函式的指標概念,常用在事件的宣告。

       public delegate void ReceiveEventHandler(object sender, RecieveEventArgs e);

        public event ReceiveEventHandler OnReceive = null;

 

調用Invoke

       常用在執行序要修改Form中的元件時,但有些函式庫的程式有時也會需要     用才能正常運作。

          //使用Invoke 呼叫函式

        public void Synchronize(SynchronizeMethod Method)

        {

            try

            {

                if (Owner.InvokeRequired)

                {

                    Owner.Invoke(Method);

                }

                else

                {

                    Method();

                }

            }

            catch (Exception)

            {

            }

        }

 

工具箱的ICON

       class 宣告的上方加入: [System.Drawing.ToolboxBitmap(@"C:\MyIcon.bmp")]

 

防止多開

            //防止多開

            if (System.Diagnostics.Process.GetProcessesByName(

                        System.Diagnostics.Process.GetCurrentProcess().ProcessName).Length > 1)

            {

                this.Close();

            }

 

相關文章:

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 史克威爾凱特 的頭像
    史克威爾凱特

    史克威爾凱特的部落格

    史克威爾凱特 發表在 痞客邦 留言(0) 人氣()