圖8.2CH8_DemoForm004.cs運(yùn)行畫面
第8章探討重要的人機(jī)界面設(shè)計(jì)技巧如果您希望不管控件的狀況如何,都能夠順利地捕捉WindowsForm控件中的按鍵,必須根據(jù)該控件的類派生出一個(gè)新的類并重寫ProcessCmdKey方法,并在此重寫方法中編寫程序代碼來捕捉并處理您所需的按鍵。系統(tǒng)會傳遞兩個(gè)參數(shù)給ProcessCmdKey方法:msg與keyData。msg參數(shù)含有所要處理的窗口信息(例如:WM_KEYDOWN),此窗口信息是以傳址方式傳遞的。keyData參數(shù)則會含有被按下的按鍵的按鍵碼,也就是其中一個(gè)Keys值(注意,keyData參數(shù)的類型是Keys枚舉類型)。如果CTRL或ALT鍵也被按下,keyData參數(shù)還會含有輔助按鍵(Modifier Key)信息。您并非一定要使用msg參數(shù),也就是說,您可以忽略它。不過利用msg參數(shù)來檢測窗口信息倒是一項(xiàng)不錯(cuò)的選擇。在稍后的程序范例中,我們會去檢測窗口信息是否為WM_KEYDOWN,以便確認(rèn)這是一個(gè)按鍵事件。此外,我們也會去檢測窗口信息是否為WM_SYSKEYDOWN,以便確認(rèn)按鍵組合是否包含輔助按鍵。
由于DataGridView控件的狀況最為復(fù)雜,因而在此我們就要示范如何在DataGridView控件中捕捉按鍵,請切記,您可以將同樣的方法應(yīng)用在其他的控件中。圖82所示是程序范例CH8_DemoForm004.cs的運(yùn)行畫面,從窗體的標(biāo)題欄變化可以看出,只要DataGridView控件取得焦點(diǎn),不論它是否顯示數(shù)據(jù),都能夠捕捉用戶在DataGridView控件中的按鍵。顯而易見地,本程序范例的關(guān)鍵在于必須根據(jù)DataGridView控件派生出一個(gè)新的類并重寫其ProcessCmdKey方法。這里將派生類MyDataGridView的程序代碼列示如下(編寫在MyDataGridView.cs中):
publicpartialclass MyDataGridView :
System.Windows.Forms.DataGridView
{
...
...
protectedoverridebool ProcessCmdKey(
ref Message msg, Keys keyData)
{
constint WM_KEYDOWN =0x100;
constint WM_SYSKEYDOWN =0x104;
if ((msg.Msg == WM_KEYDOWN) ||
(msg.Msg == WM_SYSKEYDOWN))
{
switch (keyData)
{
case Keys.Down:
this.Parent.Text ="向下鍵已經(jīng)被捕捉";
break;
case Keys.Up:
this.Parent.Text ="向上鍵已經(jīng)被捕捉";
break;
case Keys.Left:
this.Parent.Text ="向左鍵已經(jīng)被捕捉";
break;
case Keys.Right:
this.Parent.Text ="向右鍵已經(jīng)被捕捉";
break;
case Keys.Home:
this.Parent.Text ="Home 鍵已經(jīng)被捕捉";
break;
case Keys.End:
this.Parent.Text ="End 鍵已經(jīng)被捕捉";
break;
}
}
returnbase.ProcessCmdKey(ref msg, keyData);
}
}