2

我有一个小问题。我想要一个 Edit 控件,其中包含一个文本(类似于:“ABC@”)。该字符串必须是不可编辑的,这样用户就不能删除它。用户应该只能在符号“@”之后键入文本。我知道如何在编辑框中使文本只读。我使用 EM_SETREADONLY 消息

//global variables
 #define ID_TEXTBOX 1
 static HWND hwndTextBox;

//in WndProc function
  case WM_CREATE:
    {

      hwndTextBox = CreateWindow(TEXT("EDIT"),TEXT("abc@"),WS_VISIBLE | WS_CHILD | WS_BORDER   ,70,100, 200,25,hWnd,(HMENU)ID_TEXTBOX,NULL,NULL);

      if(!hwndTextBox )
        {
            MessageBox(hWnd,"Failed","Failed",MB_OK);
            return FALSE;
        }

      SendMessage(hwndTextBox,EM_SETREADONLY,TRUE ,NULL);

      break;

    }

但是代码使整个文本只读,当然不能解决我的问题。

4

2 回答 2

2

这可能不是您要寻找的,但它可能只需要一点代码开销即可模仿所需的功能。

您可以子类化编辑控件,然后通过 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 键通过。您可以扩展以满足您的需求。

问候

于 2012-12-14T21:30:38.623 回答
2

使用 RichEdit 控件而不是 Edit 控件。使用该EM_SETCHARFORMAT消息将单个字符或字符范围标记为“受保护”。使用该EM_SETEVENTMASK消息注册EN_PROTECTED来自 RichEdit 的通知。这样,如果用户出于任何原因尝试修改一个或多个受保护字符,RichEdit 将在允许修改之前征求您的许可。

于 2012-12-14T22:12:28.500 回答