这可能不是您要寻找的,但它可能只需要一点代码开销即可模仿所需的功能。
您可以子类化编辑控件,然后通过 WM_CHAR 消息捕获任何可能修改编辑框内容的用户输入。一旦您的程序接收到消息,您就会在编辑框中检测到当前选择(即插入符号位置),如果它位于前四个字符内的任何位置,则您根本不允许更改。这是一个有点粗略的方法,但它应该工作。
汇编中的示例,对不起,我对 C 语言不够精通,而 C 语言就是这样一个拖累:D
invoke SetWindowLong,hEditBox,GWL_WNDPROC,offset EditProc
mov DefEditProc,eax
...
EditProc proc hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
cmp uMsg,WM_CHAR
je @WM_CHAR
cmp uMsg,WM_KEYUP
je @WM_KEYUP
@DEFAULT:
invoke CallWindowProc,DefEditProc,hWnd,uMsg,wParam,lParam
ret
@EXIT:
xor eax,eax
ret
;=============
@WM_KEYUP:
mov eax,wParam ; you will need this if you want to process the delete key
cmp ax,VK_DELETE
je @VK_DELETE
jmp @DEFAULT
;=============
@WM_CHAR:
mov eax,wParam
cmp ax,VK_BACK ; this is for the backspace key
je @BACKSPACE
cmp ax,VK_0
jb @EXIT ; if null is returned, the char will not be passed to the edit box
cmp ax,VK_9
ja @EXIT
jmp @NUMBER
;---
@VK_DELETE:
@NUMBER:
invoke SendMessage,hWnd,EM_GETSEL,offset start,0 ; the caret position through text selection, we just need the starting position
cmp start,3
ja @DEFAULT ; if the caret is placed somewhere past the 4th charater, allow user input
jmp @EXIT
;---
@BACKSPACE:
invoke SendMessage,hWnd,EM_GETSEL,offset start,0
cmp start,4
ja @DEFAULT ; since you're deleting one character to the left, you need to factor that in for backspace
jmp @EXIT
EditProc endp
非常简洁,希望你能明白它的要点。此示例仅允许数字 (0-9)、DEL 和 BACKSPACE 键通过。您可以扩展以满足您的需求。
问候