MFC中CListCtrl单击表头排序+表格大小随窗体大小改变等功能实现

先给基础弱的同学补一下CListCtrl的使用方法,其他童鞋可直接跳过:

0.

//设置表格属性

DWORD dwStyle =m_listaccount.GetExtendedStyle();

dwStyle |=LVS_EX_FULLROWSELECT;

dwStyle |=LVS_EX_GRIDLINES;

dwStyle |= LVS_EX_CHECKBOXES;

m_listaccount.SetExtendedStyle(dwStyle);

     //删除表头

int nCols = m_listaccount.GetHeaderCtrl()->GetItemCount();

for (int o = 0;o < nCols;o++) 

{

m_listaccount.DeleteColumn(0);

}

     //绘制表头

CString lstaccount[4] ={“经纪公司代码“,”资金账户代码“,”资金账户名“,”经纪公司地址};

m_listaccount.InsertColumn(1,lstaccount[0],LVCFMT_LEFT,120);

m_listaccount.InsertColumn(2,lstaccount[1],LVCFMT_LEFT,120);

m_listaccount.InsertColumn(3,lstaccount[2],LVCFMT_LEFT,120);

m_listaccount.InsertColumn(4,lstaccount[3],LVCFMT_LEFT,200);

 

设置表格的属性分别为可被选择、出现网格线、前端有选择框,SetExtendedStyle用来加载类型,删除表头时,

先去获得表头的个数,然后一直删除第一个表头(标号为0),DeleteColumn(0),因为每次删除前面的表头之后,

后面的表头会自动移动到前面一个。用InsertColumn插入一列。属性为位置、列名、类型、宽度。

其实上述代码看似没有问题,但也属于垃圾代码范畴,不能很好的参数化一些属性设置,代码的重用性不高,童鞋们可以加以修改。

0.

//删除含有某信息的行:

//删除选中的用户

void YourClass::OnBtnDeleteAccount() 

{

bool isClose =FALSE;

if(MessageBox(”    确定要执行删除操作????“,”删除“,MB_YESNO) ==IDYES)

{

isClose =TRUE;

}

if(!isClose)

{

return;

}

CString strPID; //用来标识账户代码

for(int i=0; i<m_listaccount.GetItemCount(); i++) //GetItemCount()获得总行数

    {

         if(m_listaccount.GetCheck(i)) //GetItemState()获取列表视图项的状态 || m_listaccount.GetCheck(i)

         {

strPID =m_listaccount.GetItemText(i, 1); //选中的行、列的值

for(int m =0;m <nLst;m ++)

{

InvestorLst[m].DeleteInvestor(strPID);

}

CString slog; //记录日志

slog =”删除资金账户   “;

slog +=strPID;

PublicLog.LogRecord(slog);

m_listaccount.DeleteItem(i);

              //下面一句很重要,因为少了一行,所以用于计数的变量也要后退一步

i –;

        }

}

}

 

 

一、单击表头排序

右键你的CListCtrl建立类向导:选择MessagesLVN_COLUMNCLICK,建立表头单击函数

OnColumnclickListstra();

代码如下:

1.SetItemData设置排序关键字sort0是倒序排列,为1为正序排列。

void YourClass::OnColumnclickListstra(NMHDR* pNMHDR, LRESULT* pResult) 

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

int Length = m_listaccount.GetItemCount();

CArray<CString,CString> ItemData;

ItemData.SetSize(Length);

for (int i = 0; i < Length; i++)

{

ItemData[i] = m_listaccount.GetItemText(i,pNMListView->iSubItem);

m_listaccount.SetItemData(i,(DWORD_PTR)&ItemData[i]);//设置排序关键字

}

static int sort = 0;

static int SubItem = 0;

if (SubItem != pNMListView->iSubItem)

{

sort = 0;

SubItem = pNMListView->iSubItem;

}

else

{

if (sort == 0)

{

sort = 1;

}

else

{

sort = 0;

}

}

m_listaccount.SortItems(MyCompareProc,(DWORD_PTR)&sort);//排序

*pResult = 0;

}

回调函数MyCompareProc定义如下:

static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)//排序回调函数

{

CString &lp1 = *((CString *)lParam1);

CString &lp2 = *((CString *)lParam2);

int &sort = *(int *)lParamSort;

if (sort == 0)

{

return lp1.CompareNoCase(lp2);

}

else

{

return lp2.CompareNoCase(lp1);

}

}

 

二、表格大小随窗体大小改变

1.重写窗体的OnSize()函数

·打开你的ClassView,找到对应的窗体类

·Add Windows Message Handler

·根据你的需要添加tiemrpaintsOnizeclose ……

·有的童鞋可能删除了某些编译器给你自动生成的配置文件导致以上行为无法实现,不用担心,那就打开你的ResourceView

打开你的对话框,右键添加类向导,选择添加全部即可恢复。

void YourClass::OnSize(UINT nType, int cx, int cy) 

{

CDialog::OnSize(nType, cx, cy);

if (this->m_tradelist.m_hWnd != NULL)

{

CRect rcClient;

this->GetClientRect(&rcClient);

if(isSelectPositionHide ==TRUE)

{

rcClient.DeflateRect(20, 1, 1, 1);

this->m_tradelist.SetWindowPos(NULL,

rcClient.left,

rcClient.top,

rcClient.Size().cx,

rcClient.Size().cy,

SWP_NOZORDER);

}

    }

}

 

 如果有童鞋需要设置每个行和列的颜色,可以搜索我的博文《MFC绘制CListCtrl单元格颜色+重绘窗体背景+CDC绘制图片等》,

无链接,每次插入链接很难通过审核,见谅。

 

    原文作者:qq_19667153
    原文地址: https://blog.csdn.net/qq_19667153/article/details/50636082
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞