|
本帖最后由 识飞 于 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;
}
其它相关的声明自己添加吧!
|
|