不知什么原因,CtrlLIst控件不能显示出文件信息列表?

xixia07m 2017-08-11 06:21:58

void CremarksecretDlg::OnBnClickedButton1()
{
int iCheck=0;
int j=0;
for(j=0;j<=4;j++)
{
if(((CButton*)GetDlgItem(IDC_CHECK1+j))->GetCheck())
iCheck++;
}
if(iCheck)
{
BROWSEINFO bi; //BROWSEINFO结构有很多成员参数可以自己设置
ZeroMemory(&bi,sizeof(BROWSEINFO)); //将以&bi为起始地址,大小为sizeof(BROWSEINFO)的内存区域用0填充
bi.ulFlags=BIF_BROWSEINCLUDEFILES; //设置弹出的对话框属性。此处意思为包含文件。如果不设这个值,默认的是只有文件夹。ulFlags还可以定义很多别的属性
bi.ulFlags=BIF_NEWDIALOGSTYLE; //窗口可以调整大小,有新建文件夹按钮
LPITEMIDLIST pidl = SHBrowseForFolder(&bi); //Displays a dialog box enabling the user to select a Shell folder.
TCHAR * path = new TCHAR[MAX_PATH]; //自注:点击按钮获得的地址在path变量中
if(pidl!= NULL)
{
SHGetPathFromIDList(pidl,path); //Converts an item identifier list to a file system path
//MessageBox(path);
}
ListShow(path); //这里的suffixStr实参的值在哪里得到?
}
else
{
MessageBox("请选择文件类型");
}

}


void CremarksecretDlg::OnBnClickedButtonPrevous() //上一页
{
// TODO: 在此添加控件通知处理程序代码
if(pageNo==1)
{
AfxMessageBox(_T("已是第一页"));
}
if(pageNo>1)
{
pageNo--;
mlist.DeleteAllItems();
ListShow(path);
}
}


void CremarksecretDlg::OnBnClickedButtonNext() //下一页
{
// TODO: 在此添加控件通知处理程序代码
pageNo++;
if (pageNo > max_page)
{
pageNo--;
AfxMessageBox("已是最后一页");
return;
}
mlist.DeleteAllItems();
ListShow(path);
}

void CremarksecretDlg::ListShow(TCHAR* path)
{ //TCHAR * path;
using std::vector;
vector<FileInfo>fileList; //自注:程序不承认FileList是个结构变量
find(path,fileList); //取得文件信息,可自行插入列表框/这里的路径是刚才浏览文件夹选择的目录 这里的FileList对应的实参是什么
//FileInfo fileList;
UINT nCount=fileList.size(); //得到控件的行数 总的文件个数。
//Filelist=fi;
UINT i;
intStart=pageSize*(pageNo-1);
intEnd=pageSize*pageNo;
int pageSize=50;
int pageNo=1;
CString empty;
CString name;
CString time;
CString fpath;
mlist.LockWindowUpdate();

for(i=intStart;i<intEnd;i++)
{
i=i%pageSize;
empty.Format(_T(""),i+1);
mlist.InsertItem(i,empty);
name.Format(_T("%s"),fileList[i].szFileName.c_str());
mlist.SetItemText(i,1,name); //插入列
time.Format(_T("%s"),fileList[i].szCreateTime.c_str());
mlist.SetItemText(i,2,time);
fpath.Format(_T("%s"),fileList[i].szFilePath.c_str());
mlist.SetItemText(i,3,fpath);

if (pageNo >= 2) // 当页数为1时,i的值就是其本身,如果页数大于1时,i的值恢复到取余以前
{
i+= (pageNo -1) * pageSize;
}
}
mlist.UnlockWindowUpdate();

if (nCount % pageSize == 0)
{
max_page = nCount / pageSize;
}
else
{
max_page = nCount / pageSize + 1;
}
}


这里列出的是一部分程序,前面的程序没有错误了,这里的程序不知什么原因就是不能显示出文件信息列表,清高手看看是怎么回事?多谢了。
...全文
1013 74 打赏 收藏 转发到动态 举报
写回复
用AI写文章
74 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-10-23
  • 打赏
  • 举报
回复
查MSDN是Windows程序员必须掌握的技能之一。
赵4老师 2017-10-23
  • 打赏
  • 举报
回复
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。 如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE);
「已注销」 2017-10-20
  • 打赏
  • 举报
回复
InsertItem 传递的索引值必须为小于或等于行数,不能使用任意数字作为起始值。
昨夜无风 2017-08-23
  • 打赏
  • 举报
回复
其实,有时候功能不能实现,先把逻辑弄清楚!
schlafenhamster 2017-08-23
  • 打赏
  • 举报
回复
对话框的变量 通常叫模块变量,即类的变量 ,只类 该类 有效 。请 学习 类 的概念 全局变量 是不在 任何函数内的 变量 if(!fileList.empty())fileList.clear() 意思是 如果 fileList 不空 则 清除, 因为要 产生 新的 list
xixia07m 2017-08-23
  • 打赏
  • 举报
回复
多谢您的指点,程序生成正确了。我还有一些问题想问, 问题一、为什么模块变量m_pageNo既需要在.h文件中声明,还要在CremarksecretDlg的构造函数即类的同名函数中赋初值呢? 问题二、if(!fileList.empty())fileList.clear();这句是什么意思? 还有一个请问,这种知识在什么书籍里面能查到?请推荐一下,多谢!
xixia07m 2017-08-23
  • 打赏
  • 举报
回复
多谢指点了,以后还有请教的时候,还请多多帮助。
schlafenhamster 2017-08-22
  • 打赏
  • 举报
回复
void CremarksecretDlg::OnBnClickedButtonPrevous() //上一页 { UINT nCount=fileList.size(); if( pageSize * (m_pageNo-1) >0 ) { m_pageNo--; ListShow(m_pageNo); } else { MessageBox(_T("已是第一页")); } } void CremarksecretDlg::OnBnClickedButtonNext() //下一页 { UINT nCount=fileList.size(); if(pageSize*(m_pageNo+1) < nCount) { m_pageNo++; ListShow(m_pageNo); } else { MessageBox("已是最后一页"); //return; } m_pageNo=1; 是在 CremarksecretDlg 的 构造函数 (类的同名函数)中 的
xixia07m 2017-08-22
  • 打赏
  • 举报
回复

// remarksecretDlg.h : 头文件
//
 
#pragma once
#include "afxcmn.h"
#include <string>
/*using std::wstring;
wstring suffixStr;*/
 
 
// CremarksecretDlg 对话框
class CremarksecretDlg : public CDialogEx
{
// 构造
public:
    CremarksecretDlg(CWnd* pParent = NULL);    // 标准构造函数
//    TCHAR* path;
// 对话框数据
    enum { IDD = IDD_REMARKSECRET_DIALOG };
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
//BOOL Regex.Match(string input,string pattern);
 
 
// 实现
protected:
    HICON m_hIcon;
 
    // 生成的消息映射函数
    virtual BOOL OnInitDialog();
    //void find(LPCTSTR lpPath,std::vector<FileInfo>&FileList);   //有这句.cpp中的find(path,fileList)会报错。
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult);
    CListCtrl mlist;       //自注:控件变量在这里设置
    //CLinkCtrl m_Link;
 
    afx_msg void OnBnClickedButton1();
    afx_msg void OnBnClickedCheck1();      //把类型由void改成char
    afx_msg void OnBnClickedCheck2();
    afx_msg void OnBnClickedCheck3();
    afx_msg void OnBnClickedCheck4();
    afx_msg void OnBnClickedCheck5();
    afx_msg void ListShow(int pageNo);
    //afx_msg void find(LPCTSTR lpPath,std::vector<FileInfo>&FileList);
 
    afx_msg void OnBnClickedButtonNext();
    afx_msg void OnBnClickedButtonPrevous();
    int Start;
    int End;
    int max_page;
    int m_PageNo;
    int pageNo;
};
这上面是我改过的.h文件。

void CremarksecretDlg::OnBnClickedButtonPrevous()    //上一页
{
	int pageNo=m_pageNo;
	UINT nCount=fileList.size();
	if(0<pageSize*pageNo)
	{
		pageNo--;
		ListShow(pageNo);
	}
	else
	{
		pageNo++;
		MessageBox(_T("已是第一页"));
	}
}

void CremarksecretDlg::OnBnClickedButtonNext()    //下一页
{
      int m_pageNo=1;
      UINT nCount=fileList.size();
       if(pageSize*m_pageNo<nCount)
    {
        m_pageNo++;
        ListShow(m_pageNo);       
    }
    else 
      {           
        m_pageNo--;
        MessageBox("已是最后一页");
        //return;
      }
这是我改过的上一页,下一页程序,但是程序运行的结果还是不对,我的程序有什么问题请帮我更正一下。
schlafenhamster 2017-08-22
  • 打赏
  • 举报
回复
还有 int m_pageNo=1; ? m_pageNo 是 ‘next’ 的结果,所以才有 ‘previous’,=1 不是把 ‘next’ 的结果 覆盖了 ?
xixia07m 2017-08-22
  • 打赏
  • 举报
回复

// remarksecretDlg.h : 头文件
//

#pragma once
#include "afxcmn.h"
#include <string>
/*using std::wstring;
wstring suffixStr;*/


// CremarksecretDlg 对话框
class CremarksecretDlg : public CDialogEx
{
// 构造
public:
	CremarksecretDlg(CWnd* pParent = NULL);	// 标准构造函数
//	TCHAR* path;
// 对话框数据
	enum { IDD = IDD_REMARKSECRET_DIALOG };
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持
//BOOL Regex.Match(string input,string pattern);


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	//void find(LPCTSTR lpPath,std::vector<FileInfo>&FileList);   //有这句.cpp中的find(path,fileList)会报错。
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult);
	CListCtrl mlist;       //自注:控件变量在这里设置
	//CLinkCtrl m_Link;

	afx_msg void OnBnClickedButton1();
	afx_msg void OnBnClickedCheck1();      //把类型由void改成char
	afx_msg void OnBnClickedCheck2();
	afx_msg void OnBnClickedCheck3();
	afx_msg void OnBnClickedCheck4();
	afx_msg void OnBnClickedCheck5();
	afx_msg void ListShow(int pageNo);
	//afx_msg void find(LPCTSTR lpPath,std::vector<FileInfo>&FileList);

	afx_msg void OnBnClickedButtonNext();
	afx_msg void OnBnClickedButtonPrevous();
	int Start;
    int End;
    int max_page;
    int m_PageNo;
};
这是我的.h文件。

void CremarksecretDlg::OnBnClickedButtonPrevous()    //上一页
{
	int m_pageNo=1;
	UINT nCount=fileList.size();
	if(0<pageSize*m_pageNo)
	{
		m_pageNo--;
		ListShow(m_pageNo);
	}
	else
	{
		m_pageNo++;
		MessageBox(_T("已是第一页"));
	}
}
这是我的上一页程序,生成程序后,点击上一页按钮报错了,如上一贴所示的错误,不知错在哪里,请你指教。
schlafenhamster 2017-08-21
  • 打赏
  • 举报
回复
我那个 是 test 没有 previous , 你这个 有 2个 函数 要 用 到 pageNo, 所以必须改为 模块 变量 m_PageNo 放 。h 里(即模块 的 m_) 在 对话框的 构造函数 中 初始化 为 1(即 m_PageNo=1;) 函数中的 pageNo 定义 要 删除(即static int pageNo=1;)
schlafenhamster 2017-08-20
  • 打赏
  • 举报
回复
typedef struct FileInfo { string szFileName; string szFilePath; string szCreateTime; }FileInfo; 去掉所有 std::
xixia07m 2017-08-20
  • 打赏
  • 举报
回复
#include "stdafx.h" #include "remarksecret.h" #include "remarksecretDlg.h" //#include "afxdialogex.h" #include "Resource.h" #include "windows.h" //#include "windows.h" //#include <tchar.h> #include <algorithm> #include <regex> using namespace std; //#include <string> //#include <iterator> //#include <functional> //wstring suffixStr; using std::string; std::regex suffixStr1,suffixStr3,suffixStr4;//=_T("*"); std::string suffixStr,suffixStr2,suffixStr5;//=_T("*"); //suffixStr是个后缀是字符串。 #ifdef _DEBUG #define new DEBUG_NEW #endif struct FileInfo { std::string szFileName; std::string szFilePath; std::string szCreateTime; }; //把这几句放在头文件中而不放在这里,则下面这句就会报错,这是怎么回事? using std::vector; vector<FileInfo>fileList; 红的在这里呢。我把红的放在了程序文件的最上面,是因为void CremarksecretDlg::OnBnClickedButton1()中的 if(!fileList.empty()) fileList.clear(); find(path,fileList); 这两句也得用,您看对吧?
xixia07m 2017-08-20
  • 打赏
  • 举报
回复

void CremarksecretDlg::OnBnClickedButtonPrevous()    //上一页
{
	// TODO: 在此添加控件通知处理程序代码
	/*if(pageNo==1)
    {
        AfxMessageBox(_T("已是第一页"));
    }
    if(pageNo>1)
    {
        pageNo--;
        mlist.DeleteAllItems();
		ListShow(pageNo);
		//delete [MAX_PATH]path;
    }*/
	static int pageNo=1;
	UINT nCount=fileList.size();
	if(0<pageSize*pageNo)
	{
		pageNo--;
		ListShow(pageNo);
	}
	else
	{
		pageNo++;
		MessageBox(_T("已是第一页"));
	}
}


void CremarksecretDlg::OnBnClickedButtonNext()    //下一页
{
	// TODO: 在此添加控件通知处理程序代码
	/*pageNo++;	
	if (pageNo > max_page)
	{			
		pageNo--;
		AfxMessageBox("已是最后一页");
		return;
	}
    mlist.DeleteAllItems();
//	mlist.LockWindowUpdate();
	ListShow(pageNo);
	*/

	static int pageNo=1;
	UINT nCount=fileList.size();

	/*if (nCount%pageSize==0)
	  {
		max_page=nCount/pageSize;
	  }
	else
	  {
		max_page=nCount/pageSize+1;
	  }	
	  */
	if(pageSize*pageNo<nCount)
	{
		pageNo++;
		ListShow(pageNo);		
	}
	else //(pageNo>max_page)     //这里如果是if就不行了。
	  {			
		pageNo--;
		MessageBox("已是最后一页");
		//return;
	  }
}
这是我照你的下一页程序改的程序,现在下一页的功能完全正常,就是上一页的程序还是功能实现不了,请问怎么办?上图是我点上一页按钮,程序的执行错误提示。
schlafenhamster 2017-08-20
  • 打赏
  • 举报
回复
我给你的是 //#define BIF_NEWDIALOGSTYLE 0x0040 //static LPITEMIDLIST s_pidl=0; #define PAGESIZE 16 vector<FileInfo>fileList; 红的在哪里?
xixia07m 2017-08-20
  • 打赏
  • 举报
回复

// remarksecretDlg.h : 头文件
//

#pragma once
#include "afxcmn.h"
#include <string>
/*using std::wstring;
wstring suffixStr;*/


// CremarksecretDlg 对话框
class CremarksecretDlg : public CDialogEx
{
// 构造
public:
	CremarksecretDlg(CWnd* pParent = NULL);	// 标准构造函数
	TCHAR* path;
// 对话框数据
	enum { IDD = IDD_REMARKSECRET_DIALOG };
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持
//BOOL Regex.Match(string input,string pattern);


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	//void find(LPCTSTR lpPath,std::vector<FileInfo>&FileList);   //有这句.cpp中的find(path,fileList)会报错。
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult);
	CListCtrl mlist;       //自注:控件变量在这里设置
	//CLinkCtrl m_Link;

	
	afx_msg void OnBnClickedButton1();
	afx_msg void OnBnClickedCheck1();      //把类型由void改成char
	afx_msg void OnBnClickedCheck2();
	afx_msg void OnBnClickedCheck3();
	afx_msg void OnBnClickedCheck4();
	afx_msg void OnBnClickedCheck5();
	afx_msg void ListShow(int pageNo);
	afx_msg void find(LPCTSTR lpPath,std::vector<FileInfo>&FileList);

	afx_msg void OnBnClickedButtonNext();
	afx_msg void OnBnClickedButtonPrevous();
	int Start;
    int End;
    int max_page;
    //int pageSize;
    int pageNo;
	
	//vector<FileInfo>fileList;
};
所有输出均为最新。 1> remarksecretDlg.cpp 1>d:\vs2010练习专区\标密软件源文件\自己的设计(非密)\remarksecret_a(翻页)(在搞)\remarksecret_a(在搞)\remarksecret\remarksecretdlg.h(50): error C2065: “FileInfo”: 未声明的标识符 1>d:\vs2010练习专区\标密软件源文件\自己的设计(非密)\remarksecret_a(翻页)(在搞)\remarksecret_a(在搞)\remarksecret\remarksecretdlg.cpp(460): error C2664: “CremarksecretDlg::find”: 不能将参数 2 从“std::vector<_Ty>”转换为“std::vector &” 1> with 1> [ 1> _Ty=FileInfo 1> ] 1>d:\vs2010练习专区\标密软件源文件\自己的设计(非密)\remarksecret_a(翻页)(在搞)\remarksecret_a(在搞)\remarksecret\remarksecretdlg.cpp(528): warning C4018: “<”: 有符号/无符号不匹配 1> remarksecret.cpp 1>d:\vs2010练习专区\标密软件源文件\自己的设计(非密)\remarksecret_a(翻页)(在搞)\remarksecret_a(在搞)\remarksecret\remarksecretdlg.h(50): error C2065: “FileInfo”: 未声明的标识符 1> 正在生成代码... 1> 1>生成失败。 1> 1>已用时间 00:00:00.62 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
xixia07m 2017-08-20
  • 打赏
  • 举报
回复
我把全局变量放在了程序的一开始,但是又有了错误,见上图。
schlafenhamster 2017-08-20
  • 打赏
  • 举报
回复
1 你的vc 已定义 BIF_NEWDIALOGSTYLE,注释掉 2 全局变量要 定义在 所有使用它的函数 前,(先定义,后使用)
schlafenhamster 2017-08-19
  • 打赏
  • 举报
回复

// 'show'
void CShowdirDlg::OnButton1() 
{// new file types
	if(!GetTypes2(suffixStr))
	{
		AfxMessageBox("No file extention selected!");
		return;
	}
// get directory
	BROWSEINFO bi;
    ZeroMemory(&bi,sizeof(BROWSEINFO));
	bi.ulFlags |= BIF_NEWDIALOGSTYLE;//窗口可以调整大小,有新建文件夹按钮
    bi.lpszTitle="指定要处理的文件夹";
	if(s_pidl)	bi.pidlRoot=s_pidl;
// Displays a dialog box enabling the user to select a Shell folder.
	LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
//
	TCHAR path[MAX_PATH];//  ! new
    if(pidl != NULL)
    {// Converts an item identifier list to a file system path
        SHGetPathFromIDList(pidl,path); 
    }
	else
	{
		return;
	}
	if(pidl) s_pidl=pidl;
// window ruined by SHBrowseForFolder
	m_list.DeleteAllItems();
	RedrawWindow();
// get files info
	CWaitCursor wait;
	if(!fileList.empty()) fileList.clear();
// fill fileList
    find(path,fileList);
// fill list
	FillList(0);
}

void CShowdirDlg::OnButton2() 
{// not paged
	// TODO: Add your control notification handler code here
static int page=0;
    UINT nCount=fileList.size();
	if(PAGESIZE*(page+1)<nCount)
	{
		page++;
		FillList(page);
	}
	afxDump << "OnButton2\n";
}
注意 if(!fileList.empty()) fileList.clear();
加载更多回复(54)

16,470

社区成员

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

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

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