List Control控件中及時捕獲checkbox被選中的消息的解決方案

我的功能需求是:用戶可以在List Control裏添加item,當無選項被選中(即Checkbox沒被選中),刪除按鈕不可用;當用戶點擊checkbox選中item時,刪除按鈕可用。

圖示如下:


圖一 模擬圖

運行後如下:


圖二 無選項被選中


圖三 有選項被選中

好了,廢話不多說,直接上代碼:

響應LVN_ITEMCHANGED消息函數:

void CLicenseGenDlg::OnLvnItemchangedListResource(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
	// TODO: Add your control notification handler code here
	*pResult = 0;
	int nItem,i;
	nItem = m_list_resource.GetItemCount();

	bool mark = false;
	for (i = 0; i < nItem && !mark; ++i)
	{
		if (m_list_resource.GetCheck(i))
		{
			mark= true;
		}	
	}
	if (mark)
	{
		GetDlgItem(IDC_BTN_DELITEM)->EnableWindow(TRUE);//有list選項選中後使刪除按鈕可用
	}
	else
	{
		GetDlgItem(IDC_BTN_DELITEM)->EnableWindow(FALSE);//無lisr選項選中使刪除按鈕變灰
	}
}
不過在解決上述問題之前,我嘗試了另外一個消息函數NM_CLICK,雖然能達到獲知list改變消息,但不能及時捕獲checkbox狀態,總是慢了一個鼠標點擊動作時間段。
附錄:

CListCtrl控件主要事件:

LVN_BEGINDRAG 鼠標左鍵正在被觸發以便進行拖放操作(當鼠標左鍵開始拖拽列表視圖控件中的項目時產生)

LVN_BEGINRDRAG 鼠標右鍵正在被觸發以便進行拖放操作(當鼠標右鍵開始拖拽列表視圖控件中的項目時產生)

LVN_BEGINLABELEDIT 開始編輯項的文本

LVN_COLUMNCLICK 單擊列(當鼠標單擊列表視圖控件列標題時產生)

NM_CLICK 當鼠標單擊列表視圖控件時產生

LVN_COLUMNCLICK 單擊列

LVN_DELETEALLITEMS 刪除所有項

LVN_DELETEITEM 刪除某個項

NM_DBLCLK 當鼠標雙擊列表視圖控件時產生

LVN_ENDLABELEDIT 結束對項文本的編輯

LVN_GETDISPINFO 請求需要顯示的信息

LVN_GETINFOTIP 請求顯示在工具提示窗口內的附加的文本信息

LVN_HOTTRACK 鼠標滑過某個項

LVN_INSERTITEM 當向列表視圖控件插入項目時產生

lVN_ITEMACTIVATE 激活某個項

LVN_ITEMCHANGED 某個項已經發生變化

LVN_ITEMCHANGING 某個項目正在發生變化

NM_KILLFOCUS 當視表列圖控件失去焦點時產生

LVN_KEYDOWN 某個鍵被按下

LVN_MARQUEEBEGIN 開始某個邊框選擇

NM_OUTOFMEMORY 當內存溢出時產生

LVN_ODCACHEHINT 虛擬列表控件的顯示區域的內容發生了變化

LVN_ODSTATECHANGED 虛擬列表的控件的某個項或某個範圍內的項已經發生變化

LVN_ODFINDITEM 需要擁有者查找一個特定的回調項

NM_RCLICK 當鼠標右鍵單擊列表視圖控件時產生

NM_RDBLCLK 當鼠標右鍵雙擊列表視圖控件時產生

NM_SETFOCUS 當列表視圖控件獲得焦點時產生

LVN_SETDISPINFO 父窗口必須更新控件爲項所維護的信息

註解:

HDN:Header Notify
LVN:ListView control Notify 
NM:Notify Message
TVN:TreeView control Notify


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章