炫彩界面库论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3243|回复: 3

自己动手修改XCGUI源码,完善编辑框的部分功能!

[复制链接]

该用户从未签到

发表于 2013-8-12 16:07:53 | 显示全部楼层 |阅读模式
本帖最后由 识飞 于 2013-8-12 16:12 编辑

XCGUI界面库挺好用的,不过其编辑框的功能感觉不太完整,
比如:
1、Delete Home End 等相当部分按键的响应代码没有完成;
2、选取一段文本内容后,单击右键,菜单弹出后之前所选取的文本内容即变回非选定状态;
3、右键菜单不够智能,菜单条目不会根据实际情况设为禁止状态, 如在编辑框为禁止或只读时右键菜单的删除或清空还是有效的,在未选定文本内容时右键菜单的复制也可选择,在剪贴板里没有数据时右键菜单的粘贴居然也有效
4、如此好用的界面库,编辑框右键菜单没有提供自绘接口,这个真是没道理呀!
……

还好炫彩是开源的,只不过最新的版本源码还是去年的吧,
所以自己动手修改源码以完善编辑框的部分功能也不失为一个应急的办法!
以下贴出部分本人的代码,不一定是最好的,但确实是可行的:
//================ 以下代码为 edit.cpp 中修改的部分 ==============================
BOOL CALLBACK Edit_OnLButtonDown_View(HELE hEle,UINT flags,POINT *pPt)
{
if(XEle_IsHitChildEle(hEle,pPt))
  return FALSE;
HELE hEdit=XEle_GetParentEle(hEle);
if(XEle_GetEnableEle(hEdit)==FALSE) return FALSE;
XEle_SetFocus(hEdit,TRUE);
edit_ *pEdit=(edit_*)hEdit;
SetCursor(:oadCursor(NULL, IDC_IBEAM));
Edit_TestDown(hEdit,pPt);
if(EDIT(hEdit)->bCaretCreate)
{
  Edit_SetCaretPos(hEdit);
}
if(EDIT(hEdit)->bDrawSelect)
{
  EDIT(hEdit)->bDrawSelect=FALSE;
}
//文本选择
pEdit->bDown=TRUE;
pEdit->downX=pEdit->caretPt.x;
pEdit->downRow=pEdit->row;
pEdit->downColumn=pEdit->column;
XEle_SetCapture(hEle);
XEle_RedrawEle(hEle);
return FALSE;
}

BOOL CALLBACK Edit_OnLButtonUp_View(HELE hEle,UINT flags,POINT *pPt)
{
HELE hEdit=XEle_GetParentEle(hEle);
if(EDIT(hEdit)->bDown)
{
  EDIT(hEdit)->bDown=FALSE;
  XEle_ReleaseCapture(hEle);
  if( EDIT(hEdit)->downX==EDIT(hEdit)->endX && EDIT(hEdit)->downRow==EDIT(hEdit)->endRow && EDIT(hEdit)->downColumn==EDIT(hEdit)->endColumn)
  {EDIT(hEdit)->bDrawSelect=FALSE;}
}
return FALSE;
}



//Delete键
void Edit_CharDeleteKey(HELE hEle)
{
edit_ *pEdit=EDIT(hEle);
if(pEdit->bReadOnly) return;
if(XEle_GetEnableEle(pEdit)==FALSE) return;
if(pEdit->bDrawSelect) //删除选择内容
{
  if(Edit_DeleteSelectText(hEle))
   Ele_SendEvent(hEle,XE_EDIT_CHANGE,0,0);
  XEle_RedrawEle(hEle);
  return;
}

//当前行
HSTRING hStr=Array_GetAtEdit(pEdit->hArrayEdit,pEdit->row)->hString;

if(1>XStr_GetLength(hStr)-pEdit->column && 1>pEdit->rows-pEdit->row)
  return;
//删除回车
if(0==pEdit->column-XStr_GetLength(hStr))
{
  Edit_CharDeleteEnter(hEle);
  Ele_SendEvent(hEle,XE_EDIT_CHANGE,0,0);
  return;
}
wchar_t ch=XStr_GetAt(hStr,pEdit->column); //要删除的字符
XStr_DeleteLength(hStr,pEdit->column,1); //删除字符
//新行字符长度
SIZE size;   //字符长度
if(FALSE==pEdit->bPass)
{
  HDC hdc=GetDC(NULL);
  HGDIOBJ hOldFont=SelectObject(hdc,XFont_GetHFONT(((ele_*)hEle)->hFontX));
  GetTextExtentPoint32(hdc,&ch,1,&size);
  SelectObject(hdc,hOldFont);
  ReleaseDC(NULL,hdc);
}else
{
  size.cx=pEdit->sizePass.cx;
}
Array_GetAtEdit(pEdit->hArrayEdit,pEdit->row)->len-=size.cx;
/////////////
//pEdit->column--;
//最长行检查
if(pEdit->row==pEdit->maxLine)
{
  int maxcx=0;
  for(int i=0;i<=pEdit->rows;i++)
  {
   if(Array_GetAtEdit(pEdit->hArrayEdit,i)->len>maxcx)
   {
    maxcx=Array_GetAtEdit(pEdit->hArrayEdit,i)->len;
    pEdit->maxLine=i;
   }
  }
}

//设置视图内容大小
if(pEdit->row==pEdit->maxLine)
{
  Edit_AdjustViewSize(hEle);
}
//向右拖到滚动条
Edit_ScrollH(hEle);
Edit_SetCaretPos(hEle);
Ele_SendEvent(hEle,XE_EDIT_CHANGE,0,0);
XEle_RedrawEle(hEle);
}

void Edit_CharDeleteEnter(HELE hEle) //删除回车
{
edit_ *pEdit=EDIT(hEle);
//当前行
HSTRING hStr=Array_GetAtEdit(pEdit->hArrayEdit,pEdit->row)->hString;
//下一行
HSTRING hNextRow=Array_GetAtEdit(pEdit->hArrayEdit,pEdit->row+1)->hString;
if(0==XStr_GetLength(hNextRow)) //空行
{
  editStrList_ *pDel=Array_GetAtEdit(pEdit->hArrayEdit,pEdit->row+1);
  //pEdit->pStringList.Delete(pDel);
  XArray_DeleteIndex(pEdit->hArrayEdit,pEdit->row+1);
  XStr_Destroy(pDel->hString);
  free(pDel);
  pEdit->rows--;
  //最长行检查
  if(pEdit->maxLine>pEdit->row)
  {
   pEdit->maxLine--;
  }
}else //非空行
{
  //pEdit->column=XStr_GetLength(hStr);//列
  //插入符移动到上一行末尾
  //pEdit->caretPt.x=Array_GetAtEdit(pEdit->hArrayEdit,pEdit->row)->len;
  //pEdit->caretPt.y=(pEdit->row) * pEdit->rowHeight;
  XStr_AddString(hStr,XStr_GetBuffer(hNextRow)); //将下一行字符加添到当前行
  //当前行字符显示长度增加
  Array_GetAtEdit(pEdit->hArrayEdit,pEdit->row)->len+=Array_GetAtEdit(pEdit->hArrayEdit,pEdit->row+1)->len;
  //删除当前行
  editStrList_ *pDel=Array_GetAtEdit(pEdit->hArrayEdit,pEdit->row+1);
  XArray_DeleteIndex(pEdit->hArrayEdit,pEdit->row+1);
  XStr_Destroy(pDel->hString);
  free(pDel);
  pEdit->rows--;
  //最长行检查
  int maxcx=0;
  pEdit->maxLine=0;
  for(int i=0;i<=pEdit->rows;i++)
  {
   if(Array_GetAtEdit(pEdit->hArrayEdit,i)->len>maxcx)
   {
    maxcx=Array_GetAtEdit(pEdit->hArrayEdit,i)->len;
    pEdit->maxLine=i;
   }
  }
}
//设置视图内容大小
Edit_AdjustViewSize(hEle);
//向左拖到滚动条
//Edit_ScrollHRight(hEle);
Edit_ScrollH(hEle);
Edit_SetCaretPos(hEle);
XEle_RedrawEle(hEle);
}

//右键菜单的自绘接口 项目
void WINAPI XEdit_SetMenuDrawItem(HELE hEle,pFunMenu_DrawItem pFunDrawItem) //设置用户自绘项
{
IsEditDebug(hEle,__FUNCTION__);
EDIT(hEle)->pDrawItem=pFunDrawItem;
}

//右键菜单的自绘接口 背景
void WINAPI XEdit_SetMenuDrawBG(HELE hEle,pFunMenu_DrawBG pFunDrawBG) //设置用户自绘菜单背景
{
IsEditDebug(hEle,__FUNCTION__);
EDIT(hEle)->pDrawBG=pFunDrawBG;
}

//右键菜单自动禁止相关菜单条目,调用自绘接口
BOOL CALLBACK Edit_OnRButtonUp_View(HELE hEle,UINT flags,POINT *pPt)
{
HELE hEdit=XEle_GetParentEle(hEle);
if(XEle_GetEnableEle(hEdit)==FALSE) return FALSE;
if(EDIT(hEdit)->bMenu)
{
  if(XEle_IsHitChildEle(hEle,pPt))
   return FALSE;
  POINT pt=*pPt;
  XEle_PointToNCWnd(hEle,&pt);
  HMENUX hMenu=XMenu_Create();
        if(EDIT(hEdit)->pDrawItem)
  {
     XMenu_SetUserDrawItem (hMenu, EDIT(hEdit)->pDrawItem);
  }
        if(EDIT(hEdit)->pDrawBG)
  {
     XMenu_SetUserDrawBG(hMenu, EDIT(hEdit)->pDrawBG);
  }

  int uFlagsCut=0, uFlagsCopy=0,uFlagsPaste=0, uFlagsDel=0, uFlagsDelAll=0;
  if(EDIT(hEdit)->bDrawSelect==FALSE)
  {   
   uFlagsCut   =XM_DISABLED;
      uFlagsCopy  =XM_DISABLED;
            uFlagsDel   =XM_DISABLED;
  }
        if(EDIT(hEdit)->bReadOnly)
  {
   uFlagsCut   =XM_DISABLED;
   uFlagsPaste =XM_DISABLED;
            uFlagsDel   =XM_DISABLED;
   uFlagsDelAll=XM_DISABLED;
  }
  if(NULL==OpenClipboard(NULL)) { uFlagsPaste =XM_DISABLED;}
  else
  {
    HANDLE hGlb=GetClipboardData(CF_UNICODETEXT);
    if(NULL==hGlb){ uFlagsPaste =XM_DISABLED; }
    else
    {
    wchar_t *pText=(wchar_t*)GlobalLock(hGlb);
    if(NULL==pText){ uFlagsPaste =XM_DISABLED; }
    else
    {
    int len=wcslen(pText);
    if(0==len) {uFlagsPaste =XM_DISABLED;}
    }
    GlobalUnlock(hGlb);
    }
  }
     CloseClipboard();
  XMenu_AddItem(hMenu,IDM_CLIP,L"剪切",-1,uFlagsCut);
  XMenu_AddItem(hMenu,IDM_COPY,L"复制",-1,uFlagsCopy);
  XMenu_AddItem(hMenu,IDM_PASTE,L"粘贴",-1,uFlagsPaste);
  XMenu_AddItem(hMenu,IDM_DELETE,L"删除",-1,uFlagsDel);
  XMenu_AddItem(hMenu,0,NULL,XMENU_ROOT,XM_SEPARATOR);
  XMenu_AddItem(hMenu,IDM_SELECTALL,L"全选");
  XMenu_AddItem(hMenu,IDM_DELETEALL,L"清空",-1,uFlagsDelAll);
  window_* pWindow=((ele_*)hEle)->pWindow;
  ClientToScreen(pWindow->hWnd,&pt);
  XMenu_Popup(hMenu,pWindow->hWnd,pt.x,pt.y,hEdit);
}
return FALSE;
}

//================ 以下代码为 ele.cpp 中增加的代码 =================
BOOL WINAPI XEle_GetEnableEle(HELE hEle)
{
IsEleDebug(hEle,__FUNCTION__);
return ((ele_*)hEle)->bEnable;
}

其它相关的声明自己添加吧!

该用户从未签到

发表于 2013-10-19 13:38:48 | 显示全部楼层
2、选取一段文本内容后,单击右键,菜单弹出后之前所选取的文本内容即变回非选定状态;
还是没有解决,楼主能不能共享下修改的完整文件??

该用户从未签到

 楼主| 发表于 2013-10-20 18:43:56 | 显示全部楼层
本帖最后由 识飞 于 2013-10-20 18:44 编辑
水木之 发表于 2013-10-19 13:38
2、选取一段文本内容后,单击右键,菜单弹出后之前所选取的文本内容即变回非选定状态;
还是没有解决,楼主能 ...

其实代码以在上面了,现再次将这部分张贴如下:
//================ 以下代码为 edit.cpp 中修改的部分 ==============================
BOOL CALLBACK Edit_OnLButtonDown_View(HELE hEle,UINT flags,POINT *pPt)
{
if(XEle_IsHitChildEle(hEle,pPt))
  return FALSE;
HELE hEdit=XEle_GetParentEle(hEle);
if(XEle_GetEnableEle(hEdit)==FALSE) return FALSE;
XEle_SetFocus(hEdit,TRUE);
edit_ *pEdit=(edit_*)hEdit;
SetCursor ( :: LoadCursor(NULL, IDC_IBEAM));
Edit_TestDown(hEdit,pPt);
if(EDIT(hEdit)->bCaretCreate)
{
  Edit_SetCaretPos(hEdit);
}
if(EDIT(hEdit)->bDrawSelect)
{
  EDIT(hEdit)->bDrawSelect=FALSE;
}
//文本选择
pEdit->bDown=TRUE;
pEdit->downX=pEdit->caretPt.x;
pEdit->downRow=pEdit->row;
pEdit->downColumn=pEdit->column;
XEle_SetCapture(hEle);
XEle_RedrawEle(hEle);
return FALSE;
}

该用户从未签到

发表于 2013-11-23 01:24:50 | 显示全部楼层
本帖最后由 水木之 于 2013-11-23 01:27 编辑


后来弄好了,忘了回复了,这里发下我改完后可用的.
问题出在Edit_OnRButtonDown_View上
在这个函数里有这样几行代码
                if(EDIT(hEdit)->bDrawSelect)
                {
                        EDIT(hEdit)->bDrawSelect=FALSE;
                        if(EDIT(hEdit)->bCaretCreate)
                                XEle_RedrawEle(hEle);
                }
就是这行EDIT(hEdit)->bDrawSelect=FALSE;
导致了选中状态失效,右键的时候,老是把选中文本变回非选中状态,把这几行注释掉就可以了.这样才是解决楼主说的问题2的方法.楼主是不是说漏了还要修改Edit_OnRButtonDown_View这个函数,所以当初我想要楼主贴完整代码.
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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

GMT+8, 2024-5-9 05:47 , Processed in 0.072031 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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