win32编辑框文件拖放和文字过滤


   我们可能会遇到这样的需求,我们要计算一个文件的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;
	}

需要注意的是,这里增加了对删除键的处理,否则删除键也被屏蔽掉了。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值