回 帖 发 新 帖 刷新版面

主题:[原创]分享自定义浮点编辑框

#include <windows.h>
#include<tchar.h>
#include "resource.h"


#define UNICODE



WNDPROC    lpOldProcEdit;

BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK ProcEdit (HWND,UINT,WPARAM,LPARAM);



int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{    
    WNDCLASS    wndclass;    
    GetClassInfo(NULL,TEXT("Edit"),&wndclass);
    lpOldProcEdit = wndclass.lpfnWndProc;
    wndclass.lpfnWndProc = ProcEdit;
    wndclass.hInstance = hInstance;
    wndclass.lpszClassName = TEXT("FloatEdit");    
    RegisterClass(&wndclass);
    DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgProc,(LPARAM)NULL);
    return 0;
}


BOOL CALLBACK ProcDipCal(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch(message)
    {
    case WM_INITDIALOG:
        return TRUE;
    case WM_CLOSE:        
        EndDialog(hDlg,TRUE);
        return TRUE;
    }
    return FALSE;
}




LRESULT CALLBACK ProcEdit (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    TCHAR    szBuffer[50],ch;
    LPCTSTR    lpsz,lpGlobal;
    GLOBALHANDLE    hGlobal;
    int    nStart,nEnd,i,len;

    switch(message)
    {    
    case WM_CHAR:    
        ch = (TCHAR)wParam;        
        if(ch<32)            
        {
            break;//允许退格键等控制键
        }
        else if(_istdigit(ch))
        {
            SendMessage(hwnd,EM_GETSEL,(WPARAM)&nStart,(LPARAM)&nEnd);
            if(nStart==0&&nEnd==0)
            {
                GetWindowText(hwnd,szBuffer,sizeof(szBuffer)/sizeof(TCHAR));
                if(szBuffer[0]==TEXT('-')) return 0;
            }
            break;//允许数字键
        }
        else if(ch==TEXT('.'))
        {
            GetWindowText(hwnd,szBuffer,sizeof(szBuffer)/sizeof(TCHAR));
            if(!_tcschr(szBuffer,TEXT('.')))
            {
                if(!szBuffer[0]) SendMessage(hwnd,WM_CHAR,TEXT('0'),0);
                break;//允许小数点            
            }
        }
        else if(ch==TEXT('-'))
        {
            GetWindowText(hwnd,szBuffer,sizeof(szBuffer)/sizeof(TCHAR));
            if(!_tcschr(szBuffer,TEXT('-')))
            {
                SendMessage(hwnd,WM_KEYDOWN,VK_HOME,0);
                break;//允许负号
            }
        }        
        MessageBeep(0);
        return 0;
    case WM_SETTEXT:
        lpsz = (LPCTSTR)lParam;    
        len = lstrlen(lpsz);
        if(len>0)
        {
            for(i=0;i<len;i++)
            {            
                SendMessage(hwnd,WM_CHAR,lpsz[i],0);
            }                
            return 0;
        }
        else
        {
            break;
        }
    case WM_PASTE:
        if(OpenClipboard(NULL))
        {
            hGlobal = GetClipboardData(CF_TEXT);
            if(hGlobal)
            {
                lpGlobal = (LPCTSTR)GlobalLock(hGlobal);
                SendMessage(hwnd,WM_SETTEXT,0,(LPARAM)lpGlobal);
                GlobalUnlock(hGlobal);                
            }
            CloseClipboard();
        }
        return 0;
    }
    return CallWindowProc(lpOldProcEdit,hwnd,message,wParam,lParam);
}

回复列表 (共2个回复)

沙发

上面代码还有些问题,修改后再贴出来

板凳

修改之后相应代码如下:


LRESULT CALLBACK ProcEdit (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    TCHAR    szBuffer[50],ch;
    LPCTSTR    lpsz,lpGlobal;
    GLOBALHANDLE    hGlobal;
    int    nStart,nEnd,i,len;

    switch(message)
    {    
    case WM_CHAR:    
        ch = (TCHAR)wParam;            
        if(_istdigit(ch))
        {
            GetWindowText(hwnd,szBuffer,sizeof(szBuffer)/sizeof(TCHAR));
            SendMessage(hwnd,EM_GETSEL,(WPARAM)&nStart,(LPARAM)&nEnd);//获取光标位置
            if(szBuffer[0]==TEXT('-')&&nStart==0&&nEnd==0)
            {
                return 0;//负号前不允许输入
            }            
            break;//允许数字键
        }
        else if(ch==TEXT('.'))
        {
            GetWindowText(hwnd,szBuffer,sizeof(szBuffer)/sizeof(TCHAR));
            if(!_tcschr(szBuffer,TEXT('.')))
            {
                SendMessage(hwnd,EM_GETSEL,(WPARAM)&nStart,(LPARAM)&nEnd);//获取光标位置
                if(szBuffer[0]==TEXT('-'))
                {
                    if(nStart==0&&nEnd==0) return 0;//负号前不允许输入
                    if(nStart==1&&nEnd==1||nStart==0&&nEnd>0)
                    {
                        SendMessage(hwnd,WM_CHAR,TEXT('0'),0);//小数点前添加0     
                    }                    
                }
                else
                {
                    if(nStart==0&&nEnd==0)
                    {
                        SendMessage(hwnd,WM_CHAR,TEXT('0'),0);//小数点前添加0                
                    }
                }                
                break;//允许小数点            
            }
        }
        else if(ch==TEXT('-'))
        {
            GetWindowText(hwnd,szBuffer,sizeof(szBuffer)/sizeof(TCHAR));
            if(szBuffer[0]!=TEXT('-'))
            {
                SendMessage(hwnd,WM_KEYDOWN,VK_HOME,0);//光标移到最前
                break;//允许负号
            }
        }
        else if(ch<VK_SPACE)            
        {
            break;//允许退格键、剪切和复制等键盘控制键
        }
        MessageBeep(0);
        return 0;
    case WM_SETTEXT:
        lpsz = (LPCTSTR)lParam;    
        len = lstrlen(lpsz);
        if(len>0)
        {
            for(i=0;i<len;i++)
            {            
                SendMessage(hwnd,WM_CHAR,lpsz[i],0);
            }                
            return 0;
        }        
        break;
    case WM_PASTE:
        if(OpenClipboard(NULL))
        {
            hGlobal = GetClipboardData(CF_TEXT);
            if(hGlobal)
            {
                lpGlobal = (LPCTSTR)GlobalLock(hGlobal);
                SendMessage(hwnd,WM_SETTEXT,0,(LPARAM)lpGlobal);
                GlobalUnlock(hGlobal);                
            }
            CloseClipboard();
        }
        return 0;
    }
    return CallWindowProc(lpOldProcEdit,hwnd,message,wParam,lParam);
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册