C# WIN32 程式利用 Form2 模擬 TFrame 元件的方法 |
|
digitraveler
初階會員 發表:89 回覆:91 積分:46 註冊:2005-06-01 發送簡訊給我 |
原文網址 http://tw.myblog.yahoo.com/bruce0211/article?mid=170
■ Form2(或 Form3 ...) 模擬 TFrame 控件(元件)的方法 1.攔截所有 Form2(或 Form3 ...) 的 key 事件 (keydata) 2.把 keydata 往 Main Form 送 3.再由 Main Form 統一控管過濾所有的 KeyData , 在不正確的時機點按下不正確的鍵 , 由 Main Form 統一處理錯誤訊息 , 若是屬於該子功能操作許可的鍵 , 才把該按鍵再回送到 Form2(或 Form3 ...) 4.Form2(或 Form3 ...) 由自訂的 MyKeyDown() 接收 MainForm 送來的合法 keydata 5.使用 Keyboard Hook 的方式也應可以 , 不過我沒用過 , 在 POS 系統機能操作應用上不曉得會不會遇到其它問題 , 但使用 TFrame (或說 模擬 TFrame )的方式 , 我則有全盤用過的實戰經驗 ; 而且看網路範例 , 使用 Keyboard Hook 好像要外掛 一些 WIN32 的 DLL 檔 , 這樣就不叫 純 .NET 的寫法 ■ 實做 在 VS2003 C# 中建立一 Windows Application 新專案 , 並放入兩個 Form , Form1 當成主 Form( Main Form) , Form2 就當 Frame 用 , 若有多個 Frame 需求 , 就用 Form3, Form4 ..... 來做 ; 其中 □ Form1 (Main Form) using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace WindowsApplication1 { public class Form1 : System.Windows.Forms.Form { private Form2 MyForm2; private System.Windows.Forms.Button button1; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label4; private System.ComponentModel.Container components = null; public Form1() { InitializeComponent(); } protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } [STAThread] static void Main() { Application.Run(new Form1()); } //攔截 key 值, 可以攔掉 TAB 等特殊鍵, 比 KEYDOWN 好用 protected override bool ProcessDialogKey(Keys keyData) { Form1_MyKeyIdDown((int)keyData); ////將所有攔到的 key 值往自己的 Form1_MyKeyIdDown() 送 return true; //設 true 則不再引發 OnKeyDown/OnKeyPress/OnKeyUp } //注意 : 是 public 的 Function , 接收由其它 Form (Frame) 傳來的所有 key 值 public void Form1_MyKeyIdDown(int key_id) { //透過 Form1.Text 監視 key_id 值 this.Text="MainForm 同步監測鍵值:" key_id.ToString(); //檢查 key_id 的機制(略) .......... //把 Main Form 統一收齊的 key_id 值, 經過檢查後再往 Frame 送 if (MyForm2!=null) { MyForm2.Form2_MyKeyIdDown(key_id); } } //讓 Frame 粘著 Main Form 跑的機制 , 感覺 Frame 是 Main Form 內部自己的容器控件 private void Form1_LocationChanged(object sender, System.EventArgs e) { if (MyForm2!=null) { MyForm2.Left=Left 10; MyForm2.Top=Top 40; } } //按 button1 動態產生 Frame (用 Form2 模擬的) private void button1_Click(object sender, System.EventArgs e) { if(MyForm2==null) { FrameShow(); } else { if (MyForm2.IsDisposed) FrameShow(); } } private void FrameShow() { MyForm2 = new Form2(); MyForm2.Owner=this; MyForm2.FormBorderStyle = FormBorderStyle.None; MyForm2.StartPosition = FormStartPosition.Manual; MyForm2.TopMost=true; //StayOnTop //MyForm2.Opacity = 0.5; //Transparent 透明度 MyForm2.Left=Left 10; MyForm2.Top=Top 40; MyForm2.Show(); } } } □ Form2 (模擬 Frame) using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; namespace WindowsApplication1 { public class Form2 : System.Windows.Forms.Form { private System.Windows.Forms.Button button1; private System.Windows.Forms.TextBox textBox1; private System.ComponentModel.Container components = null; public Form2() { InitializeComponent(); } protected override void Dispose( bool disposing ) { if( disposing ) { if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } //攔截 key 值, 可以攔掉 TAB 等特殊鍵, 比 KEYDOWN 好用 protected override bool ProcessDialogKey(Keys keyData) { Form1 f = (Form1)this.Owner; f.Form1_MyKeyIdDown((int)keyData); //將所有攔到的 key 值往 Main Form 之 Form1_MyKeyIdDown() 送 return true; //設 true 則不再引發 OnKeyDown/OnKeyPress/OnKeyUp } //注意 : 是 public 的 Function , 接收由主 Form 傳來的合法 key 值 public void Form2_MyKeyIdDown(int key_id) { textBox1.Text=key_id.ToString(); } //Frame 上的 button1 可以把自己(Frame) 關掉 private void button1_Click(object sender, System.EventArgs e) { this.Close(); } } } |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |