c#的自定義控件還是很方便的,至少相對於c++而言。
1,當然是建立一個windows 窗體空間庫,我這里就是用vs 2015 ,工程名MyControl

第二步。在自定義空間窗體內,拖放這樣一組空間。我們發送編輯框的內容給父窗體,然后接受父窗體的發送的內容,顯示到listbox 中。
這里會看到我使用了委托和事件,其實,剛入門的我,對於c#里的委托和事件 理解的並不深刻。看到很多地方再用。感覺和c++ 的回調很相似。這里就不糾結了,
后面慢慢理解吧。我們通過委托將子窗體的內容發送到主窗體。

namespace MyControl
{
public partial class UserControl1: UserControl
{
//聲明委托 和 事件
public delegate void TransfDelegate(String value);
public UserControl1()
{
InitializeComponent();
}
public event TransfDelegate TransfEvent;
private void UserControl1_Load(object sender, EventArgs e)
{
}
public void WriteMessage(string str)
{
listBoxRecv.Items.Add(str);
}
private void buttonSend_Click(object sender, EventArgs e)
{
TransfEvent(textBoxSend.Text);
}
}
}
第三步,直接編譯生成,這樣在debug 目錄下就會生成一個 MyControl.dll 這樣一個文件,讓我這樣一個從c++ 過來的人,真的是汗顏啊。也太簡單了吧。
第四部,也就是如何使用該自定義控件。在工具箱的最下面,右鍵選擇“選擇項”,進入到COM 選項下,瀏覽剛剛生成的MyControl.dll 也就是將該控件加
入到我們的工具箱中。這樣我們就可以像其他控件一樣,拖放該控件到我們主窗體中。
在主窗體中,我們也拖放一個類似的布局。這里需要注意的一點是我們要實現 子控件的時間,才能達到子控件給主窗體復制的效果。
namespace UserControl
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
userControl11.WriteMessage(textBoxSend.Text);
}
//事件處理方法
void frm_TransfEvent(string value)
{
listBoxRecv.Items.Add(value);
}
private void Form1_Load(object sender, EventArgs e)
{
userControl11.TransfEvent += frm_TransfEvent;
}
}
}

比如說,我們想要主窗體獲取到子窗體的點擊事件怎么做,也很簡單,類似的,我們可以自定義點擊事件,讓主窗體實現它既可。
項目中用到的一個波形控件,已經上傳到github https://github.com/liningg/wavecontrol.git,當然這個東西是沒有做成通用的,因為那樣,就太復雜了。效果感覺還是不錯的。
如下圖:

當然這只是其中之一,真正的項目界面應該是這樣的額,這個屬於產品,就不能上傳了。

