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)對於鍵盤消息的捕獲主要通過三個事件:
KeyDown,KeyPress,KeyUp
其中非字元鍵不會引發KeyPress事件;但非字元鍵卻可以引發KeyDown和 KeyUp事件。
方向鍵,VKey值:
上38, 下40, 左37, 右39
Ref、Out ,類似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;
}
}
//UserControl的Code :
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(無繪圖功能,可從檔案、Bitmap、Stream匯入)
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(有許多繪圖指令,但與Image、Bitmap無直接關係)
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();
}
相關文章: