论文部分内容阅读
【摘 要】在windows操作系统使用过程中,经常要使用资源管理器以实现对文件的各种操作,本文详细阐述了如何用c语言调用Win32API创建类似资源管理器的方法,内容涉及到自定义窗口的实现,windows消息处理,窗口重绘,托盘区的操作,多标签的实现原理等多方面的编程问题,在实现过程中,不仅可以接触到windows底层的相关技术,而且对算法基础和数据结构也进行了深入的探讨和研究。
【关键词】c语言;Win32API;资源管理器
在windows操作系统下,有很多非常优秀的资源管理器软件,它们不仅能让用户有良好的交互体验,而且能快速高效的对文件进行相应的操作。用C语言开发资源管理器软件,不仅可以提高C语言的编程能力,而且能够深入理解操作系统的核心,对于计算机编程和教学无疑是一种极大的促进。
一、开发资源管理器的目的
资源管理器的目的是为了高效方便的实现对文件的打开,删除,复制,粘贴等功能,然而对于windows自带的资源管理器,有很多不便之处,于是,市面上出现了很多增强版的资源管理器软件,实现了很多特性,可以有效的提高操作效率。开发本资源管理器的目的也在于此:高效而便捷的操作,提升用户体验。为了实现这个目的,就要了解目前的常用资源管理器类软件的优劣,针对性的开发出特色性的功能,以满足个性化的需求。
二、本资源管理器实现的特性
1.纯键盘操作。鼠标的操作在文件管理过程中,经常是低效率的,不论是窗口的开关、移动,还是文件的选择,都需要频繁的移动和点击,这也是导致“鼠标手”的一个原因。通过键盘输入,不仅可以通过软件提供的相关特性,实现相关操作,而且简单高效。
2.边输边查。在日常的应用中,频繁的目录跳转,以及文件和目录的定位是最常用的功能,然而,传统的资源管理器软件在这方面有明显的缺陷,具体表现在以下方面:首先,如果要打开多级目录下的某个文件,需要通过鼠标点击层层进入,有时如果忘记具体目录的名称,甚至要逐个目录打开查找,效率非常低下;其次,一个目录下文件过多时,要在众多文件和文件夹中找到自己所需要的目标,常常要逐个查看名称,耗时费力;最后,无法实现模糊匹配,对中文名称难以过滤,只能通过排序查找,不符合国情。鉴于以上问题,本软件实现了输入过程中自动过滤显示匹配的文件和目录。
3.多标签。多标签是目前许多软件的一个特性,然而,传统的资源管理器却并无此功能。多标签功能可以使用户避免重复打开软件,从而简化操作。
三、技术要点
1.自定义样式。Win32API创建windows对话框时,首先要注册窗口类WNDCLASSEX,需要注意的是,要让窗口响应鼠标双击事件时,需要设置窗口类样式CS_DBLCLKS。在注册窗口类时,需要为其制定消息处理过程,函数原型如下:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)为了要处理程序参数传递问题,在WinMain函数入口处,我们通过调用GetCommandLine()获取命令行参数,这样,就可以在命令行下指定打开的路径了。为了实现自定义样式,调用CreateWindowEx时,要特别指定窗口的扩展风格,具体如下:WS_EX_TOOLWINDOW/*不在任务栏显示*/| WS_EX_TOPMOST/*置顶*/ | WS_EX_LAYERED/*窗口透明化*/在Windows 2000/XP中,User32.dll增加了一个新函数SetLayeredWindowAttributes。要使用该函数,我们必须在生成窗口或使用SetWindowLong函数中设置窗口风格WS_EX_LAYERED (0x00080000)。该风格一旦被设置,我们就可以调用该函数来透明化窗口。具体调用过程如下:
HMODULE hUser32 = GetModuleHandle("USER32.DLL");
g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32, "SetLayeredWindowAttributes");
(*g_pSetLayeredWindowAttributes)(hwnd, RGB(255,255,255), 150, 2);
2.系统托盘区操作。系统托盘区操作主要是通过调用Shell_NotifyIcon来实现的,其函数原型如下:
BOOL Shell_NotifyIcon(DWORD dwMessage,NOTIFYICONDATA lpdata);
通过控制dwMessage参数值,即可控制托盘区图标的显示和删除。在消息处理过程中,WM_CREATE消息处理时,初始化NOTIFYICONDATA ,并且显示托盘区图标,在处理关闭程序消息WM_CLOSE时,及时的删除托盘区图标。为了能够处理托盘图标的点击消息,需要增加自定义消息WM_TRAYNOTIFY,在此消息处理时,可以区分鼠标左右键点击操作,并处理相应的消息。在右键点击时,我们通过创建右键菜单,可以控制程序的显示、退出等操作。
3.多标签的实现原理。为了实现多标签,我们首先需要创建Pages标签链表,在该链表对应的节点结构体如下:
typedef struct _Pages{
char* path;
int id;
struct _Pages *next;
} Pages;
其中path为当前标签页对应的完整路径,在切换标签时,通过该路径可以确定当前的文件列表内容。此链表为单向链表,在创建标签时,要注意链表的插入操作,通过在删除标签页时,应及时清除内存,避免内存泄露情况的发生。切换标签页,实际上就是链表的查找过程:当切换至某个标签页时,通过链表节点中所记录的完整路径,得到当前所操作的目录,从而重绘标题栏中的标签页名称。
4.文件列表的绘制和操作。资源管理器的重要部分就是文件列表的显示和操作,在WM_PAINT窗口重绘消息处理时, 通过标签节点所对应的路径,得到该路径下的所有文件列表信息,需要注意的是,如果路径为空,此时应显示驱动器列表,通过调用GetLogicalDriveStrings,可以得到所有驱动器字符串信息,而后可以得到每个驱动器的详细信息。在得到某个路径下的文件列表时,为了更好地区分文件和目录,目录采用粗体显示,在输入时,通过获得路径分割符\\后的字符串,来模糊匹配,过滤显示所有符合条件的文件和目录。
通过处理WM_KEYDOWN消息,文件列表的操作可以通过键盘快速进行,方向键可以循环选中条目,回车键可以跳转目录和打开文件。
四、结语
本文论述了C语言创建资源管理器的方法和注意事项,分析了传统资源管理器的优劣,通过Win32Api开发了更加高效实用的软件。在此过程中,不仅提高了C语言编程水平,而且创新性的实现了Windows环境下更加高效的操作方法。在软件行业高速发展的今天,笔者认为,创新性思维是软件从业者的灵魂所在,是我们永久需要思考的话题。
参考文献:
[1] 赫伯特希尔特.C语言大全(第四版), 2001.09
[2] 新编Windows API参考大全,电子工业出版社,2000.04
【关键词】c语言;Win32API;资源管理器
在windows操作系统下,有很多非常优秀的资源管理器软件,它们不仅能让用户有良好的交互体验,而且能快速高效的对文件进行相应的操作。用C语言开发资源管理器软件,不仅可以提高C语言的编程能力,而且能够深入理解操作系统的核心,对于计算机编程和教学无疑是一种极大的促进。
一、开发资源管理器的目的
资源管理器的目的是为了高效方便的实现对文件的打开,删除,复制,粘贴等功能,然而对于windows自带的资源管理器,有很多不便之处,于是,市面上出现了很多增强版的资源管理器软件,实现了很多特性,可以有效的提高操作效率。开发本资源管理器的目的也在于此:高效而便捷的操作,提升用户体验。为了实现这个目的,就要了解目前的常用资源管理器类软件的优劣,针对性的开发出特色性的功能,以满足个性化的需求。
二、本资源管理器实现的特性
1.纯键盘操作。鼠标的操作在文件管理过程中,经常是低效率的,不论是窗口的开关、移动,还是文件的选择,都需要频繁的移动和点击,这也是导致“鼠标手”的一个原因。通过键盘输入,不仅可以通过软件提供的相关特性,实现相关操作,而且简单高效。
2.边输边查。在日常的应用中,频繁的目录跳转,以及文件和目录的定位是最常用的功能,然而,传统的资源管理器软件在这方面有明显的缺陷,具体表现在以下方面:首先,如果要打开多级目录下的某个文件,需要通过鼠标点击层层进入,有时如果忘记具体目录的名称,甚至要逐个目录打开查找,效率非常低下;其次,一个目录下文件过多时,要在众多文件和文件夹中找到自己所需要的目标,常常要逐个查看名称,耗时费力;最后,无法实现模糊匹配,对中文名称难以过滤,只能通过排序查找,不符合国情。鉴于以上问题,本软件实现了输入过程中自动过滤显示匹配的文件和目录。
3.多标签。多标签是目前许多软件的一个特性,然而,传统的资源管理器却并无此功能。多标签功能可以使用户避免重复打开软件,从而简化操作。
三、技术要点
1.自定义样式。Win32API创建windows对话框时,首先要注册窗口类WNDCLASSEX,需要注意的是,要让窗口响应鼠标双击事件时,需要设置窗口类样式CS_DBLCLKS。在注册窗口类时,需要为其制定消息处理过程,函数原型如下:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)为了要处理程序参数传递问题,在WinMain函数入口处,我们通过调用GetCommandLine()获取命令行参数,这样,就可以在命令行下指定打开的路径了。为了实现自定义样式,调用CreateWindowEx时,要特别指定窗口的扩展风格,具体如下:WS_EX_TOOLWINDOW/*不在任务栏显示*/| WS_EX_TOPMOST/*置顶*/ | WS_EX_LAYERED/*窗口透明化*/在Windows 2000/XP中,User32.dll增加了一个新函数SetLayeredWindowAttributes。要使用该函数,我们必须在生成窗口或使用SetWindowLong函数中设置窗口风格WS_EX_LAYERED (0x00080000)。该风格一旦被设置,我们就可以调用该函数来透明化窗口。具体调用过程如下:
HMODULE hUser32 = GetModuleHandle("USER32.DLL");
g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32, "SetLayeredWindowAttributes");
(*g_pSetLayeredWindowAttributes)(hwnd, RGB(255,255,255), 150, 2);
2.系统托盘区操作。系统托盘区操作主要是通过调用Shell_NotifyIcon来实现的,其函数原型如下:
BOOL Shell_NotifyIcon(DWORD dwMessage,NOTIFYICONDATA lpdata);
通过控制dwMessage参数值,即可控制托盘区图标的显示和删除。在消息处理过程中,WM_CREATE消息处理时,初始化NOTIFYICONDATA ,并且显示托盘区图标,在处理关闭程序消息WM_CLOSE时,及时的删除托盘区图标。为了能够处理托盘图标的点击消息,需要增加自定义消息WM_TRAYNOTIFY,在此消息处理时,可以区分鼠标左右键点击操作,并处理相应的消息。在右键点击时,我们通过创建右键菜单,可以控制程序的显示、退出等操作。
3.多标签的实现原理。为了实现多标签,我们首先需要创建Pages标签链表,在该链表对应的节点结构体如下:
typedef struct _Pages{
char* path;
int id;
struct _Pages *next;
} Pages;
其中path为当前标签页对应的完整路径,在切换标签时,通过该路径可以确定当前的文件列表内容。此链表为单向链表,在创建标签时,要注意链表的插入操作,通过在删除标签页时,应及时清除内存,避免内存泄露情况的发生。切换标签页,实际上就是链表的查找过程:当切换至某个标签页时,通过链表节点中所记录的完整路径,得到当前所操作的目录,从而重绘标题栏中的标签页名称。
4.文件列表的绘制和操作。资源管理器的重要部分就是文件列表的显示和操作,在WM_PAINT窗口重绘消息处理时, 通过标签节点所对应的路径,得到该路径下的所有文件列表信息,需要注意的是,如果路径为空,此时应显示驱动器列表,通过调用GetLogicalDriveStrings,可以得到所有驱动器字符串信息,而后可以得到每个驱动器的详细信息。在得到某个路径下的文件列表时,为了更好地区分文件和目录,目录采用粗体显示,在输入时,通过获得路径分割符\\后的字符串,来模糊匹配,过滤显示所有符合条件的文件和目录。
通过处理WM_KEYDOWN消息,文件列表的操作可以通过键盘快速进行,方向键可以循环选中条目,回车键可以跳转目录和打开文件。
四、结语
本文论述了C语言创建资源管理器的方法和注意事项,分析了传统资源管理器的优劣,通过Win32Api开发了更加高效实用的软件。在此过程中,不仅提高了C语言编程水平,而且创新性的实现了Windows环境下更加高效的操作方法。在软件行业高速发展的今天,笔者认为,创新性思维是软件从业者的灵魂所在,是我们永久需要思考的话题。
参考文献:
[1] 赫伯特希尔特.C语言大全(第四版), 2001.09
[2] 新编Windows API参考大全,电子工业出版社,2000.04