我们要做的文件浏览器就是这个样子了:先来讲下布局最上方是一个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;
}