默認,點擊操作會取消之前選中的行。如果我記憶之前行狀態,在OnClick事件里面重新設定 SetItemState則會導致嚴重的重繪閃爍問題!
我慢動作分解,滑鼠點擊另一行后,其他的選擇行會失去狀態。
我的需求是通過滑鼠單擊來實作多選。即點擊1,3,5實作對1,3,5幾行的選中,如果二次點擊選中行,則翻轉狀態為未選中狀態。
uj5u.com熱心網友回復:
一般的多選操作 按下Ctrl鍵,然后選擇uj5u.com熱心網友回復:
我的需求是通過滑鼠單擊來實作多選CListCtrl
有·多選 屬性 , 不必自己搞 !
uj5u.com熱心網友回復:
CListCtrl支持多行選擇uj5u.com熱心網友回復:
我的需求是不要通過CTRL/SHIFT鍵,實作多選。而是僅僅通過滑鼠單擊實作多選。沒有鍵盤,觸屏操作。uj5u.com熱心網友回復:
觸屏,沒鍵盤,不支持ctrl/shift多選。咋辦?
uj5u.com熱心網友回復:
辦法有很多,第一個可以模擬ctrl按鍵,
另一個為什么非得用選中狀態來做,不可以加個勾選框嗎?
uj5u.com熱心網友回復:
#pragma once
// CMyListCtrl
class CMyListCtrl : public CListCtrl
{
DECLARE_DYNAMIC(CMyListCtrl)
public:
CMyListCtrl()
virtual ~CMyListCtrl()
public:
virtual BOOL PreTranslateMessage(MSG* pMsg)
{
switch(pMsg->message)
{
case(WM_LBUTTONDOWN):
case(WM_LBUTTONUP):
{
pMsg->wParam |= MK_CONTROL; //模擬按下CTRL按鍵
break;
}
}
return __super::PreTranslateMessage(pMsg);
}
protected:
DECLARE_MESSAGE_MAP()
};
uj5u.com熱心網友回復:
聽起來很像LVS_EX_AUTOCHECKSELECT啊?uj5u.com熱心網友回復:
知道自繪原理的話就簡單了。在ListCtrl內部自己維護一個各行是否選中的變數,比如std::map<int, bool> m_mapSelectState;
繪制的時候根據bool值來繪制,點擊的時候根據bool來設定新值,就搞定了
uj5u.com熱心網友回復:
void CMyListCtrl::OnLButtonDown(UINT nFlags, CPoint point){
// TODO: Add your message handler code here and/or call default
#if 1 // see PreTranslateMessage
SetFocus();// blue
//
LVHITTESTINFO hti;
hti.pt = point;
int Idx = HitTest(&hti);// or SubItemHitTest
afxDump << Idx << "\n";
if (Idx<0) return;
if(GetItemState(Idx, LVIS_SELECTED))
{
SetItemState(Idx,0, LVIS_SELECTED);
}
else
{
SetItemState(Idx,LVIS_SELECTED, LVIS_SELECTED);
}
#else
CListCtrl::OnLButtonDown(nFlags, point);
#endif
}
uj5u.com熱心網友回復:
參考8樓的方法, 允許串列在第一列加個checkbox, 用戶只需選中checkbox即可轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/28715.html
標籤:界面
上一篇:MFC加載google地圖
下一篇:找個大神幫忙做H5網頁 有償的
