資源簡介
CFolderDialog MFC 繼承CFiledialog 打開文件夾
老早都想做個這樣的功能對話框.
今天剛好看到別人寫的代碼,就在此基礎上增加了些想要的功能,
現分享給有需要的人.
增加功能:
支持輸入目錄
支持返回選中的文件夾
下次打開時自動使用上次的目錄作為起始目錄.
如果設置了程序注冊表位置 SetRegistryKey(_T("LastFolder")),則下次打開時以最后一次目錄為起點

代碼片段和文件信息
//?FolderDialog.cpp?:?implementation?file
//
#include?“stdafx.h“
#include?“FolderDialog.h“
#include?
#include?
CString?CFolderDialog::LastPath;
//?CFolderDialog
IMPLEMENT_DYNAMIC(CFolderDialog?CFileDialog)
WNDPROC?CFolderDialog::m_wndProc?=?NULL;
BEGIN_MESSAGE_MAP(CFolderDialog?CFileDialog)
END_MESSAGE_MAP()
///static?unsigned?long?sLastRtTime;
/***************************
當按下Enter?時
?*************************/
////安全的勾子函數注冊
static?HHOOK??sgHook;
static?int????sgHookUseCnt?=?0;
#define??FOLER_PROP????“MyFolderDialogProp“
#define??FOLER_PROPWND????“MyFolderDialogPropWnd“
HWND?GetFolderTopWnd(HWND?hwnd)
{
????HANDLE?h;
????while(1)
????{
????????h?=?GetProp(hwnd?FOLER_PROP);
????????if?(h)
????????{
????????????return?hwnd;
????????}
????????hwnd?=?GetParent(hwnd);
????????if?(!hwnd)
????????{
????????????break;
????????}
????}
????return?NULL;
}
static?LRESULT?CALLBACK?MyKeyboardProc(int?nCode??????//?hook?code
???????????????????????????????????????WPARAM?wParam??//?current-process?flag
???????????????????????????????????????LPARAM?lParam???//?message?data
??????????????????????????????????????)
{
????MSG?*msg?=?(MSG?*)lParam;
????if?(msg->message?==?WM_KEYDOWN?&&?msg->wParam?==?VK_RETURN)
????{
????????//sgIsKey?=?TRUE;
????????HWND?h?=?GetFolderTopWnd(msg->hwnd);
????????if?(h)
????????{
????????????SetProp(h?FOLER_PROP?(void?*)2);
????????}
????????//? TCHAR?name[256]={0};
????????//? GetClassName(msg->hwndname256);
????????//
????????//? CRect?rc;
????????//? GetClientRect(msg->hwndrc);
????}
????else?if(msg->message?==?WM_LBUTTONDOWN)
????{
????????HWND?h?=?GetFolderTopWnd(msg->hwnd);
????????if?(h?&&?GetDlgCtrlID(msg->hwnd)?==?IDOK)
????????{
????????????SetProp(h?FOLER_PROP?(void?*)1);
????????}
????}
????LRESULT?l?=?CallNextHookEx(sgHook?nCode?wParam?lParam);
????return?l;
}
//?Function?name????:?WindowProcNew
//?Description??????:?Call?this?function?when?user?navigate?into?CFileDialog.
//?Return?type??????:?LRESULT
//?Argument?????????:?HWND?hwnd
//?Argument?????????:?UINT?message
//?Argument?????????:?WPARAM?wParam
//?Argument?????????:?LPARAM?lParam
LRESULT?CALLBACK?CFolderDialog::WindowProcNew(HWND?hwnd?UINT?message?WPARAM?wParam?LPARAM?lParam)
{
????if(message?==??WM_COMMAND)
????{
????????if(HIWORD(wParam)?==?BN_CLICKED)
????????{
????????????if(LOWORD(wParam)?==?IDOK)
????????????{
????????????????int??v?=?(int)GetProp(hwnd?FOLER_PROP);
????????????????if(v?!=?2)
????????????????{
????????????????????CFolderDialog?*pDlg?=?(CFolderDialog?*)::GetProp(hwnd?FOLER_PROPWND);
????????????????????if?(pDlg)
????????????????????{
????????????????????????pDlg->UpDatePath();
????????????????????}
????????????????????pDlg?=?(CFolderDialog?*)::CWnd::FromHandle(hwnd);
????????????????????if?(pDlg)
????????????????????{
????????????????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????9373??2017-04-01?17:19??StadyFolderDialog\Debug\MyBotton.obj
?????文件???????6779??2017-04-01?17:35??StadyFolderDialog\FolderDialog.cpp
?????文件????????893??2017-04-01?17:41??StadyFolderDialog\FolderDialog.h
?????文件???????3777??2017-04-01?09:09??StadyFolderDialog\ReadMe.txt
?????文件???????1078??2017-04-01?09:09??StadyFolderDialog\res\StadyFolderDialog.ico
?????文件????????409??2017-04-01?09:09??StadyFolderDialog\res\StadyFolderDialog.rc2
?????文件????????557??2017-04-01?17:19??StadyFolderDialog\resource.h
?????文件??????34916??2017-04-01?17:19??StadyFolderDialog\StadyFolderDialog.aps
?????文件???????1168??2017-04-01?17:41??StadyFolderDialog\StadyFolderDialog.clw
?????文件???????2217??2017-04-01?09:09??StadyFolderDialog\StadyFolderDialog.cpp
?????文件???????4464??2017-04-01?17:42??StadyFolderDialog\StadyFolderDialog.dsp
?????文件????????557??2017-04-01?09:09??StadyFolderDialog\StadyFolderDialog.dsw
?????文件???????1445??2017-04-01?09:09??StadyFolderDialog\StadyFolderDialog.h
?????文件?????198656??2017-04-01?17:42??StadyFolderDialog\StadyFolderDialog.opt
?????文件???????1978??2017-04-01?17:41??StadyFolderDialog\StadyFolderDialog.plg
?????文件????????384??2017-04-01?17:42??StadyFolderDialog\StadyFolderDialog.positions
?????文件???????4628??2017-04-01?17:19??StadyFolderDialog\StadyFolderDialog.rc
?????文件???????2878??2017-04-01?17:19??StadyFolderDialog\StadyFolderDialogDlg.cpp
?????文件???????1442??2017-04-01?17:19??StadyFolderDialog\StadyFolderDialogDlg.h
?????文件????????219??2017-04-01?09:09??StadyFolderDialog\StdAfx.cpp
?????文件???????1054??2017-04-01?09:09??StadyFolderDialog\StdAfx.h
?????目錄??????????0??2017-04-01?17:41??StadyFolderDialog\Debug
?????目錄??????????0??2017-04-01?17:41??StadyFolderDialog\Release
?????目錄??????????0??2017-04-01?09:09??StadyFolderDialog\res
?????目錄??????????0??2017-04-01?17:42??StadyFolderDialog
?????文件??????24576??2017-04-01?17:43??StadyFolderDialog.exe
-----------?---------??----------?-----??----
???????????????303448????????????????????26
- 上一篇:c++與c#命名管道
- 下一篇:c語言 利用學生信息棧實現學生信息單鏈表的逆置
評論
共有 條評論