我們可能會遇到這樣的需求,我們要計算一個文件的md5值,爲此我們必須輸入文件的地址,或者通過一個按鈕打開文件瀏覽框,然後選擇要計算的文件,有時候往往文件就在我們眼前但是我們還是需要瀏覽器一步步找它的路徑,這時候如果編輯框支持文件的拖放就方便很多了。關於編輯框支持文件拖放MFC下實現是比較簡單的,我今天來講下win32下如何實現,代碼比較簡單:#include <Windows.h>
#include <tchar.h>
#include "resource.h"
static WNDPROC g_EDITVProc;
LRESULT CALLBACK EditVProc(HWND hEdit, UINT Msg, WPARAM wParam, LPARAM lParam)
{
TCHAR szPath[MAX_PATH];
switch (Msg)
{
case WM_CREATE:
break;
case WM_DROPFILES://文件拖放事件
memset(szPath, 0, sizeof(szPath));
DragQueryFile((HDROP)wParam, 0, szPath, _countof(szPath));
SetWindowText(hEdit, szPath);
DragFinish((HDROP)wParam);
break;
}
return CallWindowProc(g_EDITVProc, hEdit, Msg, wParam, lParam);
}
BOOL CALLBACK DialogProc(HWND hWnd, UINT uMessage, WPARAM wp, LPARAM lp)
{
switch (uMessage)
{
case WM_INITDIALOG:{
HWND hEdit = GetDlgItem(hWnd, IDC_EDIT_FILE);
DragAcceptFiles(hEdit, TRUE);//使編輯框支持文件拖放,可以直接設置屬性來實現
g_EDITVProc = (WNDPROC)SetWindowLong(hEdit, GWL_WNDPROC, (LONG)EditVProc);
break;
}
case WM_CLOSE:
EndDialog(hWnd, 0);
break;
default:
break;
}
return FALSE;
}
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_MAIN), NULL, DialogProc);
return 0;
}
原理爲採用SetWindowLong函數對編輯框消息回調函數進行攔截然後重寫,實現其WM_DROPFILES消息。
除此之外我們可能還有這樣的需求:比如我們要求用戶輸入身份證號,我們知道身份證號只能允許輸入0-9和X,爲此我們需要對編輯框實現過濾功能,同樣很簡單,我們只需要在編輯框的回調函數中增加 WM_CHAR的消息處理即可,代碼如下:
case WM_CHAR://字符輸入事件
if ((wParam >= '0' && wParam <= '9')
|| wParam == 'x' || wParam == 'X' || wParam == VK_BACK )
{
return CallWindowProc(g_EDITVProc, hEdit, Msg, wParam, lParam);
}
else
{
return 0;
}
break;
}
需要注意的是,這裏增加了對刪除鍵的處理,否則刪除鍵也被屏蔽掉了。