MFC 问题集(4)CListCtrl
1、顯示checkbox
????? LVS_EX_CHECKBOXES
????? SetExtendedStyle(GetExtendedStyle()|LVS_EX_CHECKBOXES);
2、允許非第一列顯示圖片。
????? LVS_EX_SUBITEMIMAGES
????? SetExtendedStyle(GetExtendedStyle()|LVS_EX_SUBITEMIMAGES);
3、禁止拖動列寬。重載OnNotify,代碼如下。
????? BOOL CExternListCtrl::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// TODO: Add your specialized code here and/or call the base class
HD_NOTIFY *pHDN = (HD_NOTIFY*)lParam;
if((pHDN->hdr.code==HDN_BEGINTRACKW||pHDN->hdr.code==HDN_BEGINTRACKA))// &&((pHDN->iItem==2)||(pHDN->iItem==3))
{
? *pResult=TRUE;
? return TRUE;
}
return CListCtrl::OnNotify(wParam, lParam, pResult);
}
4、解決首次單擊不能觸發click事件的方法,派生右鍵down事件處理函數,代碼如下:
void CExternListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SetFocus();
CListCtrl::OnLButtonDown(nFlags, point);
}
5、處理圖片單擊事件,判斷區域,處理單擊。代碼如下。
void CYourDlg::OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: Add your control notification handler code here
??? POINT point;
UINT uFlags;
GetCursorPos(&point);
m_ls.ScreenToClient(&point);
int nItem = m_lst.HitTest(point, &uFlags);
if(nItem >= 0)
{
? CRect rc;
? m_lst.GetSubItemRect(nItem,3,LVIR_BOUNDS,rc);
? if(PtInRect(&rc,point))
? {
?? MessageBox(L"...OnNMClickList");
? }
}
*pResult = 0;
}
6、改變列顯示順序。
int nArQ[] = { 1,2,0,3};
m_lst.GetHeaderCtrl()->SetOrderArray(4,nArQ);
7、讓ListCtrl可以編輯
m_lst.ModifyStyle(0,LVS_EDITLABELS);
8、讓ListCtrl可以選中一行
m_lst.SetExtendedStyle(m_lst.GetExtendedStyle()|LVS_EX_FULLROWSELECT);
9、
函數名稱:CCommonFuntions::OnCListCtrlUp
描??? 述: 對CListCtrl記錄的上移操作
輸入參數:
??????? *listCtrl?? 對某個CListCtrl對象進行上移操作的CListCtrl指針
??????? nColumn???? CListCtrl對象列數目(不大于30列)
輸出參數: 無
返??? 回: 無
**************************************************************************/
void CCommonFuntions::OnCListCtrlUp(CListCtrl *listCtrl, int nColumn)
{
??? listCtrl->SetFocus();
??? POSITION pos;
??? pos = listCtrl->GetFirstSelectedItemPosition();
??? // 得到項目索引
??? int index = listCtrl->GetNextSelectedItem(pos);?
??? if (index == -1)
??????? return;
??? // 判斷所選項是否位于行首
??? if (index == 0)
??? {
??????? AfxMessageBox("已經位于第一行!");
??????? return;
??? }
??? // 提取所選列表項各列類容
??? CString tempField[30];
??? for (int i=1; i<=nColumn; i++)
??? {
??????? tempField[i] = listCtrl->GetItemText(index, i-1);
??? }
??? // 刪除所選列表項
??? listCtrl->DeleteItem(index);
??? // 在IndexInFieldList-1位置處插入上面所刪列表項的各列類容
??? int tempItem;
??? tempItem = listCtrl->InsertItem(index-1,tempField[1]);
??? for (int j=1; j<nColumn; j++)
??? {
??????? listCtrl->SetItemText(tempItem, j,tempField[j+1]);
??? }
??? index--;
??? // 使得IndexInFieldList-1位置處項目高亮顯示并獲得焦點
??? UINT flag = LVIS_SELECTED|LVIS_FOCUSED;
??? listCtrl->SetItemState(index, flag, flag);
??? 一個 LISTCTRL 有7行 GetItemCount(); 返回 為7
??? 7行,索引對應是0.1.2.3.4.5.6
??? GetItemCount()-2 =5; 對應索引為5的行。
轉載于:https://www.cnblogs.com/falla/archive/2010/02/04/1663776.html
總結
以上是生活随笔為你收集整理的MFC 问题集(4)CListCtrl的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DotnetCharting
- 下一篇: 什么是OR MAPPING