炫彩界面库论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2791|回复: 2

针对hypowu的帖子中的发现:修复richedit删除选择文字有时会崩

[复制链接]

该用户从未签到

发表于 2013-4-3 15:55:45 | 显示全部楼层 |阅读模式
选择富编辑框的文字内容,按删除键程序崩溃!

RichEdit有BUG, 设置成只读状态还可以按DELETE键删除内容,如果选择多行连续按DELETE键的话,在删除光标所在行的所有字符后程序会崩溃!

BOOL CALLBACK RichEdit_OnEventKeyDown(HELE hEle,HELE hEventEle,WPARAM wParam,LPARAM lParam)
中,将:
case VK_DELETE:  //Delete
                        RichEdit_CharDeleteKey(hEle);

改为:
case VK_DELETE:  //Delete
        if (((richEdit_*)hEle)->bDrawSelect)
                        RichEdit_DeleteSelect(hEle);
        else
            RichEdit_CharDeleteKey(hEle);


第二步:
在下面两个函数的末尾,各添加一句:XEle_RedrawEle(hEle);
BOOL RichEdit_DeleteSelectSingleLine(HELE hEle)
{
        .....

    XEle_RedrawEle(hEle);
        return TRUE;
}


BOOL RichEdit_DeleteSelectMultiLine(HELE hEle,int beginRow,int beginColumn,int endRow,int endColumn,BOOL bForward)
{
        ......
    XEle_RedrawEle(hEle);
        return TRUE;
}

该用户从未签到

 楼主| 发表于 2013-4-3 16:21:42 | 显示全部楼层
还有READONLY状态下也可以删除文字的BUG,改法如下:
在下面每一个函数的开口加上:
if(pRichEdit->bReadOnly) return TRUE;

要改的函数有:
BOOL CALLBACK RichEdit_OnEventKeyDown(HELE hEle,HELE hEventEle,WPARAM wParam,LPARAM lParam)
{
    ......
case VK_DELETE:  //Delete
        if (!((richEdit_*)hEle)->bReadOnly)
        {
            if (((richEdit_*)hEle)->bDrawSelect)
                RichEdit_DeleteSelect(hEle);
            else
                RichEdit_CharDeleteKey(hEle);
        }
}


BOOL CALLBACK RichEdit_OnEventMenuSelect(HELE hEle,HELE hEventEle,int id) //菜单选择事件
{
    if(hEle==hEventEle)
    {
        switch(id)
        {
        case IDM_CLIP: if (!((richEdit_*)hEle)->bReadOnly) XRichEdit_Menu_Cut(hEle);
            break;
        case IDM_COPY: XRichEdit_Menu_Copy(hEle);
            break;
        case IDM_PASTE: if (!((richEdit_*)hEle)->bReadOnly) XRichEdit_Menu_Paste(hEle);
            break;
        case IDM_DELETE: if (!((richEdit_*)hEle)->bReadOnly) XRichEdit_DeleteSelect(hEle);
            break;
        case IDM_SELECTALL: XRichEdit_SelectAll(hEle);
            break;
        case IDM_DELETEALL: if (!((richEdit_*)hEle)->bReadOnly) XRichEdit_DeleteAll(hEle);
            break;
        }
    }
    return TRUE;
}

需要注意的是,只需要改这两地方,因为只需要在直接面对用户操作的地方加上readonly的限制。不要在其它地方加,以避免影响内部使用删除字符功能
  • TA的每日心情
    开心
    2022-1-9 18:18
  • 发表于 2013-4-3 19:47:43 | 显示全部楼层
    恩不错!
    1.         switch(wParam)
    2.         {       
    3.         case 46:  //Delete
    4.                 if (FALSE==((richEdit_*)hEle)->bReadOnly)
    5.                 {
    6.                         if (((richEdit_*)hEle)->bDrawSelect)
    7.                                 RichEdit_DeleteSelect(hEle);
    8.                         else
    9.                                 RichEdit_CharDeleteKey(hEle);
    10.                         XEle_RedrawEle(hEle);
    11.                 }
    12.                 break;
    复制代码
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    QQ|Archiver|手机版|小黑屋|炫彩界面库 ( 鄂ICP备2023014763号-1 )

    GMT+8, 2024-9-20 05:45 , Processed in 0.073499 second(s), 18 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表