主题:[原创]分享自定义浮点编辑框
#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);
}
#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);
}