CnCrypt代码 之 限制只能输入数字的文本框

LRESULT CALLBACK NumberFieldProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    WNDPROC wp = (WNDPROC)GetWindowLongPtr(hWnd, GWLP_USERDATA);

    switch (message)
    {
    case WM_PASTE:
        return 1;
    case WM_CONTEXTMENU:
        return 1;
    case WM_CHAR:
    {
        char nChar = (char)wParam;
        BOOL bConitue = (nChar >= '0' && nChar <= '9')
            || nChar == '.'
            || nChar == 8;
        if (!bConitue)
        {
            return 1;
        }

        WCHAR szOldPassword[128];
        GetWindowText(hWnd, szOldPassword, ARRAYSIZE(szOldPassword));
        DWORD dwOldSel = Edit_GetSel(hWnd);
        LRESULT lResult = CallWindowProc(wp, hWnd, message, wParam, lParam);
        WCHAR szNewPassword[128];
        GetWindowText(hWnd, szNewPassword, ARRAYSIZE(szNewPassword));
        WCHAR * lpPos = wcsstr(szNewPassword, L".");
        // 如果点在第一位,或者多于一个点,或者小数点多于两位。
        if (lpPos != NULL && (lpPos == szNewPassword || wcsstr(lpPos + 1, L".") !=NULL || wcslen(lpPos) > 3))
        {
            SetWindowText(hWnd, szOldPassword);
            Edit_SetSel(hWnd, HIWORD(dwOldSel), LOWORD(dwOldSel));
        }
        return lResult;
    }
    }

    return CallWindowProc(wp, hWnd, message, wParam, lParam);
}

void    ToNumberField(HWND hwndCtrl)
{
    ::SendMessage(hwndCtrl, EM_LIMITTEXT, 12, 0);
    SetWindowLongPtr(hwndCtrl, GWLP_USERDATA, (LONG_PTR)GetWindowLongPtr(hwndCtrl, GWLP_WNDPROC));
    SetWindowLongPtr(hwndCtrl, GWLP_WNDPROC, (LONG_PTR)NumberFieldProc);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值