CListCtrl的问题 求指教....

bingying19872008 2010-04-07 01:35:58
我把一个文件的数据读进去了,可以左键选中任意一行.
接着我要读另一个文件的数据,调用了一次DeleteAllItem
然后文件读进去后...任何一行都无法选中......响应左键点击消息,返回的 item,subitem 都是 -1 何解
有解决办法吗?
...全文
154 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 bingying19872008 的回复:]
一直很纠结,Clistctrl 的限制太多了....
只有第1列可双击编辑
第1列的文本只能左对齐
删除第1列列头 还会出现这种效果....
[/Quote]

你可以在鼠标双击的列上 摆个EDIT控件,EDIT控件的高度和宽度 = 该列的高度和宽度,
这样每列都可以编辑了,编辑完了 再隐藏或 delete 掉这个EDIT控件。
zhou1xp 2010-04-07
  • 打赏
  • 举报
回复
没办法,要不你用C#啊,MFC的控件是这样,要不就重写
bingying19872008 2010-04-07
  • 打赏
  • 举报
回复
一直很纠结,Clistctrl 的限制太多了....
只有第1列可双击编辑
第1列的文本只能左对齐
删除第1列列头 还会出现这种效果....
zhou1xp 2010-04-07
  • 打赏
  • 举报
回复
呵呵,我的格式和数据是分开写的,所以不会遇到你这个问题,呵呵
bingying19872008 2010-04-07
  • 打赏
  • 举报
回复
// int n = GetListCtrl().GetHeaderCtrl()->GetItemCount();
// for (int i = 0;i < n;i++)
// {
// GetListCtrl().GetHeaderCtrl()->DeleteItem(0);
// } //清空
去掉这几句后 程序正常.....果然 删除完所有列头后,会改变属性......
bingying19872008 2010-04-07
  • 打赏
  • 举报
回复
内存映射文件,如出问题,而我又没加异常处理,有问题当崩溃....
而且,文件的结构我分析好了的,算准的...不会出错的......就算有错 该不会影响Clistctrl才是
zhou1xp 2010-04-07
  • 打赏
  • 举报
回复
这个楼主你看看是不是可能出现在你的内存映射文件那里,其它我找不出什么地方错误了
bingying19872008 2010-04-07
  • 打赏
  • 举报
回复
自己解决不了,故而前来求助....
zhou1xp 2010-04-07
  • 打赏
  • 举报
回复
这个楼主你自己跟踪下了
bingying19872008 2010-04-07
  • 打赏
  • 举报
回复
for (int i = 0;i < dwIndexCount;i++)
dwIndexCount 这是行的个数....
GetListCtrl().SetItemText(j,0,szIndex);
GetListCtrl().SetItemText(j,1,szTab0);
GetListCtrl().SetItemText(j,2,szTab1);
GetListCtrl().SetItemText(j,3,bufFileName); //这是列的个数 只4列
bingying19872008 2010-04-07
  • 打赏
  • 举报
回复
有没有一个可能是我删除 所有的列头后,属性给自动还原了?
zhou1xp 2010-04-07
  • 打赏
  • 举报
回复
for (int i = 0;i < dwIndexCount;i++)
这里的dwIndexCount不是你列的个数,有可能越界,楼主要加分啊
bingying19872008 2010-04-07
  • 打赏
  • 举报
回复
是一样的.....我现在不明白为啥第1次用正常,第2次用就不正常.......
zhou1xp 2010-04-07
  • 打赏
  • 举报
回复
int j = GetListCtrl().InsertItem(GetListCtrl().GetItemCount(),_T(""));
GetListCtrl().SetItemText(j,0,szIndex);
GetListCtrl().SetItemText(j,1,szTab0);
GetListCtrl().SetItemText(j,2,szTab1);
GetListCtrl().SetItemText(j,3,bufFileName);
pFile += 0xC;
pSecTab += 0x8;
这一段好像有问题,我的程序段是
Row=m_list->GetItemCount();
CString rowid;
rowid.Format(L"%d",Row);
m_list->InsertItem(Row,rowid);
CString addstr=q1.fieldValue(i);
m_list->SetItemText(Row,i,addstr);
bingying19872008 2010-04-07
  • 打赏
  • 举报
回复
第1次调用正常,第2次调用 就算读取同1个文件也会出现10楼的问题...
bingying19872008 2010-04-07
  • 打赏
  • 举报
回复

void CListTextView::OnLoadloc()
{

// TODO: 在此添加命令处理程序代码
GetListCtrl().SetRedraw(FALSE);
GetListCtrl().DeleteAllItems();
GetListCtrl().SetRedraw(TRUE);
int n = GetListCtrl().GetHeaderCtrl()->GetItemCount();
for (int i = 0;i < n;i++)
{
GetListCtrl().GetHeaderCtrl()->DeleteItem(0);
} //清空
GetListCtrl().InsertColumn(0,_T("文件序号"),0,80);
GetListCtrl().InsertColumn(1,_T("文件内容长度(字符数UNICODE)"),0,80);
GetListCtrl().InsertColumn(2,_T("相对内容表的偏移"),0,80);
GetListCtrl().InsertColumn(3,_T("文件名"),LVCFMT_CENTER,800);

CString szFilters = _T("Pak Files (*.loc)|*.loc|All Files (*.*)|*.*||");
CFileDialog fileDlg(TRUE, _T("loc"), _T("pack"),OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters);
if(fileDlg.DoModal() == IDOK)
{
CString pathName = fileDlg.GetPathName();
if (pathName.Find(_T("pack.loc")) == -1)
{
MessageBox(_T("请找到pack.loc文件"),_T("提示"));
return;
}
HANDLE hFile,hFileMap;
BYTE* pFile;
hFile = CreateFile(pathName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
pFile = (BYTE*)MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,0);
if (!pFile)
{
MessageBox(_T("CreateFileMapping Fail!"),_T("Error2"),MB_OK);
CloseHandle(hFileMap);
CloseHandle(hFile);
return;
}

BYTE* pBeign = pFile;
DWORD dwoffsetTab2 = *(DWORD*)(pFile + 0x4);
BYTE* pSecTab = pFile + 0x8 + dwoffsetTab2;
pSecTab += 0x8; //第2张表
DWORD dwIndexCount = *(DWORD*)(pFile + 0xC); //索引总个数
pFile += 0x10; //来到第1个索引
GetListCtrl().ShowWindow(SW_HIDE);
for (int i = 0;i < dwIndexCount;i++)
{
DWORD dwOffset = *(DWORD*)pFile;
DWORD dwFileNameLen = *(DWORD*)(pFile + 0x4);
DWORD dwnIndex = *(DWORD*)(pFile + 0x8);
CString szIndex;
szIndex.Format(_T("0x%X"),dwnIndex);
TCHAR bufFileName[0x200] = {0};
char bufFileNameA[0x200] = {0};
memcpy_s(bufFileNameA,0x200,(void*)(pFile + dwOffset),dwFileNameLen);
MultiByteToWideChar(CP_UTF8,0,bufFileNameA,dwFileNameLen,bufFileName,dwFileNameLen);
DWORD dwTab2_0 = *(DWORD*)pSecTab;
DWORD dwTab2_1 = *(DWORD*)(pSecTab + 0x4);
CString szTab0,szTab1;
szTab0.Format(_T("0x%X"),dwTab2_0);
szTab1.Format(_T("0x%X"),dwTab2_1);
int j = GetListCtrl().InsertItem(GetListCtrl().GetItemCount(),_T(""));
GetListCtrl().SetItemText(j,0,szIndex);
GetListCtrl().SetItemText(j,1,szTab0);
GetListCtrl().SetItemText(j,2,szTab1);
GetListCtrl().SetItemText(j,3,bufFileName);
pFile += 0xC;
pSecTab += 0x8;
}
UnmapViewOfFile(pBeign);
CloseHandle(hFileMap);
CloseHandle(hFile);
GetListCtrl().SetHotItem(0);
GetListCtrl().ShowWindow(SW_SHOW);
// Implement opening and reading file in here.

//Change the window's title to the opened file's title.
}
}
zhou1xp 2010-04-07
  • 打赏
  • 举报
回复
把你的代码贴全吧
bingying19872008 2010-04-07
  • 打赏
  • 举报
回复
好像我调用DeleteAllItem后 整个 ClistCtrl 属性都发生了变化....
第1次调用...
后左键能选中,要选多行,需按Shift键+鼠标左键.
第2次调用后,左键无法选中,选中多行 可以直接拖动鼠标...同时会出现类似在桌边 拖动鼠标一样出现一个矩形....
zhou1xp 2010-04-07
  • 打赏
  • 举报
回复
不是啊,楼主你要搞清楚,上面那一段只是设置你的列头的名字和长度,而后才会对行加载数据,
你的程序把这两个混在一起了,我是把格式和数据添加分别写为了两个函数,我现在可以用CListCtrl显示不同的数据表完全没有问题,楼主你对列头和行没有分清楚吧
bingying19872008 2010-04-07
  • 打赏
  • 举报
回复
点击左键无法选中,拖动可以选中多行....
加载更多回复(7)
【前言】 工作或学习中可能需要实现基于VC读\写Excel文件的功能,本人最近也遇到了该问题。中间虽经波折,但是最终还是找到了解决问题的办法。 在此跟大家分享,希望对跟我同样迷茫过的同学们有所帮助。 1、程序功能 1)打开一个excel文件; 2)显示到CListCtrl上; 3)新建一个Excel文件。 以上均在对话框中实现。 2、平台 VC++2010 3、实现方法 常用的Excel打开方式有两种 1)通过数据库打开; 2)OLE方式打开。 由于方式1)操作繁琐,经常出现莫名的错误,这里选用方式2). 4、准备步骤 首先新建一个Dialog窗体程序,添加list control和两个按钮 1)将ExcelLib文件夹拷贝到程序目录下; 2)将Export2Excel.h,Export2Excel.cpp两个文件添加到项目; 3)包含头文件,#include "ExcelLib/Export2Excel.h" 通过以上步骤在程序中引入了可以读取Excle文件的CExport2Excel类; 5、打开excel文件 通过按钮点击打开 void CExcelTestDlg::OnBnClickedButtonOpenExcel() { //获取文件路径 CFileDialog* lpszOpenFile; CString szGetName; lpszOpenFile = new CFileDialog(TRUE,"","",OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,"Excel File(*.xlsx;*.xls)|*.xls;*.xlsx",NULL); if (lpszOpenFile->DoModal()==IDOK) { szGetName = lpszOpenFile->GetPathName(); SetWindowText(szGetName); delete lpszOpenFile; } else return; //打开文件 //文件中包含多个sheet时,默认打开第一个sheet CExport2Excel Excel_example; Excel_example.OpenExcel(szGetName); //获取sheet个数 int iSheetNum = Excel_example.GetSheetsNumber(); //获取已使用表格行列数 int iRows = Excel_example.GetRowCount(); int iCols = Excel_example.GetColCount(); //获取单元格的内容 CString cs_temp = Excel_example.GetText(1,1); //AfxMessageBox(cs_temp); //List control上显示 //获取工作表列名(第一行) CStringArray m_HeadName; m_HeadName.Add(_T("ID")); for (int i=1;iGetItemCount()>0) { m_list.DeleteColumn(0); } //初始化ClistCtrl,加入列名 InitList(m_list,m_HeadName); //填入内容 //第一行是标题,所以从第2行开始 CString num; int pos; for (int row = 2;row<=iRows; row++) { pos = m_list.GetItemCount(); num.Format(_T("%d"),pos +1); m_list.InsertItem(pos,num); for (int colum=1;columDoModal()==IDOK) { szGetName = lpszOpenFile->GetPathName(); SetWindowText(szGetName); delete lpszOpenFile; } else return; //文件全名称 CString csFileName = szGetName; //需要添加的两个sheet的名称 CString csSheetName = "newSheet"; CString csSheetName2 = "newSheet2"; // 新建一个excel文件,自己写入文字 CExport2Excel Excel_example; //新建excel文件 Excel_example.CreateExcel(csFileName); //添加sheet,新加的sheet在前,也就是序号为1 Excel_example.CreateSheet(csSheetName); Excel_example.CreateSheet(csSheetName2); //操作最开始添加的sheet:(newSheet) Excel_example.SetSheet(2); //添加表头 Excel_example.WriteHeader(1,"第一列"); Excel_example.WriteHeader(2,"第二列"); //添加核心数据 Excel_example.WriteData(1,1,"数据1"); Excel_example.WriteData(1,2,"数据2"); //保存文件 Excel_example.Save(); //关闭文件 Excel_example.Close(); } 7、注意事项 1)一般单个Excel文件包含多个sheet,程序默认打开第一个; 2)指定操作sheet,使用Excel_example.SetSheet(2)函数; 3)打开文件时最左侧的sheet序号为1,新建excel时最新添加的sheet序号为1. 【后记】 本程序主要基于网络CSDN中---“Excel封装库V2.0”---完成,下载地址是:http://download.csdn.net/detail/yeah2000/3576494,在此表示感谢!同时, 1)在其基础上作了小改动,改正了几个小错误,添加了几个小接口; 2)添加了如何使用的例子,原程序是没有的; 3)详细的注释 发现不足之处,还请大家多多指教

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧