📄 multiple.c
字号:
nPageLine=GetPageLine(hWnd);
nCaretLine=lpMultiItemEditStruct->nItemStartLineList[lpMultiItemEditStruct->iActiveItem]+lpActiveEditItem->nCaretLine; // 得到光标的位置
if (nCaretLine<0) nCaretLine=0; // 需要调整到开头
if (nCaretLine>=lpMultiItemEditStruct->nItemStartLineList[lpMultiItemEditStruct->nItemNum])
{ // 需要调整到结尾
nCaretLine=lpMultiItemEditStruct->nItemStartLineList[lpMultiItemEditStruct->nItemNum]-1;
bResult=TRUE;
}
if (nCaretLine<lpMultiItemEditStruct->nDisplayLine)
{ // 需要向下滚动窗口
nScrollLine=nCaretLine-lpMultiItemEditStruct->nDisplayLine;
// lpMultiItemEditStruct->nDisplayLine=nCaretLine;
VScrollMultiItemEdit(hWnd,nScrollLine); // 滚动窗口
bResult=TRUE;
}
if (nCaretLine>=lpMultiItemEditStruct->nDisplayLine+nPageLine)
{ // 需要向上滚动窗口
nScrollLine=nCaretLine-(lpMultiItemEditStruct->nDisplayLine+nPageLine)+1;
// lpMultiItemEditStruct->nDisplayLine=nCaretLine-nPageLine+1;
VScrollMultiItemEdit(hWnd,nScrollLine); // 滚动窗口
bResult=TRUE;
}
return bResult;
}
/**************************************************
声明:static void SetMIEditVScrollRange(HWND hWnd,int nTotalLine,int nWindowLine)
参数:
IN hWnd -- 窗口句柄
IN nTotalLine -- 控件总行数
IN nWindowLine -- 控件窗口的行数
返回值:无
功能描述:设置垂直滚动条的范围。
引用:
************************************************/
static void SetMIEditVScrollRange(HWND hWnd,int nTotalLine,int nWindowLine)
{
int nMinPos,nMaxPos;
DWORD dwStyle;
dwStyle=GetWindowLong(hWnd,GWL_STYLE); // 得到窗口风格
// if (!(dwStyle&WS_VSCROLL)) return;
if (nWindowLine==0)
nWindowLine=1;
if (nTotalLine<=nWindowLine)
{
// !!! Add By Jami chen in 2004.08.21
LPMULTIITEMEDITSTRUCT lpMultiItemEditStruct;
int nScrollLine;
lpMultiItemEditStruct=(LPMULTIITEMEDITSTRUCT)GetWindowLong(hWnd,0);
if (lpMultiItemEditStruct==NULL) return;
// 如果要删除滚动条,则要从0 开始显示
nScrollLine=0-lpMultiItemEditStruct->nDisplayLine;
// lpMultiItemEditStruct->nDisplayLine=nCaretLine;
VScrollMultiItemEdit(hWnd,nScrollLine); // 滚动窗口
// lpMultiItemEditStruct->nDisplayLine = 0;
// !!! Add End By Jami chen in 2004.08.21
if ((dwStyle&WS_VSCROLL))
{ // 删除滚动条
ShowScrollBar(hWnd,SB_VERT,FALSE);
DoSize(hWnd,0,0); // 调整窗口大小
// SetHScrollBar(hWnd);
}
// EnableScrollBar(hWnd,SB_VERT,ESB_DISABLE_BOTH);
}
else
{
nMinPos=0;
nMaxPos=nTotalLine-1;//-nWindowLine+1;
if ((dwStyle&WS_VSCROLL)==0)
{ // 需要显示窗口
ShowScrollBar(hWnd,SB_VERT,TRUE);
DoSize(hWnd,0,0); // 调整窗口大小
Edit_SetScrollRange(hWnd,SB_VERT,nMinPos,nMaxPos,TRUE); // 设置滚动范围
SetMIEditScrollPage(hWnd); // 设置滚动页
}
else
Edit_SetScrollRange(hWnd,SB_VERT,nMinPos,nMaxPos,TRUE);
EnableScrollBar(hWnd,SB_VERT,ESB_ENABLE_BOTH); // 滚动条ENABLE
}
}
/**************************************************
声明:static void SetMIEditScrollPage(HWND hWnd)
参数:
IN hWnd -- 窗口句柄
返回值:无
功能描述:设置水平滚动条的范围。
引用:
************************************************/
static void SetMIEditScrollPage(HWND hWnd)
{
int nPageLine;
// int nTextHeight;
//RECT rcClientRect;
SCROLLINFO ScrollInfo;
DWORD dwStyle;
dwStyle=GetWindowLong(hWnd,GWL_STYLE); // 得到窗口风格
nPageLine=GetPageLine(hWnd); // 得到页的行数
ScrollInfo.cbSize=sizeof(SCROLLINFO);
ScrollInfo.fMask=SIF_PAGE;
// Set Vertical Scroll Page
if (dwStyle&WS_VSCROLL)
{
ScrollInfo.nPage =nPageLine;
SetScrollInfo(hWnd,SB_VERT,&ScrollInfo,TRUE);
}
// Set horizonta Scroll Page
if (dwStyle&WS_HSCROLL)
{
ScrollInfo.nPage =1;
SetScrollInfo(hWnd,SB_HORZ,&ScrollInfo,TRUE);
}
}
/**************************************************
声明:static void SetMIEditVScrollPos(HWND hWnd,int nNewScrollPos)
参数:
IN hWnd -- 窗口句柄
IN nNewScrollPos -- 新的滚动条的位置
返回值:无
功能描述:设置垂直滚动条的位置。
引用:
************************************************/
static void SetMIEditVScrollPos(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 SetMIEditHScrollPos(HWND hWnd,int nNewScrollPos)
参数:
IN hWnd -- 窗口句柄
IN nNewScrollPos -- 新的滚动条的位置
返回值:无
功能描述:设置水平滚动条的位置。
引用:
************************************************/
static void SetMIEditHScrollPos(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 nTextHeight,yPos;
GetClientRect(hWnd,&rcClientRect); // 得到客户矩形
nTextHeight=GetTextHeight(hWnd); // 得到文本高度
nWindowLine=rcClientRect.bottom/nTextHeight;
yPos=Edit_GetScrollPos(hWnd,SB_VERT); // 得到滑块位置
switch(LOWORD(wParam))
{
case SB_PAGEUP: // 上翻页
nScrollLine=0-nWindowLine;
break;
case SB_PAGEDOWN: // 下翻页
nScrollLine=nWindowLine;
break;
case SB_LINEUP: // 上滚行
nScrollLine=-1;
break;
case SB_LINEDOWN: // 下滚行
nScrollLine=1;
break;
case SB_THUMBTRACK: // 滑块移动
nScrollLine=HIWORD(wParam)-yPos;
break;
default:
nScrollLine=0;
return 0;
}
return VScrollMultiItemEdit(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 xScrollPos,xWindowWidth;
RECT rcClientRect;
int xPos;
GetClientRect(hWnd,&rcClientRect); // 得到客户矩形
xWindowWidth=(rcClientRect.right/HSCROLLWIDTH)*HSCROLLWIDTH;
xPos=Edit_GetScrollPos(hWnd,SB_HORZ); // 得到滑块位置
switch(LOWORD(wParam))
{
case SB_PAGEUP: // 上翻页
xScrollPos=0-xWindowWidth;
break;
case SB_PAGEDOWN: // 下翻页
xScrollPos=xWindowWidth;
break;
case SB_LINEUP: // 上滚行
xScrollPos=0-HSCROLLWIDTH;
break;
case SB_LINEDOWN: // 下滚行
xScrollPos=HSCROLLWIDTH;
break;
case SB_THUMBTRACK: // 移动滑块
xScrollPos=(HIWORD(wParam)-xPos)*HSCROLLWIDTH;
// Print(100,10,xScrollPos);
break;
default:
return;
}
HScrollMultiItemEdit(hWnd,xScrollPos); // 水平滚动窗口
}
/**************************************************
声明: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;
nTextHeight=GetTextHeight(hWnd); // 得到文本高度
GetClientRect(hWnd,&rcClientRect); // 得到窗口客户矩形
nPageLine=rcClientRect.bottom/nTextHeight; // 得到页行数
if (nPageLine==0)
nPageLine=1; // 最少可显示一行
return nPageLine;
}
*/
/*
static void DoDisplayChanged(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
int nDisplayx,nCaretLine;
LPMULTIITEMEDITSTRUCT lpMultiItemEditStruct;
int i;
HWND hActiveWnd;
int iActiveItem;
lpMultiItemEditStruct=(LPMULTIITEMEDITSTRUCT)GetWindowLong(hWnd,0);
if (lpMultiItemEditStruct==NULL) return;
hActiveWnd=(HWND)wParam;
nDisplayx=LOWORD(lParam);
nCaretLine=HIWORD(lParam);
if (lpMultiItemEditStruct->xDisplayPos!=nDisplayx)
{
lpMultiItemEditStruct->xDisplayPos=nDisplayx;
for (i=0;i<lpMultiItemEditStruct->nItemNum;i++)
{
// PostMessage(lpMultiItemEditStruct->hItemWndList[i],MIEM_SETXDISPLAYPOS,lpMultiItemEditStruct->xDisplayPos,0);
}
SetMIEditHScrollPos(hWnd,(int)((lpMultiItemEditStruct->xDisplayPos)/HSCROLLWIDTH));
}
// !! iActiveItem=GetItemSequence(hWnd,hActiveWnd);
nCaretLine+=lpMultiItemEditStruct->nItemStartLineList[iActiveItem];
AdjustCaretPosition(hWnd);
}
*/
/**************************************************
声明:void SetCaretToNextItem(HWND hWnd,LPEDITITEM lpEditItem)
参数:
IN hWnd -- 窗口句柄
IN lpEditItem -- 当前的编辑条目结构指针
返回值:无
功能描述:设置光标到下一个条目。
引用:
************************************************/
void SetCaretToNextItem(HWND hWnd,LPEDITITEM lpEditItem)
{
LPMULTIITEMEDITSTRUCT lpMultiItemEditStruct;
LPEDITITEM lpNewEditItem;
int iActiveItem;
lpMultiItemEditStruct=(LPMULTIITEMEDITSTRUCT)GetWindowLong(hWnd,0); // 得到编辑窗口数据
if (lpMultiItemEditStruct==NULL) return;
iActiveItem=GetItemSequence(hWnd,lpEditItem); // 得到条目索引
iActiveItem++; // 得到下一个条目索引
if (iActiveItem>=lpMultiItemEditStruct->nItemNum)
return;
ClearInvert(hWnd,lpEditItem,TRUE);
lpMultiItemEditStruct->iActiveItem=iActiveItem; // 激活条目
lpNewEditItem=&lpMultiItemEditStruct->lpItemList[iActiveItem];
SetPDACaretPosition(hWnd,lpNewEditItem,0,0); // 设置光标到条目开始
if (AdjustCaretPosition(hWnd)==TRUE); // 调整光标位置
// {
// Redraw the window
// DrawPDAEditControl(hWnd,hdc);
// InvalidateRect(hWnd,NULL,TRUE);
// }
// set caret position
SetPDACaret(hWnd); // 设置光标
// show caret
ShowPDACaret(hWnd); // 显示光标
SendNotificationMsg(hWnd,EN_ACTIVEITEMCHANGE); // 通知父窗口
// PostMessage(lpMultiItemEditStruct->hItemWndList[iActiveItem],EM_SETCARETPOS,0,0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -