CListCtrl在處理NM_CLICK的時候,如何判斷Ctrl SHIFT ALT鍵是否按下,clistctrlnm_click

來源:互聯網
上載者:User

CListCtrl在處理NM_CLICK的時候,如何判斷Ctrl SHIFT ALT鍵是否按下,clistctrlnm_click
百度 NMITEMACTIVATE
在 NM_CLICK  的處理函數中,將 NMHDR 結構強制轉換成 NMITEMACTIVATE,這一步MS已經協助我們完成了,其中,結構體中的 uKeyFlags 就是特殊按鍵的資訊
LVKF_ALT 表示 alt 鍵被按下
LVKF_CONTROL 表示 ctrl 鍵被按下

LVKF_SHIFT 表示 shift 鍵被按下。

具體程式如下:

void CCCCCCCDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE >(pNMHDR);
// TODO: 在此添加控制項通知處理常式代碼
if(LVKF_CONTROL ==pNMItemActivate->uKeyFlags){
TRACE("%d LVKF_CONTROL\r\n",pNMItemActivate->uKeyFlags);
}
if(LVKF_ALT  ==pNMItemActivate->uKeyFlags){
TRACE("%d LVKF_ALT \r\n",pNMItemActivate->uKeyFlags);
}
if(LVKF_SHIFT  ==pNMItemActivate->uKeyFlags){
TRACE("%d LVKF_SHIFT \r\n",pNMItemActivate->uKeyFlags);
}
*pResult = 0;
}

輸出如下:

2 LVKF_CONTROL
4 LVKF_SHIFT 
1 LVKF_ALT 


判斷shift,ctrl,alt鍵是否按下

type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble);所以根據Shift的值就可以判斷當鍵盤上的鍵按下時Shift 、Alt和Ctrl鍵的狀態,或者按下滑鼠左鍵、中鍵時的狀態或者是否雙擊了按鍵。當然,如果有OnMouseDown事件發生了,而又不是按下左鍵和中鍵,則按下的一定是右鍵。下面的常式說明了如何檢測Shift、Alt和Ctrl 鍵是否按下。通過菜單File | New Application 建立一個新的工程,在表單中添加一個StatusBar組件,並在狀態列編輯器中為其添加6 個面板。然後為表單Form1添加OnKeyDown 、OnKeyUp 、OnMouseDown和OnMouseUp等事件的處理過程如下:procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);beginif Shift=[ssShift] then // 如果按下了Shift鍵則在第一個面板上顯示ShiftStatusBar1 .Panels[0] .Text:= 'Shift';if Shift=[ssAlt] then // 如果按下了Alt鍵則在第二個面板上顯示AltStatusBar1.Panels[1] .Text:= 'Alt';if Shift=[ssCtrl] then // 如果按下了C t r l 鍵則在第三個面板上顯示CtrlStatusBar1.Panels[2].Text:= 'Ctrl';procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);begin// 在Shift、Alt 和Ctrl鍵彈起時清除狀態列中相應面板上的內容if not(Shift=[ssShift]) thenStatusBar1.Panels[0].Text:=' ';if not(Shift=[ssAlt]) thenStatusBar1.Panels[1].Text:=' ';if not(Shift=[ssCtrl]) thenStatusBar1.Panels[2].Text:=' ';procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginif Shift=[ssLeft] then // 如果按下了左鍵則在第四個面板上顯示leftStatusbar1.Panels[3].Text:= 'left';if Shift=[ssMiddle] then // 如果按下了中鍵則在第五個面板上顯示MiddleStatusBar1.Panels[4].Text:= 'Middle';if Shift=[ssDouble] then // 如果是雙擊則在第六個面板上顯示DoubleStatusBar1.Pan......餘下全文>>
 
C#怎不在keydown事件中判斷ctrl alt shift中的兩個以上按鍵被按下

1、(Control.ModifierKeys & Keys.Alt) == Keys.Alt && (Control.ModifierKeys & Keys.Control) == Keys.Control
2、Control.ModifierKeys == Keys.Alt && Control.ModifierKeys == Keys.Control3、(Control.ModifierKeys & Keys.Alt) !=0 && (Control.ModifierKeys & Keys.Control) != 0試了一下,3種方法中只有2顯然是不對,1、3能正確識別。請檢查程式其它地方有沒有問題?

在事件處理事件中加入以下幾行測試一下:
void Panel1_MouseMove(object sender, MouseEventArgs e){ MessageBox.Show(Control.ModifierKeys+""); if ((Control.ModifierKeys & Keys.Alt) == Keys.Alt && (Control.ModifierKeys & Keys.Control) == Keys.Control) MessageBox.Show("正確1"); if (Control.ModifierKeys == Keys.Alt && Control.ModifierKeys == Keys.Control) MessageBox.Show("正確12"); if ((Control.ModifierKeys & Keys.Alt) !=0 && (Control.ModifierKeys & Keys.Control) != 0) MessageBox.Show("正確3");}
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.