📄 uitextedit.c
字号:
}
else
ptTextEdit->m_TxtLength--;
val = 1;
}
else
{
if(ptTextEdit->m_TxtLength>1)
for(i =nPos;i<ptTextEdit->m_TxtLength;i++)
ptTextEdit->m_pText[i] = ptTextEdit->m_pText[i+2];
if(nPos == 0 && ptTextEdit->m_TxtLength==0)
{
ptTextEdit->m_pText[0] = '\0';
}
else
ptTextEdit->m_TxtLength -= 2;
val = 2;
}
ptTextEdit->m_pText[ptTextEdit->m_TxtLength] = '\0';
guiExitWCS() ;
return val;
}
//=============================================================
static int _guiTextEdit_BackDelChar(HNDL hTextEdit,short nPos )
{
TTEXTEDIT *ptTextEdit;
int val=0;
int isWord;
if(hTextEdit == NULL)
{
return STATUS_ERR;
}
guiEnterWCS() ;
ptTextEdit=(TTEXTEDIT *)hTextEdit;
if(ptTextEdit->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
{
guiExitWCS();
return STATUS_ERR;
}
if(nPos<=0)
{
guiExitWCS();
return STATUS_ERR;
}
isWord = _str_IsWord((BYTE *)ptTextEdit->m_pText, nPos-1);
if((isWord==SINGLECHAR && (BYTE)ptTextEdit->m_pText[nPos-1]!=0x0A)
|| ((BYTE)ptTextEdit->m_pText[nPos-1]==0x0A && (BYTE)ptTextEdit->m_pText[nPos-2] !=0x0D))
// if(((BYTE)ptTextEdit->m_pText[nPos-1] < 0x80 && (BYTE)ptTextEdit->m_pText[nPos-1]!=0x0A)
// || ((BYTE)ptTextEdit->m_pText[nPos-1]==0x0A && (BYTE)ptTextEdit->m_pText[nPos-2] !=0x0D))
{
val = _guiTextEdit_DelChar(hTextEdit,nPos-1);
if(val)
ptTextEdit->m_CursorPos--;
}
else
{
if(nPos<2)
{
guiExitWCS();
return STATUS_ERR;
}
val = _guiTextEdit_DelChar(hTextEdit,nPos-2);
if(val)
ptTextEdit->m_CursorPos -=2;
}
guiExitWCS() ;
return 1;
}
//=================================================================
static int _guiTextEdit_ShowCursorByXY(HNDL hTextEdit,WORD x,WORD y,BOOL bShow)
{
TTEXTEDIT *ptTextEdit;
TTEXTLINEINFO *pLineInfo;
BYTE *Ptext=0,iSetOK=0;
int left=0,right=0,top=0,bottom=0;
int xPos=0,yPos=0;
short i,j,n,k;
WORD wWordWidth=0,wStartPos;
char iFlag=0;
if(hTextEdit == NULL)
{
return STATUS_ERR;
}
//if(!guiControl_IsVisible(hTextEdit))
//{
//return STATUS_ERR;
//}
guiEnterWCS() ;
ptTextEdit=(TTEXTEDIT *)hTextEdit;
if(ptTextEdit->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
{
guiExitWCS();
return STATUS_ERR;
}
if(ptTextEdit->m_bReadOnly)
{
guiExitWCS();
return STATUS_ERR;
}
left = 0;
right = ptTextEdit->base.right-ptTextEdit->base.left;
top = 0;
bottom = ptTextEdit->base.bottom - ptTextEdit->base.top;
if(x<=(left) || x>=(right)
|| y<=(top) || y>=(bottom))
{
guiExitWCS();
return STATUS_ERR;
}
for(i = ptTextEdit->m_TopLineNum;(i<ptTextEdit->m_LineCount) && i<(ptTextEdit->m_TopLineNum+TEXT_VISIVLE_LINENUM);i++)
{
if(y >= ((i-ptTextEdit->m_TopLineNum)*ptTextEdit->m_LineHeight+ptTextEdit->m_Margin_Top)
&& y < ((i+1-ptTextEdit->m_TopLineNum)*ptTextEdit->m_LineHeight+ptTextEdit->m_Margin_Top))
{
pLineInfo = &ptTextEdit->m_pLineInfo[i];
//tong if(pLineInfo->wLineIndex>=0)
{
Ptext = (BYTE *)ptTextEdit->m_pText;
for(k=0;k<pLineInfo->wPs_Txt && *Ptext;k++,Ptext++);
wStartPos = ptTextEdit->m_init_LineSX;
wWordWidth = 0;
while(*Ptext == 13 || *Ptext == 10)
{
Ptext++;
}
for(j=0;(j<pLineInfo->wCharCount ||(pLineInfo->wCharCount==0 && j==0)) ;)
{
if(ptTextEdit->m_bPassword && (ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE))
{
iFlag = 0;
wWordWidth = guiGetCharWidth(ptTextEdit->m_EchoChar)+ptTextEdit->m_CharGap;
}else
iFlag = guiGetCellChar( Ptext,&wWordWidth,ptTextEdit->m_CharGap);
if(x<=(wStartPos+wWordWidth/2))
{
ptTextEdit->m_CursorPos = pLineInfo->wPs_Txt + j;
if(ptTextEdit->m_bPassword && (ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE))
{
xPos = ptTextEdit->m_init_LineSX+
(ptTextEdit->m_CursorPos)*(guiGetCharWidth(ptTextEdit->m_EchoChar)
+ptTextEdit->m_CharGap)-ptTextEdit->m_CaretWidth;
}
else
xPos = wStartPos-ptTextEdit->m_CaretWidth;
yPos = (i-ptTextEdit->m_TopLineNum)*ptTextEdit->m_LineHeight+ptTextEdit->m_Margin_Top+1;
iSetOK = 1;
break;
}
wStartPos += wWordWidth;
if(iFlag==0)
{j++;Ptext++;}
else if(iFlag==1)
{Ptext++;Ptext++;j+=2;}
else
{j++;Ptext++;continue;}
}
if(!iSetOK)
{
ptTextEdit->m_CursorPos = pLineInfo->wPs_Txt + pLineInfo->wCharCount;
if(pLineInfo->wCharCount==0)
{
wStartPos = ptTextEdit->m_init_LineSX;
}
if(ptTextEdit->m_bPassword && (ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE))
{
xPos = ptTextEdit->m_init_LineSX+
strlen(ptTextEdit->m_pText)*(guiGetCharWidth(ptTextEdit->m_EchoChar)
+ptTextEdit->m_CharGap)-ptTextEdit->m_CaretWidth;
}
else
xPos = wStartPos-ptTextEdit->m_CaretWidth;
yPos = (i-ptTextEdit->m_TopLineNum)*ptTextEdit->m_LineHeight+ptTextEdit->m_Margin_Top+1;
iSetOK = 1;
}
}
}
}
if(bShow && hTextEdit == _FocusHandle_Text)
{
ptTextEdit->m_bRebuid = 1;
if(!iSetOK)
_guiTextEdit_ShowCursorByPos(hTextEdit,ptTextEdit->m_CursorPos);
else
{
guiCaret_Hide( );
_guiText_SetCursorPos(hTextEdit,xPos, yPos);
}
}
guiExitWCS();
return 1;
}
//=================================================================
static int _guiTextEdit_ShowCursorByPos(HNDL hTextEdit,short nPos)
{
TTEXTEDIT *ptTextEdit;
TTEXTLINEINFO *pLineInfo;
int left=0,right=0,top=0,bottom=0;
int View_Left,View_Top,View_Right,View_Bottom,ret;
int CurrentLeft, CurrentTop;
BYTE *Ptext=0;
int xPos,yPos;
short i,k;
if(hTextEdit == NULL)
{
return STATUS_ERR;
}
//if(!guiControl_IsVisible(hTextEdit))
//{
// return STATUS_ERR;
//}
guiEnterWCS() ;
ptTextEdit=(TTEXTEDIT *)hTextEdit;
if(ptTextEdit->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
{
guiExitWCS();
return STATUS_ERR;
}
if(ptTextEdit->m_bReadOnly)
{
guiExitWCS();
return STATUS_ERR;
}
left = 0;
right = ptTextEdit->base.right-ptTextEdit->base.left;
top = 0;
bottom = ptTextEdit->base.bottom - ptTextEdit->base.top;
if(nPos<0 || nPos > (ptTextEdit->m_TxtLength+1)) //cgh
{
guiExitWCS();
return STATUS_ERR;
}
//TEXT_SHOWCARET_AGAIN:
for(i = ptTextEdit->m_TopLineNum;(i<ptTextEdit->m_LineCount) && i<(ptTextEdit->m_TopLineNum+TEXT_VISIVLE_LINENUM);i++)
{
pLineInfo = &ptTextEdit->m_pLineInfo[i];
/*tong
if(pLineInfo->wLineIndex<0)
{
break;
}
*/
Ptext = (BYTE *)ptTextEdit->m_pText;
for(k=0;k<pLineInfo->wPs_Txt && *Ptext;k++,Ptext++);
if(i<=(ptTextEdit->m_LineCount-1) )//&& i<=((bottom+1-top-ptTextEdit->m_Margin_Top-ptTextEdit->m_Margin_Bottom)/ptTextEdit->m_LineHeight-1))
{
if((nPos>=pLineInfo->wPs_Txt && (nPos<= (pLineInfo->wPs_Txt+pLineInfo->wCharCount) &&pLineInfo->wCharCount)|| (pLineInfo->wCharCount ==0 && ptTextEdit->m_CursorLineNum ==i)))
{
if(ptTextEdit->m_bPassword && (ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE))
{
xPos = ptTextEdit->m_init_LineSX+
(nPos)*(guiGetCharWidth(ptTextEdit->m_EchoChar)
+ptTextEdit->m_CharGap)-ptTextEdit->m_CaretWidth;
}
else
{
if(pLineInfo->wCharCount == 0)
xPos = ptTextEdit->m_init_LineSX-ptTextEdit->m_CaretWidth;
else
xPos = _guiText_GetWordIx(Ptext,nPos-pLineInfo->wPs_Txt,ptTextEdit->m_CharGap,ptTextEdit->m_init_LineSX)-ptTextEdit->m_CaretWidth;
}
yPos = (i-ptTextEdit->m_TopLineNum)*ptTextEdit->m_LineHeight+ptTextEdit->m_Margin_Top+1;
_guiText_SetCursorPos(hTextEdit,xPos, yPos);
//
/*
if(ptTextEdit->base.vportHandle && ptTextEdit->m_bRebuid)
{
ret=_guiGetHandleView(ptTextEdit->base.vportHandle,&View_Left,&View_Top,&View_Right,&View_Bottom);
if(ret==STATUS_OK)
{
_guiConvertXY(hTextEdit, &xPos, &yPos);
ret=guiViewport_GetCurrentPos(ptTextEdit->base.vportHandle,&CurrentLeft,&CurrentTop);
if(xPos<View_Left)
{
guiViewport_Move(ptTextEdit->base.vportHandle,CurrentLeft-(View_Left-xPos),CurrentTop) ;
}
else if(xPos+(ptTextEdit->m_CaretWidth-1)>View_Right)
{
guiViewport_Move(ptTextEdit->base.vportHandle,CurrentLeft+(xPos+(ptTextEdit->m_CaretWidth-1-View_Right)),CurrentTop) ;
}
else if(yPos<View_Top)
{
guiViewport_Move(ptTextEdit->base.vportHandle,CurrentLeft,CurrentTop-(View_Top-yPos)) ;
}
else if((yPos+GET_CURSOR_HEIGHT(hTextEdit)-1)>=View_Bottom)
{
guiViewport_Move(ptTextEdit->base.vportHandle,CurrentLeft,CurrentTop+((yPos+GET_CURSOR_HEIGHT(hTextEdit))-View_Bottom)+1) ;
}
// && left+(ptTextEdit->m_CaretWidth-1)<=View_Right && top>=View_Top && (top+GET_CURSOR_HEIGHT(hTextEdit)-1)<View_Bottom)
}
}*/
ptTextEdit->m_bRebuid = 0;
//
break;
}
}
}
guiExitWCS();
return 1;
}
//==============================================================================
static int _guiTextEdit_DealOverlapChar(HNDL hTextEdit,BYTE *pChar)
{
TTEXTEDIT *ptTextEdit;
TTEXTLINEINFO *pLineInfo;
int left=0,right=0,top=0,bottom=0;
BYTE *Ptext=0;
int xPos,yPos;
short i,nPos;
WORD wCellLen;
if(hTextEdit == NULL)
{
return STATUS_ERR;
}
ptTextEdit=(TTEXTEDIT *)hTextEdit;
if(ptTextEdit->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
{
return STATUS_ERR;
}
nPos = ptTextEdit->m_CursorPos;
pLineInfo = &ptTextEdit->m_pLineInfo[ptTextEdit->m_CursorLineNum] ;
/*tong
if(pLineInfo->wLineIndex<0)
{
return STATUS_ERR;
}
*/
Ptext = (BYTE*)ptTextEdit->m_pText;
for(i=0;i<pLineInfo->wPs_Txt && *Ptext;i++,Ptext++);
guiPushFont(ptTextEdit->base.font);
guiGetCellChar((BYTE *)pChar,&wCellLen,ptTextEdit->m_CharGap);
guiPopFont();
if(ptTextEdit->m_bPassword && (ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE))
{
xPos = //ptTextEdit->m_init_LineSX+
(pLineInfo->wCharCount+1)*(guiGetCharWidth(ptTextEdit->m_EchoChar)
+ptTextEdit->m_CharGap);
}
else
xPos = _guiText_GetWordIx(Ptext,pLineInfo->wCharCount,ptTextEdit->m_CharGap,0/*ptTextEdit->m_init_LineSX*/)+wCellLen;
yPos = (ptTextEdit->m_CursorLineNum-ptTextEdit->m_TopLineNum+1)*ptTextEdit->m_LineHeight+ptTextEdit->m_Margin_Top+2;
if(xPos>ptTextEdit->m_MaxWidth_Line/*(ptTextEdit->base.right-ptTextEdit->base.left-ptTextEdit->m_Margin_Right)*/)
{
if((ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE))
return 1;
if((!(ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE)) && (!ptTextEdit->m_bScrollEnable && !ptTextEdit->m_DynamicMax))
{
if(yPos>(ptTextEdit->base.bottom-ptTextEdit->base.top-ptTextEdit->m_Margin_Bottom-GET_CURSOR_HEIGHT(hTextEdit)+2))
{
return 1;
}
}
}
return 0;
}
//==============================================================================
static short _guiTextEdit_GetCursorPos(HNDL hTextEdit)
{
TTEXTEDIT *ptTextEdit;
if(hTextEdit == NULL)
{
return STATUS_ERR;
}
ptTextEdit=(TTEXTEDIT *)hTextEdit;
if(ptTextEdit->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
{
return STATUS_ERR;
}
return ptTextEdit->m_CursorPos;
}
//==================================================================
//return 1 chinese, 0 english, wCellLen get the lenght,3 0x0d 4 0x0a
static char guiGetCellChar( const BYTE *pText,WORD *wCellLen,WORD wCharGap)
{
int len, count;
BYTE *p;
char iflag;
len = 0;
p = (BYTE *)pText;
iflag = 0;
count = 0;
while(*(p))
{
if(*(p) == 0x0D )
{
len = 0;
*wCellLen = len;
return 3;
}
else if(*(p) == 0x0A)
{
len = 0;
*wCellLen = len;
return 4;
}
else if(*(p)=='\t')
{
*(p) = ' ';
}
if(iflag)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -