📄 edit.c
字号:
lParam = (LPARAM)MapPtrToProcess( (LPVOID)lParam, GetCallerProcess() );
#endif
lpnLine=(int *)wParam;
lpxPos=(int *)lParam;
// get struct EDITITEM data
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0); // // 得到编辑条目结构指针
if (lpEditItem==NULL) return;
if (lpnLine)
*lpnLine=lpEditItem->nCaretLine+lpEditItem->nDisplayLine; // 得到光标的行数
if (lpxPos)
*lpxPos=lpEditItem->nCaretx+lpEditItem->nDisplayx; // 得到光标的水平位置
}
// **************************************************
// 声明:static void DoSetCaretPosition(HWND hWnd,WPARAM wParam,LPARAM lParam)
// 参数:
// IN hWnd -- 窗口句柄
// IN wParam -- INT ,光标所在的行
// IN lParam -- INT ,光标所在的x坐标
// 返回值:无
// 功能描述:设置光标位置,处理EM_SETCARETPOS消息。
// 引用:
// **************************************************
static void DoSetCaretPosition(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
int nTextHeight,xCaretPos,xPos,yPos,nCaretLine;
LPEDITITEM lpEditItem;
xCaretPos=(int )lParam;
nCaretLine=(int )wParam;
// get struct EDITITEM data
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
if (lpEditItem==NULL) return;
nTextHeight=GetTextHeight(hWnd); // 得到文本高度
xPos=xCaretPos-lpEditItem->nDisplayx; // 得到光标的坐标
yPos=(nCaretLine-lpEditItem->nDisplayLine)*nTextHeight;
SetPDACaretPosition(hWnd,lpEditItem,xPos,yPos); // 设置光标的坐标
AdjustCaretInEditItem(hWnd,lpEditItem); // 调整光标的位置
SetPDACaret(hWnd); // 设置光标
}
// **************************************************
// 声明:static void DoSetxDisplayPos(HWND hWnd,WPARAM wParam,LPARAM lParam)
// 参数:
// IN hWnd -- 窗口句柄
// IN wParam -- int ,水平显示位置。
// IN lParam -- 保留
// 返回值:无
// 功能描述:设置水平方向的显示位置,处理MIEM_SETXDISPLAYPOS消息。
// 引用:
// **************************************************
static void DoSetxDisplayPos(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
LPEDITITEM lpEditItem;
HDC hdc;
int xPos,xCaretPos;
xPos=(int )wParam;
// get struct EDITITEM data
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
if (lpEditItem==NULL) return;
// get old caret x position
xCaretPos=lpEditItem->nDisplayx+lpEditItem->nCaretx;
// set new display position
lpEditItem->nDisplayx=xPos;
// set HSCROLL
SetPDAEditHScrollPos(hWnd,(int)((lpEditItem->nDisplayx)/HSCROLLWIDTH));
hdc=GetDC(hWnd);
// redraw the window
DrawPDAEditSpecialText(hWnd,hdc,lpEditItem,NULL,0,0,0,PE_SHOWCLIENT);
ReleaseDC(hWnd,hdc);
// reset the caret position
lpEditItem->nCaretx=xCaretPos-lpEditItem->nDisplayx;
SetPDACaret(hWnd);
lParam++;
}
// **************************************************
// 声明:static void SetPDAEditScrollPage(HWND hWnd)
// 参数:
// IN hWnd -- 窗口句柄
// 返回值:无
// 功能描述:设置编辑区滚动条滚动一页的值
// 引用:
// **************************************************
// delete By Jami chen in 2004.06.12
/*static void SetPDAEditScrollPage(HWND hWnd)
{
int nPageLine;
//int nTextHeight;
//RECT rcClientRect;
SCROLLINFO ScrollInfo;
DWORD dwStyle;
// get window style
dwStyle=GetWindowLong(hWnd,GWL_STYLE);
// get page Lines
nPageLine=GetPageLine(hWnd);
ScrollInfo.cbSize=sizeof(SCROLLINFO);
ScrollInfo.fMask=SIF_PAGE;
// Set Vertical Scroll Page
if (dwStyle&WS_VSCROLL)
{ // set vertical scroll page
ScrollInfo.nPage =nPageLine;
SetScrollInfo(hWnd,SB_VERT,&ScrollInfo,TRUE);
}
// Set horizonta Scroll Page
if (dwStyle&WS_HSCROLL)
{ // set horizon scroll page
ScrollInfo.nPage =1;
SetScrollInfo(hWnd,SB_HORZ,&ScrollInfo,TRUE);
}
}
*/
// delete End By Jami chen in 2004.06.12
// **************************************************
// 声明:static void SetPDAEditVScrollPos(HWND hWnd,int nNewScrollPos)
// 参数:
// IN hWnd -- 窗口句柄
// IN nNewScrollPos -- 滚动条当前的新位置。
// 返回值:无
// 功能描述:设置编辑区垂直滚动条的当前位置
// 引用:
// **************************************************
static void SetPDAEditVScrollPos(HWND hWnd,int nNewScrollPos)
{
DWORD dwStyle;
dwStyle=GetWindowLong(hWnd,GWL_STYLE); // 得到窗口风格
if (!(dwStyle&WS_VSCROLL)) return;
Edit_SetScrollPos(hWnd,SB_VERT,nNewScrollPos,TRUE); // 设置滚动条的位置
}
// **************************************************
// 声明:static void SetPDAEditHScrollPos(HWND hWnd,int nNewScrollPos)
// 参数:
// IN hWnd -- 窗口句柄
// IN nNewScrollPos -- 滚动条当前的新位置。
// 返回值:
// 功能描述:设置编辑区水平滚动条的当前位置
// 引用:
// **************************************************
static void SetPDAEditHScrollPos(HWND hWnd,int nNewScrollPos)
{
DWORD dwStyle;
dwStyle=GetWindowLong(hWnd,GWL_STYLE); // 得到窗口风格
if (!(dwStyle&WS_HSCROLL)) return; // 不能滚动
Edit_SetScrollPos(hWnd,SB_HORZ,nNewScrollPos,TRUE); // 设置滚动条的位置
}
// **************************************************
// 声明:static int DoVScrollWindow(HWND hWnd,WPARAM wParam,LPARAM lParam)
// 参数:
// IN hWnd -- 窗口句柄
// IN wParam -- LOWORD,滚动类型
// IN lParam -- 保留
// 返回值:成功返回滚动的行数,否则返回0
// 功能描述:垂直滚动屏幕,处理WM_VSCROLL消息。
// 引用:
// **************************************************
static int DoVScrollWindow(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
int nScrollLine,nWindowLine;
// RECT rcClientRect;
int yPos;
nWindowLine=GetPageLine(hWnd);
yPos=Edit_GetScrollPos(hWnd,SB_VERT);
switch(LOWORD(wParam))
{
case SB_PAGEUP: // page up
nScrollLine=0-nWindowLine;
break;
case SB_PAGEDOWN: //page down
nScrollLine=nWindowLine;
break;
case SB_LINEUP: // line up
nScrollLine=-1;
break;
case SB_LINEDOWN: // line down
nScrollLine=1;
break;
case SB_THUMBTRACK: // drag thumb track
nScrollLine=HIWORD(wParam)-yPos;
break;
default:
nScrollLine=0;
return 0;
}
// vertical scroll window
lParam++;
return VScrollWindowInPDAEdit(hWnd,nScrollLine); // 滚动窗口
}
// **************************************************
// 声明:static void DoHScrollWindow(HWND hWnd,WPARAM wParam,LPARAM lParam)
// 参数:
// IN hWnd -- 窗口句柄
// IN wParam -- LOWORD,滚动类型
// IN lParam -- 保留
// 返回值:无
// 功能描述:水平滚动屏幕,处理WM_HSCROLL消息。
// 引用:
// **************************************************
static void DoHScrollWindow(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
int nHScrollPos,xWindowWidth;
// RECT rcClientRect;
int xPos;
LPEDITITEM lpEditItem;
// get struct PADEDITSTATE data
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
if (lpEditItem==NULL) return;
// get window width
xWindowWidth=GetWindowWidth(hWnd,lpEditItem);
xWindowWidth=(xWindowWidth/HSCROLLWIDTH)*HSCROLLWIDTH;
// get current x position
xPos=Edit_GetScrollPos(hWnd,SB_HORZ);
switch(LOWORD(wParam))
{
case SB_PAGEUP: // page left
nHScrollPos=0-xWindowWidth;
break;
case SB_PAGEDOWN: // page right
nHScrollPos=xWindowWidth;
break;
case SB_LINEUP: // move a sect left
nHScrollPos=0-HSCROLLWIDTH;
break;
case SB_LINEDOWN: // a sect right
nHScrollPos=HSCROLLWIDTH;
break;
case SB_THUMBTRACK: //drag thumb track
nHScrollPos=(HIWORD(wParam)-xPos)*HSCROLLWIDTH;
break;
default:
return;
}
// horizon scroll window
lParam++;
HScrollWindowInPDAEdit(hWnd,nHScrollPos); // 水平滚动窗口
}
// **************************************************
// 声明:static int GetPageLine(HWND hWnd)
// 参数:
// IN hWnd -- 窗口句柄
// 返回值:返回一页的行数
// 功能描述:得到编辑去一页的行数。
// 引用:
// **************************************************
// delete By Jami chen in 2004.06.12
/*static int GetPageLine(HWND hWnd)
{
int nTextHeight,nPageLine;
RECT rcClientRect;
// get line height
nTextHeight=GetTextHeight(hWnd);
// get client rect
GetClientRect(hWnd,&rcClientRect);
// get page lines
nPageLine=rcClientRect.bottom/nTextHeight;
return nPageLine;
}
*/
// **************************************************
// 声明:static void ScrollCaretInPDAEdit(HWND hWnd,int nScrollLine)
// 参数:
// IN hWnd -- 窗口句柄
// IN nScrillLine -- 滚动的行数
// 返回值:无
// 功能描述:垂直滚动光标。
// 引用:
// **************************************************
// delete By Jami chen in 2004.06.12
/*static void ScrollCaretInPDAEdit(HWND hWnd,int nScrollLine)
{
LPEDITITEM lpEditItem;
// int nClientLine;
//RECT ClientRect;
int nPointCoordinate,nLine,nCaretPosition;
LPTSTR lpLineAddress;
// int nTextHeight;
// get line height
// nTextHeight=GetTextHeight(hWnd);
// get struct PADEDITSTATE data
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
if (lpEditItem==NULL) return;
// calculate client lines
if (nScrollLine<0)
{ // scroll to up
if (lpEditItem->nCaretLine==0&&lpEditItem->nDisplayLine==0) // alread to the top of the edit control
return;
}
if(nScrollLine>0)
{ // scroll down
if (lpEditItem->nCaretLine+lpEditItem->nDisplayLine>=(lpEditItem->nTotalLine-1))
return; // alread to the bottom of the edit control
}
// set caret to new line
lpEditItem->nCaretLine+=nScrollLine;
// Get caret line from the text
nLine=lpEditItem->nCaretLine+lpEditItem->nDisplayLine;
// get address of caret line
lpLineAddress=GetLineAddress(hWnd,lpEditItem,nLine);
// get caret xPosition from text
nPointCoordinate=lpEditItem->nCaretx+lpEditItem->nDisplayx;
// get caret position
lpEditItem->lpCaretPosition=GetLinePosition(hWnd,lpEditItem,lpLineAddress,nPointCoordinate,TRUE,&nCaretPosition);
if (lpEditItem->lpCaretPosition<lpEditItem->lpPDAEditBuffer)
{ // the caret position on title
SetCaretToStart(hWnd,lpEditItem);
}
else
{
// Get caret x-coordinate form window origin
lpEditItem->nCaretx=nCaretPosition-lpEditItem->nDisplayx;
}
// adjust caret coordinate
if (AdjustCaretInEditItem(hWnd,lpEditItem)==TRUE)
{
// clear invert and not redraw
ClearInvert(hWnd,lpEditItem,FALSE);
// redraw the windwo
// DrawPDAEditControl(hWnd);
InvalidateRect(hWnd,NULL,TRUE);
}
else
{// clear invert and redraw
ClearInvert(hWnd,lpEditItem,TRUE);
}
// reset caret
SetPDACaret(hWnd);
}
*/
// delete End By Jami chen in 2004.06.12
// **************************************************
// 声明:static int VScrollWindowInPDAEdit(HWND hWnd,int nScrollLine)
// 参数:
// IN hWnd -- 窗口句柄
// IN nScrillLine -- 滚动的行数
// 返回值:无
// 功能描述:垂直滚动窗口。
// 引用:
// **************************************************
static int VScrollWindowInPDAEdit(HWND hWnd,int nScrollLine)
{
LPEDITITEM lpEditItem;
int nClientLine;
// RECT ClientRect;
int nCaretLine,nOldDisplayLine;
// LPTSTR lpLineAddress;
// get struct PADEDITSTATE data
lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
if (lpEditItem==NULL) return 0;
// calculate client lines
nClientLine=GetPageLine(hWnd);
if (nScrollLine<0)
{ // up ?
if (lpEditItem->nDisplayLine==0)
return 0;
}
if(nScrollLine>0)
{ // down ?
if (lpEditItem->nDisplayLine+nClientLine>lpEditItem->nTotalLine)
return 0;
}
// get old caret position
nCaretLine=lpEditItem->nCaretLine+lpEditItem->nDisplayLine;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -