CListCtrl的问题 求指教....

bingying19872008 2010-04-07 01:35:58
我把一个文件的数据读进去了,可以左键选中任意一行.
接着我要读另一个文件的数据,调用了一次DeleteAllItem
然后文件读进去后...任何一行都无法选中......响应左键点击消息,返回的 item,subitem 都是 -1 何解
有解决办法吗?
...全文
149 27 打赏 收藏 转发到动态 举报
写回复
用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)

16,472

社区成员

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

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

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