我把一个文件的数据读进去了,可以左键选中任意一行.
接着我要读另一个文件的数据,调用了一次DeleteAllItem
然后文件读进去后...任何一行都无法选中......响应左键点击消息,返回的 item,subitem 都是 -1 何解
有解决办法吗?
接着我要读另一个文件的数据,调用了一次DeleteAllItem
然后文件读进去后...任何一行都无法选中......响应左键点击消息,返回的 item,subitem 都是 -1 何解
有解决办法吗?
解决方案 »
- 请教哪里能找到绘图软件相关的一些图标(比如直线,圆弧等等)
- 求救:关于CPropertySheet窗体大小和字体大小的疑问。请各位赐教,非常感激!!!(100分酬谢)
- 有关select问题,请教大侠?
- 我在结合使用hook和自定义消息(改编MouseHook)时碰上的问题
- 请教:IMoniker接口如何使用?
- 怎么实现像vc的output窗口那样的窗口,他用的是什么?ceditview?多谢指教!
- ADO对大二进制文件的操作
- 能否使用VC子代的工具将 My.DLL 生成 My.lib,或正常的连接 My.dll
- 急!为什么在Dll中无法调用AfxGetInstanceHandle()函数
- RTSP协议客户端的工作原理和实现函数,请高手指导一下,谢谢!
- MFC输入框中的取值问题?
- 数据库读取操作不能放在 myView下面处理?
void Onload()
{
GetListCtrl().SetRedraw(FALSE);
GetListCtrl().DeleteAllItems();
GetListCtrl().SetRedraw(TRUE); //删除所有表项
int n = GetListCtrl().GetHeaderCtrl()->GetItemCount();
for (int i = 0;i < n;i++)
{
GetListCtrl().GetHeaderCtrl()->DeleteItem(0);
} //删除所有列头
...后面就是循环InsertItem了...
}
第1次调用,表里面的行都可以选中.
第2次调用,都不能选中了....
int ncount=ptr->GetItemCount();
if(ncount)
{
for(int j=0;j<ncount;j++)
{
m_list->DeleteColumn(0);
}
}和楼主的差别不大,我的程序能够运行
否则如果 你有100行,100列.那么你的视图会重绘1W次....闪烁严重..主要是我一直没找到原因啊....选不中.... 而item有确实存在,我可以调用SetItemState选中...
你的程序把这两个混在一起了,我是把格式和数据添加分别写为了两个函数,我现在可以用CListCtrl显示不同的数据表完全没有问题,楼主你对列头和行没有分清楚吧
第1次调用...
后左键能选中,要选多行,需按Shift键+鼠标左键.
第2次调用后,左键无法选中,选中多行 可以直接拖动鼠标...同时会出现类似在桌边 拖动鼠标一样出现一个矩形....
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.
}
}
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);
这里的dwIndexCount不是你列的个数,有可能越界,楼主要加分啊
dwIndexCount 这是行的个数....
GetListCtrl().SetItemText(j,0,szIndex);
GetListCtrl().SetItemText(j,1,szTab0);
GetListCtrl().SetItemText(j,2,szTab1);
GetListCtrl().SetItemText(j,3,bufFileName); //这是列的个数 只4列
而且,文件的结构我分析好了的,算准的...不会出错的......就算有错 该不会影响Clistctrl才是
// for (int i = 0;i < n;i++)
// {
// GetListCtrl().GetHeaderCtrl()->DeleteItem(0);
// } //清空
去掉这几句后 程序正常.....果然 删除完所有列头后,会改变属性......
只有第1列可双击编辑
第1列的文本只能左对齐
删除第1列列头 还会出现这种效果....
你可以在鼠标双击的列上 摆个EDIT控件,EDIT控件的高度和宽度 = 该列的高度和宽度,
这样每列都可以编辑了,编辑完了 再隐藏或 delete 掉这个EDIT控件。