^_^ TY 2019-03-28 15:54 采纳率: 0%
浏览 200

[求助]MFC的CRichEditView视图,将Tab键产生的空格修改为两个空格出错了

在捕获tab按键消息时修改执行,获取光标位置,在该位置按Tab时输出两个空格,当前位置后移两位出错

if ((VK_TAB == pMsg->wParam) && (WM_KEYDOWN == pMsg->message) && (pMsg->hwnd == GetSafeHwnd()))
    {
        CString strContent;//视图内容
        long lBegin = 0;
        long lEnd = 0;
        GetRichEditCtrl().GetSel(lBegin, lEnd); //当前光标位置
        GetRichEditCtrl().GetWindowText(strContent);
        if (lBegin != lEnd)
        {
            strContent = strContent.Left(lBegin) + strContent.Mid(lEnd);
        }
        strContent.Insert(lBegin, "  ");
        GetRichEditCtrl().SetWindowText(strContent);
        GetRichEditCtrl().SetSel(lBegin + 2, lBegin + 2);
        return TRUE;
    }

执行结果:
图片说明
在6前面回车,然后再按Tab就变成下图情况了
图片说明

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-08 14:58
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    你提到的问题似乎与MFC库中的控件有关。在C++中使用MFC库时,你需要确保正确地处理用户输入事件。如果你想要在文本框中插入一个特定字符,你应该使用InsertString方法来实现这一功能。

    以下是修复你的代码片段的方法:

    首先,在OnKeyDown方法中添加以下代码:

    void CRichEditView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
        if ((nChar == VK_TAB) && (nRepCnt == 1))
        {
            // 获取光标位置
            long lBegin = 0;
            long lEnd = 0;
    
            // 获取视图的内容
            GetRichEditCtrl().GetSel(lBegin, lEnd);
    
            // 如果有光标的位置,则将光标移到下一个字符的开始位置
            if (lBegin != lEnd)
            {
                lBegin++;
            }
    
            // 将光标移动到下一个字符
            SetSel(lBegin, lEnd);
    
            // 插入一个双空格
            InsertString(lBegin, L"  ");
    
            // 返回true表示成功
            return true;
        }
    }
    

    然后,在OnInitDialog方法中添加以下代码:

    void CRichEditView::OnInitDialog()
    {
        // 添加事件处理器以处理键盘输入
        RegisterHotKey(GetSafeHwnd(), MOD_ALT | MK_SHIFT | VK_TAB, FALSE,
                       MAKEINTRESOURCE(IDR_MAINFRAME));
    }
    
    // ... 其他初始化代码 ...
    

    现在,当你按下Tab键时,它应该会自动将光标移动到下一个字符的开始位置,并在该位置插入两个空格。如果需要,你可以进一步调整这个逻辑,例如根据用户的操作进行不同的行为。

    评论

报告相同问题?