全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1976
推到 Plurk!
推到 Facebook!

C# WIN32 程式利用 Form2 模擬 TFrame 元件的方法

 
digitraveler
初階會員


發表:89
回覆:91
積分:46
註冊:2005-06-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-27 19:53:53 IP:218.173.xxx.xxx 訂閱
原文網址    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();
}

}
}

系統時間:2024-05-15 11:36:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!