文件浏览器代码分析

本文介绍了一个简单的文件浏览器的实现过程,包括布局设计、文件列表显示及路径切换等功能。通过Windows API进行窗口创建与消息处理,实现文件夹内容展示及文件预览。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们要做的文件浏览器就是这个样子了:先来讲下布局最上方是一个static的空间,内容那个是当前的路径

左边是一个list box,列出了当前路径下的文件列表

右边是有效文件的预览(当前版本只支持ASCII编码的,如果遇到了Unicode编码的会预览到乱码)

创建窗口这个必须的不讲了。

从WM_CREATE开始:

if(uimsg==WM_CREATE)
	{
		cxChar=LOWORD(GetDialogBaseUnits());
		cyChar=HIWORD(GetDialogBaseUnits());
		hwndLsit=CreateWindow(TEXT("listbox"),NULL,WS_CHILD | WS_VISIBLE | LBS_STANDARD,cxChar,3*cyChar,
			13*cxChar+GetSystemMetrics(SM_CXVSCROLL),20*cyChar,hwnd,(HMENU)1,
			(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
		GetCurrentDirectory(MAX_PATH+1,szBuffer);
		hwndText=CreateWindow(TEXT("static"),szBuffer,WS_CHILD | WS_VISIBLE | SS_LEFT,cxChar,cyChar,
			cxChar*MAX_PATH,cyChar,hwnd,(HMENU)2,
			(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
		SendMessage(hwndLsit,LB_DIR,DIRATTR,(LPARAM)TEXT("*.*"));
		return 0;
	}

在WM_CREATE里面创建了一个list box和一个static控件,初始化static控件的内容为当前路径通过:

GetCurrentDirectory(MAX_PATH+1,szBuffer);
获取当前路径到szBuffer里面,szBuffer大小为MAX_PATH+1(+1作为'\0')

SendMessage(hwndLsit,LB_DIR,DIRATTR,(LPARAM)TEXT("*.*"));
该语句自动会addString到list box,把当前路径的文件列表增添到list box控件

第3个参数是要增加的文件列表的属性:

第3个参数就是这些值的或

第四个参数指定了文件限定符串,一般文件都是"*.*"这样的形式的,例如(hello.cpp对吧)

编完之后就会是这样:

接着就编写如果我们双击list box的item就应该改变当前路径:


else if(uimsg==WM_COMMAND)
	{
		if(1==LOWORD(wparam) && LBN_DBLCLK==HIWORD(wparam))
		{
			int index=SendMessage(hwndLsit,LB_GETCURSEL,0,0);
			if(index==LB_ERR) return 0;
			SendMessage(hwndLsit,LB_GETTEXT,index,(LPARAM)szBuffer);

			hfile=CreateFile(szBuffer,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);//打开文件
			if(hfile!=INVALID_HANDLE_VALUE)//index为文件名,打开文件成功
			{
				bValidFile=true;
				CloseHandle(hfile);
				lstrcpy(szFile,szBuffer);
				GetCurrentDirectory(MAX_PATH+1,szBuffer);
				lstrcat(szBuffer,TEXT("\\"));
				lstrcat(szBuffer,szFile);
				SetWindowText(hwndText,szBuffer);//如果文件有效szBuffer就保存文件的路径了
			}
			else//index不是有效文件,就是[..],[Debug],[-c-]这些的处理,szBuffer[]保存着index项的内容
			{
				szBuffer[lstrlen(szBuffer)-1]='\0';//把右括号去掉(']'这个去掉)
				//先尝试去子目录([Debug'\0'这些)
				if(!SetCurrentDirectory(szBuffer+1))//去子目录成功就去,不成功执行if语句块
				{
					szBuffer[3]=TEXT(':');
					szBuffer[4]=TEXT('\0');
					SetCurrentDirectory(szBuffer+2);//去其他盘符([-c:'\0')
				}
				GetCurrentDirectory(MAX_PATH+1,szBuffer);
				SetWindowText(hwndText,szBuffer);//更新Text的内容
				SendMessage(hwndLsit,LB_RESETCONTENT,0,0);//先把之前的content清空
				SendMessage(hwndLsit,LB_DIR,DIRATTR,(LPARAM)TEXT("*.*"));//更新listBox的内容
				
			}
			InvalidateRect(hwnd,NULL,true);
		}
		return 0;
	}
最后在右侧找个rect来DrawText

else if(uimsg==WM_PAINT)
	{
		hdc=BeginPaint(hwnd,&ps);
		DWORD i;
		if(bValidFile)//打开了有效文件,此时szBuffer保存了有效文件的路径
		{
			bValidFile=false;//标志设置回去
			hfile=CreateFile(szBuffer,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
			ReadFile(hfile,buffer,8124,&i,NULL);
			CloseHandle(hfile);

			SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
			DrawTextA(hdc,(LPCSTR)buffer,i,&rect,DT_WORDBREAK | DT_EXPANDTABS | DT_NOCLIP | DT_NOPREFIX);
		}
		EndPaint(hwnd,&ps);
		return 0;
	}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值