📄 edit.c
字号:
// get old display position
nOldDisplayLine=lpEditItem->nDisplayLine;
// set new display position
lpEditItem->nDisplayLine+=nScrollLine;
// is up to the top ?
if (lpEditItem->nDisplayLine<0)
lpEditItem->nDisplayLine=0;
// is down to the bottom ?
if (lpEditItem->nDisplayLine+nClientLine>lpEditItem->nTotalLine)
lpEditItem->nDisplayLine=lpEditItem->nTotalLine-nClientLine;
// set new caret position
lpEditItem->nCaretLine=nCaretLine-lpEditItem->nDisplayLine;
// set vertical scroll position
SetPDAEditVScrollPos(hWnd,lpEditItem->nDisplayLine);
// Get caret line from the text
// ClearInvert(hWnd,lpEditItem,TRUE);
// reset caret
SetPDACaret(hWnd);
// DrawPDAEditControl(hWnd);
InvalidateRect(hWnd,NULL,TRUE);
// return the lines to be scroll
return (int)(lpEditItem->nDisplayLine-nOldDisplayLine);
}
// **************************************************
// 声明:static void HScrollWindowInPDAEdit(HWND hWnd,int nHScrollPos)
// 参数:
// IN hWnd -- 窗口句柄
// IN nScrillLine -- 水平滚动的点数
// 返回值:无
// 功能描述:水平滚动窗口。
// 引用:
// **************************************************
static void HScrollWindowInPDAEdit(HWND hWnd,int nHScrollPos)
{
LPEDITITEM lpEditItem;
int nCaretPos;
// get struct PADEDITSTATE data
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
if (lpEditItem==NULL) return;
// calculate client lines
if (nHScrollPos<0)
{ // to the left
if (lpEditItem->nDisplayx==0)
return;
}
// get old caret position
nCaretPos=lpEditItem->nCaretx+lpEditItem->nDisplayx;
// set new display position
lpEditItem->nDisplayx+=nHScrollPos;
if (lpEditItem->nDisplayx<0)
{ // tom the left?
lpEditItem->nDisplayx=0;
}
// set new caret position
lpEditItem->nCaretx=nCaretPos-lpEditItem->nDisplayx;
// set herizon scroll position
SetPDAEditHScrollPos(hWnd,(int)((lpEditItem->nDisplayx)/HSCROLLWIDTH));
// Get caret line from the text
//ClearInvert(hWnd,lpEditItem,TRUE);
// reset caret
SetPDACaret(hWnd);
// redraw the window
// DrawPDAEditControl(hWnd);
InvalidateRect(hWnd,NULL,TRUE);
}
// **************************************************
// 声明:static void FillPassWordChar(LPTSTR lpEditBuffer,int nFillLength,TCHAR chPassWordWord)
// 参数:
// IN lpEditBuffer -- 要填充的缓存
// IN nFillLength -- 要填充的长度
// IN chPassWordWord -- 要用来填充的密码字符
// 返回值:无
// 功能描述:将缓存填充为密码字符。
// 引用:
// **************************************************
// delete By Jami chen in 2004.06.12
/*static void FillPassWordChar(LPTSTR lpEditBuffer,int nFillLength,TCHAR chPassWordWord)
{
// fill the buffer
memset(lpEditBuffer,chPassWordWord,nFillLength);
// fill end code
lpEditBuffer[nFillLength]=0;
}
*/
// **************************************************
// 声明:static void ReleasePDAEdit(HWND hWnd)
// 参数:
// IN hWnd --窗口句柄
// 返回值:无
// 功能描述: 释放编辑区,处理WM_DESTROY消息。
// 引用:
// **************************************************
static void ReleasePDAEdit(HWND hWnd)
{
LPEDITITEM lpEditItem;
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
if(lpEditItem==NULL) return ;
DeletePDACaret(hWnd); // 删除光标
// SendNotificationMsg(hWnd,EN_KILLFOCUS);
if (lpEditItem->lpPDASaveEditBuffer)
free(lpEditItem->lpPDASaveEditBuffer); // 释放备份缓存
if (lpEditItem->lpPDAControlBuffer)
free(lpEditItem->lpPDAControlBuffer); // 释放控制缓存
if (lpEditItem->lpFormat)
free(lpEditItem->lpFormat); // 释放格式化串
free(lpEditItem); // 释放条目结构
SetWindowLong(hWnd,0,0);
}
// **************************************************
// 声明:static LRESULT DoCharFromPos(HWND hWnd,WPARAM wParam,LPARAM lParam)
// 参数:
// IN hWnd -- 窗口句柄
// IN wParam -- MAKWWPARAM(X,Y),指定的坐标位置
// IN lParam -- 保留
// 返回值:低WORD返回指定坐标所在的字符索引位置,高WORD返回该字符所在的行。
// 功能描述:得到指定点的字符,处理EM_CHARFROMPOS消息。
// 引用:
// **************************************************
static LRESULT DoCharFromPos(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
int xPos,yPos;
LPEDITITEM lpEditItem;
xPos=LOWORD(lParam);
yPos=HIWORD(lParam);
// Get struct EDITITEM data
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
if(lpEditItem==NULL) return 0;
return GetCharFromPos(hWnd,lpEditItem,xPos,yPos); // 得到位置的字符
}
// **************************************************
// 声明:static LRESULT DoGetFirstVisibleLine(HWND hWnd)
// 参数:
// IN hWnd -- 窗口句柄
// 返回值:如果是多行编辑区,则返回第一个可见行的行索引,如果
// 是单行编辑区,则返回第一个可见字符的索引。
// 功能描述:得到第一个可见行,处理EM_GETFIRSTVISIBLELINE消息。
// 引用:
// **************************************************
static LRESULT DoGetFirstVisibleLine(HWND hWnd)
{
LPEDITITEM lpEditItem;
DWORD dwStyle;
LPTSTR lpPosition;
// Get struct EDITITEM data
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
if(lpEditItem==NULL) return 0;
// Get Edit Control Style
dwStyle=GetWindowLong(hWnd,GWL_STYLE);
if (dwStyle&ES_MULTILINE)
return lpEditItem->nDisplayLine;
lpPosition=GetLinePosition(hWnd,lpEditItem,lpEditItem->lpPDAControlBuffer,0,FALSE,NULL);// 得到第一个可见字符
return (lpPosition-lpEditItem->lpPDAControlBuffer);
}
// **************************************************
// 声明:static LRESULT DoGetLimitText(HWND hWnd,WPARAM wParam,LPARAM lParam)
// 参数:
// IN hWnd -- 窗口句柄
// IN wParam -- 保留
// IN lParam -- 保留
// 返回值:返回当前编辑区的文本限制数
// 功能描述:得到当前编辑区的文本限制。
// 引用:
// **************************************************
static LRESULT DoGetLimitText(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
LPEDITITEM lpEditItem;
// Get struct EDITITEM data
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
if(lpEditItem==NULL) return 0;
wParam++;
lParam++;
return lpEditItem->cbEditLimitLen; // 返回文本限制
}
// **************************************************
// 声明:static LRESULT DoGetLine(HWND hWnd,WPARAM wParam,LPARAM lParam)
// 参数:
// IN hWnd -- 窗口句柄
// IN wParam -- INT 指定行索引
// IN lParam -- LPSTR 存放指定行内容的缓存,缓存中的第一个WORD是缓存的大小。
// 返回值:成功返回COPY字符的个数,否则返回0
// 功能描述:得到指定行的数据,处理EM_GETLINE消息。
// 引用:
// **************************************************
static LRESULT DoGetLine(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
LPEDITITEM lpEditItem;
int nLine,nLineLen,nBufferMaxLen;
LPSTR lpch;
LPSTR lpLineAddress;
// Get struct EDITITEM data
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
if(lpEditItem==NULL) return 0;
nLine=(int)wParam;
#ifdef _MAPPOINTER
lParam = (LPARAM)MapPtrToProcess( (LPVOID)lParam, GetCallerProcess() ); // 映射指针
#endif
lpch=(LPSTR)lParam;
lpLineAddress=GetLineAddress(hWnd,lpEditItem,nLine); //得到指定行的地址
nLineLen=GetLineLength(hWnd,lpEditItem,(LPCTSTR)lpLineAddress,NULL); // 得到指定行的长度
nBufferMaxLen=MAKEWORD(*lpch,*(lpch+1)); // 得到缓存的大小
if (nLineLen>=nBufferMaxLen)
return 0; // 缓存太小
memcpy((void *)lpch,(const void *)lpLineAddress,nLineLen); // 复制指定行数据
lpch[nLineLen]=0; // 设置结尾符
return nLineLen;
}
// **************************************************
// 声明:static LRESULT DoGetThumb(HWND hWnd,WPARAM wParam,LPARAM lParam)
// 参数:
// IN hWnd -- 窗口句柄
// IN wParam -- 保留
// IN lParam -- 保留
// 返回值:返回垂直滚动条滚动块的位置
// 功能描述:得到垂直滚动条滚动块的位置,处理EM_GETTHUMB消息。
// 引用:
// **************************************************
static LRESULT DoGetThumb(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
DWORD dwStyle;
dwStyle=GetWindowLong(hWnd,GWL_STYLE);
if (!(dwStyle&WS_VSCROLL)) return 0;
wParam++;
lParam++;
return Edit_GetScrollPos(hWnd,SB_VERT); // 得到滚动条滑块的位置
}
// **************************************************
// 声明:static LRESULT DoGetLineCount(HWND hWnd,WPARAM wParam,LPARAM lParam)
// 参数:
// IN hWnd -- 窗口句柄
// IN wParam -- 保留
// IN lParam -- 保留
// 返回值:返回编辑区的总行数
// 功能描述:得到编辑区的总行数,处理EM_GETLINECOUNT消息。
// 引用:
// **************************************************
static LRESULT DoGetLineCount(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
LPEDITITEM lpEditItem;
// Get struct EDITITEM data
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
if(lpEditItem==NULL) return 0;
wParam++;
lParam++;
return lpEditItem->nTotalLine; // 得到编辑区的总行数
}
// **************************************************
// 声明:static LRESULT DoGetModify(HWND hWnd,WPARAM wParam,LPARAM lParam)
// 参数:
// IN hWnd -- 窗口句柄
// IN wParam -- 保留
// IN lParam -- 保留
// 返回值:返回当前编辑区的修改标志。
// 功能描述:得到当前编辑区的修改标志,处理EM_GETMODIFY消息。
// 引用:
// **************************************************
static LRESULT DoGetModify(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
LPEDITITEM lpEditItem;
// Get struct EDITITEM data
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
if(lpEditItem==NULL) return FALSE;
wParam++;
lParam++;
return lpEditItem->fModified; // 得到编辑区的修改标志
}
// **************************************************
// 声明:static LRESULT DoGetPasswordChar(HWND hWnd,WPARAM wParam,LPARAM lParam)
// 参数:
// IN hWnd -- 窗口句柄
// IN wParam -- 保留
// IN lParam -- 保留
// 返回值:返回当前编辑区的密码字符
// 功能描述:得到当前编辑区的密码字符,处理EM_GETPASSWORDCHAR消息。
// 引用:
// **************************************************
static LRESULT DoGetPasswordChar(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
LPEDITITEM lpEditItem;
DWORD dwStyle;
// Get struct EDITITEM data
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
if(lpEditItem==NULL) return 0;
dwStyle=GetWindowLong(hWnd,GWL_STYLE);
wParam++;
lParam++;
if (dwStyle&ES_PASSWORD)
return lpEditItem->chPassWordWord; // 得到编辑区的密码字符
else
return 0;
}
// **************************************************
// 声明:static LRESULT DoGetSel(HWND hWnd, WPARAM wParam, LPARAM lParam)
// 参数:
// IN hWnd -- 窗口句柄
// IN wParam -- LPDWORD , 存放选择区域的起始位置字符索引
// IN lParam -- LPDOWRD , 存放选择区域的结束位置字符索引
// 返回值:成功返回MAKERESULT(START,END),否则返回0。
// 功能描述:得到编辑区的选择区域,处理EM_GETSEL消息。
// 引用:
// **************************************************
static LRESULT DoGetSel(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
LPEDITITEM lpEditItem;
int nStart , nEnd;
LPDWORD lpdwStart,lpdwEnd;
LRESULT lResult;
// Get struct EDITITEM data
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
if(lpEditItem==NULL) return 0;
#ifdef _MAPPOINTER
wParam = (WPARAM)MapPtrToProcess( (LPVOID)wParam, GetCallerProcess() ); // 映射指针
lParam = (LPARAM)MapPtrToProcess( (LPVOID)lParam, GetCallerProcess() );
#endif
lpdwStart=(LPDWORD)wParam;
lpdwEnd=(LPDWORD)lParam;
if (lpEditItem->lpInvertStart==lpEditItem->lpInvertEnd)
{
// !!! Modified By Jami chen on 2003.09.12
// return -1;
nStart=0;
nEnd=0;
// !!! Modified End By Jami chen on 2003.09.12
}
else
{
nStart=lpEditItem->lpInvertStart-lpEditItem->lpPDAEditBuffer; // 得到选择开始位置
nEnd=lpEditItem->lpInvertEnd-lpEditItem->lpPDAEditBuffer; // 得到选择结束位置
}
if (lpdwStart)
*lpdwStart=(DWORD)nStart; // 赋开始位置
if (lpdwEnd)
*lpdwEnd=(DWORD)nEnd; // 赋结束位置
// !!! Modified By Jami chen on 2003.09.12
if (nEnd > 0xffff || nStart > 0xffff)
lResult = -1;
else
lResult=MAKELRESULT(nStart,nEnd); // 得到返回值
// !!! Modified End By Jami chen on 2003.09.12
return lResult;
}
// **************************************************
// 声明:static LRESULT DoSetLimitText(HWND hWnd,WPARAM wParam,LPARAM lParam)
// 参数:
// IN hWnd -- 窗口句柄
// IN wParam -- 保留
// IN lParam -- 保留
// 返回值:成功返回TRUE,否则返回FALSE。
// 功能描述:设置编辑区的文本限制,处理EM_SETLIMITTEXT消息。
// 引用:
// **************************************************
st
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -