falla.zhang

导航

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的行。

posted on 2010-02-04 16:37  falla.zhang  阅读(808)  评论(0编辑  收藏  举报