【摘 要】在windows操作系統(tǒng)使用過程中,經(jīng)常要使用資源管理器以實現(xiàn)對文件的各種操作,本文詳細闡述了如何用c語言調(diào)用Win32API創(chuàng)建類似資源管理器的方法,內(nèi)容涉及到自定義窗口的實現(xiàn),windows消息處理,窗口重繪,托盤區(qū)的操作,多標簽的實現(xiàn)原理等多方面的編程問題,在實現(xiàn)過程中,不僅可以接觸到windows底層的相關技術,而且對算法基礎和數(shù)據(jù)結(jié)構(gòu)也進行了深入的探討和研究。
【關鍵詞】c語言;Win32API;資源管理器
在windows操作系統(tǒng)下,有很多非常優(yōu)秀的資源管理器軟件,它們不僅能讓用戶有良好的交互體驗,而且能快速高效的對文件進行相應的操作。用C語言開發(fā)資源管理器軟件,不僅可以提高C語言的編程能力,而且能夠深入理解操作系統(tǒng)的核心,對于計算機編程和教學無疑是一種極大的促進。
一、開發(fā)資源管理器的目的
資源管理器的目的是為了高效方便的實現(xiàn)對文件的打開,刪除,復制,粘貼等功能,然而對于windows自帶的資源管理器,有很多不便之處,于是,市面上出現(xiàn)了很多增強版的資源管理器軟件,實現(xiàn)了很多特性,可以有效的提高操作效率。開發(fā)本資源管理器的目的也在于此:高效而便捷的操作,提升用戶體驗。為了實現(xiàn)這個目的,就要了解目前的常用資源管理器類軟件的優(yōu)劣,針對性的開發(fā)出特色性的功能,以滿足個性化的需求。
二、本資源管理器實現(xiàn)的特性
1.純鍵盤操作。鼠標的操作在文件管理過程中,經(jīng)常是低效率的,不論是窗口的開關、移動,還是文件的選擇,都需要頻繁的移動和點擊,這也是導致“鼠標手”的一個原因。通過鍵盤輸入,不僅可以通過軟件提供的相關特性,實現(xiàn)相關操作,而且簡單高效。
2.邊輸邊查。在日常的應用中,頻繁的目錄跳轉(zhuǎn),以及文件和目錄的定位是最常用的功能,然而,傳統(tǒng)的資源管理器軟件在這方面有明顯的缺陷,具體表現(xiàn)在以下方面:首先,如果要打開多級目錄下的某個文件,需要通過鼠標點擊層層進入,有時如果忘記具體目錄的名稱,甚至要逐個目錄打開查找,效率非常低下;其次,一個目錄下文件過多時,要在眾多文件和文件夾中找到自己所需要的目標,常常要逐個查看名稱,耗時費力;最后,無法實現(xiàn)模糊匹配,對中文名稱難以過濾,只能通過排序查找,不符合國情。鑒于以上問題,本軟件實現(xiàn)了輸入過程中自動過濾顯示匹配的文件和目錄。
3.多標簽。多標簽是目前許多軟件的一個特性,然而,傳統(tǒng)的資源管理器卻并無此功能。多標簽功能可以使用戶避免重復打開軟件,從而簡化操作。
三、技術要點
1.自定義樣式。Win32API創(chuàng)建windows對話框時,首先要注冊窗口類WNDCLASSEX,需要注意的是,要讓窗口響應鼠標雙擊事件時,需要設置窗口類樣式CS_DBLCLKS。在注冊窗口類時,需要為其制定消息處理過程,函數(shù)原型如下:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)為了要處理程序參數(shù)傳遞問題,在WinMain函數(shù)入口處,我們通過調(diào)用GetCommandLine()獲取命令行參數(shù),這樣,就可以在命令行下指定打開的路徑了。為了實現(xiàn)自定義樣式,調(diào)用CreateWindowEx時,要特別指定窗口的擴展風格,具體如下:WS_EX_TOOLWINDOW/*不在任務欄顯示*/| WS_EX_TOPMOST/*置頂*/ | WS_EX_LAYERED/*窗口透明化*/在Windows 2000/XP中,User32.dll增加了一個新函數(shù)SetLayeredWindowAttributes。要使用該函數(shù),我們必須在生成窗口或使用SetWindowLong函數(shù)中設置窗口風格WS_EX_LAYERED (0x00080000)。該風格一旦被設置,我們就可以調(diào)用該函數(shù)來透明化窗口。具體調(diào)用過程如下:
HMODULE hUser32 = GetModuleHandle(\"USER32.DLL\");
g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32, \"SetLayeredWindowAttributes\");
(*g_pSetLayeredWindowAttributes)(hwnd, RGB(255,255,255), 150, 2);
2.系統(tǒng)托盤區(qū)操作。系統(tǒng)托盤區(qū)操作主要是通過調(diào)用Shell_NotifyIcon來實現(xiàn)的,其函數(shù)原型如下:
BOOL Shell_NotifyIcon(DWORD dwMessage,NOTIFYICONDATA lpdata);
通過控制dwMessage參數(shù)值,即可控制托盤區(qū)圖標的顯示和刪除。在消息處理過程中,WM_CREATE消息處理時,初始化NOTIFYICONDATA ,并且顯示托盤區(qū)圖標,在處理關閉程序消息WM_CLOSE時,及時的刪除托盤區(qū)圖標。為了能夠處理托盤圖標的點擊消息,需要增加自定義消息WM_TRAYNOTIFY,在此消息處理時,可以區(qū)分鼠標左右鍵點擊操作,并處理相應的消息。在右鍵點擊時,我們通過創(chuàng)建右鍵菜單,可以控制程序的顯示、退出等操作。
3.多標簽的實現(xiàn)原理。為了實現(xiàn)多標簽,我們首先需要創(chuàng)建Pages標簽鏈表,在該鏈表對應的節(jié)點結(jié)構(gòu)體如下:
typedef struct _Pages{
char* path;
int id;
struct _Pages *next;
} Pages;
其中path為當前標簽頁對應的完整路徑,在切換標簽時,通過該路徑可以確定當前的文件列表內(nèi)容。此鏈表為單向鏈表,在創(chuàng)建標簽時,要注意鏈表的插入操作,通過在刪除標簽頁時,應及時清除內(nèi)存,避免內(nèi)存泄露情況的發(fā)生。切換標簽頁,實際上就是鏈表的查找過程:當切換至某個標簽頁時,通過鏈表節(jié)點中所記錄的完整路徑,得到當前所操作的目錄,從而重繪標題欄中的標簽頁名稱。
4.文件列表的繪制和操作。資源管理器的重要部分就是文件列表的顯示和操作,在WM_PAINT窗口重繪消息處理時, 通過標簽節(jié)點所對應的路徑,得到該路徑下的所有文件列表信息,需要注意的是,如果路徑為空,此時應顯示驅(qū)動器列表,通過調(diào)用GetLogicalDriveStrings,可以得到所有驅(qū)動器字符串信息,而后可以得到每個驅(qū)動器的詳細信息。在得到某個路徑下的文件列表時,為了更好地區(qū)分文件和目錄,目錄采用粗體顯示,在輸入時,通過獲得路徑分割符\\后的字符串,來模糊匹配,過濾顯示所有符合條件的文件和目錄。
通過處理WM_KEYDOWN消息,文件列表的操作可以通過鍵盤快速進行,方向鍵可以循環(huán)選中條目,回車鍵可以跳轉(zhuǎn)目錄和打開文件。
四、結(jié)語
本文論述了C語言創(chuàng)建資源管理器的方法和注意事項,分析了傳統(tǒng)資源管理器的優(yōu)劣,通過Win32Api開發(fā)了更加高效實用的軟件。在此過程中,不僅提高了C語言編程水平,而且創(chuàng)新性的實現(xiàn)了Windows環(huán)境下更加高效的操作方法。在軟件行業(yè)高速發(fā)展的今天,筆者認為,創(chuàng)新性思維是軟件從業(yè)者的靈魂所在,是我們永久需要思考的話題。
參考文獻:
[1] 赫伯特希爾特.C語言大全(第四版), 2001.09
[2] 新編Windows API參考大全,電子工業(yè)出版社,2000.04