📄 multiple.c
字号:
{
HWND hChangedWnd;
int nChangedLine,nCaretLine;
int iActiveItem;
LPMULTIITEMEDITSTRUCT lpMultiItemEditStruct;
lpMultiItemEditStruct=(LPMULTIITEMEDITSTRUCT)GetWindowLong(hWnd,0);
if (lpMultiItemEditStruct==NULL) return;
hChangedWnd=(HWND)wParam;
nChangedLine=(int)HIWORD(lParam);
nCaretLine=(int)LOWORD(lParam);
//!! iActiveItem=GetItemSequence(hWnd,hChangedWnd);
ReSetItemPos(hWnd,iActiveItem,nChangedLine);
nCaretLine+=lpMultiItemEditStruct->nItemStartLineList[iActiveItem];
AdjustCaretPosition(hWnd);
} */
/**************************************************
声明:void ChangeSize(HWND hWnd,LPEDITITEM lpEditItem,int nChangedLine,BOOL bRedraw)
参数:
IN hWnd -- 窗口句柄
IN lpEditItem --要改变的编辑条目的编辑结构指针
IN nChangedLine -- 改变大小
IN bRedraw -- 重绘标志
返回值:无
功能描述:改变一个编辑条目的大小
引用:
************************************************/
void ChangeSize(HWND hWnd,LPEDITITEM lpEditItem,int nChangedLine,BOOL bRedraw)
{
int iActiveItem;
iActiveItem=GetItemSequence(hWnd,lpEditItem);
ReSetItemPos(hWnd,iActiveItem,nChangedLine,bRedraw); // 重设条目位置
}
/**************************************************
声明:static void ReSetItemPos(HWND hWnd,int iChangedSequence,int nChangedLine,BOOL bRedraw)
参数:
IN hWnd -- 窗口句柄
IN iChangedSequence -- 改变条目的次序
IN nChangedLine -- 改变大小
IN bRedraw -- 重绘标志
返回值:无
功能描述:重设各个编辑条目的位置。
引用:
************************************************/
static void ReSetItemPos(HWND hWnd,int iChangedSequence,int nChangedLine,BOOL bRedraw)
{
LPMULTIITEMEDITSTRUCT lpMultiItemEditStruct;
int i;
int nTextHeight,nNewStartPos;
int nClientLine;
RECT rcClientRect;
HDC hdc;
lpMultiItemEditStruct=(LPMULTIITEMEDITSTRUCT)GetWindowLong(hWnd,0); // 得到编辑窗口数据
if (lpMultiItemEditStruct==NULL) return;
nTextHeight=GetTextHeight(hWnd); // 得到文本高度
i=iChangedSequence+1;
hdc=GetDC(hWnd); // 得到设备句柄
for (;i<lpMultiItemEditStruct->nItemNum;i++)
{ // 显示条目
lpMultiItemEditStruct->nItemStartLineList[i]+=nChangedLine;
nNewStartPos=(lpMultiItemEditStruct->nItemStartLineList[i]-lpMultiItemEditStruct->nDisplayLine)*nTextHeight;
lpMultiItemEditStruct->lpItemList[i].iStartPos=nNewStartPos;
if (bRedraw)
DrawPDAEditControl(hWnd,hdc,&lpMultiItemEditStruct->lpItemList[i],PE_SHOWCLIENT);
}
ReleaseDC(hWnd,hdc); // 释放条目
lpMultiItemEditStruct->nItemStartLineList[i]+=nChangedLine;
lpMultiItemEditStruct->nContextBottomPos+=nChangedLine*nTextHeight;
if (bRedraw)
ClearBottomBlankArea(hWnd); // 清除底部空白
GetClientRect(hWnd,&rcClientRect); // 得到客户矩形
nClientLine=rcClientRect.bottom/nTextHeight;
SetMIEditVScrollRange(hWnd,lpMultiItemEditStruct->nItemStartLineList[lpMultiItemEditStruct->nItemNum],nClientLine);
}
/**************************************************
声明:static void ClearBottomBlankArea(HWND hWnd)
参数:
IN hWnd -- 窗口句柄
返回值:无
功能描述:清除窗口底部没有数据的区域。
引用:
************************************************/
static void ClearBottomBlankArea(HWND hWnd)
{
LPMULTIITEMEDITSTRUCT lpMultiItemEditStruct;
RECT rcClientRect,rcClearRect;
HDC hdc;
int nBottomPos;
HBRUSH hBrush;
lpMultiItemEditStruct=(LPMULTIITEMEDITSTRUCT)GetWindowLong(hWnd,0); // 得到编辑窗口数据
if (lpMultiItemEditStruct==NULL) return;
nBottomPos=lpMultiItemEditStruct->nContextBottomPos;
GetClientRect(hWnd,&rcClientRect);
if (nBottomPos<rcClientRect.bottom)
{ // 需要清除底部空白
rcClearRect.left=0;
rcClearRect.top=nBottomPos;
rcClearRect.right=rcClientRect.right;
rcClearRect.bottom =rcClientRect.bottom;
// clear ClearRect
hdc=GetDC(hWnd);
// FillRect(hdc,&rcClearRect,(HBRUSH)(COLOR_WINDOWFRAME));
// FillRect(hdc,&rcClearRect,GetStockObject(WHITE_BRUSH));
hBrush = GetBkBrush(hWnd,NULL); // 得到背景画刷
FillRect(hdc,&rcClearRect,hBrush); // 清除画面
DeleteObject(hBrush);
ReleaseDC(hWnd,hdc);
}
}
/*static int GetTextHeight(HWND hWnd)
{
HDC hdc;
TEXTMETRIC TextMetric;
hdc=GetWindowDC(hWnd);
GetTextMetrics(hdc,&TextMetric);
ReleaseDC(hWnd,hdc);
return TextMetric.tmHeight;
}*/
/*
static BOOL DoMoveCaret(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HWND hActiveItemWnd;
int nCaretLine,xPos,nItemCaretLine;
LPMULTIITEMEDITSTRUCT lpMultiItemEditStruct;
int nPageLine;
int iActiveItem;
// RECT rcClientRect;
lpMultiItemEditStruct=(LPMULTIITEMEDITSTRUCT)GetWindowLong(hWnd,0);
if (lpMultiItemEditStruct==NULL) return FALSE;
hActiveItemWnd=(HWND)wParam;
xPos=(int)LOWORD(lParam);
nItemCaretLine=(int)HIWORD(lParam);
//!! iActiveItem=GetItemSequence(hWnd,hActiveItemWnd);
nCaretLine=lpMultiItemEditStruct->nItemStartLineList[lpMultiItemEditStruct->iActiveItem]+nItemCaretLine;
nPageLine=GetPageLine(hWnd);
switch(message)
{
case EN_DOWNPAGE:
if (nCaretLine==lpMultiItemEditStruct->nItemStartLineList[lpMultiItemEditStruct->nItemNum]-1)
return FALSE;
nCaretLine+=nPageLine;
break;
case EN_UPPAGE:
if(nCaretLine==0) return FALSE;
nCaretLine-=nPageLine;
break;
case EN_DOWNLINE:
if (nCaretLine==lpMultiItemEditStruct->nItemStartLineList[lpMultiItemEditStruct->nItemNum]-1)
return FALSE;
nCaretLine++;
break;
case EN_UPLINE:
if(nCaretLine==0) return FALSE;
nCaretLine--;
break;
// not process
case EN_END:
case EN_HOME:
case EN_LEFT:
case EN_RIGHT:
return FALSE;
}
AdjustCaretPosition(hWnd);
if (nCaretLine<0) nCaretLine=0;
if (nCaretLine>=lpMultiItemEditStruct->nItemStartLineList[lpMultiItemEditStruct->nItemNum])
nCaretLine=lpMultiItemEditStruct->nItemStartLineList[lpMultiItemEditStruct->nItemNum]-1;
// get new active item
for (iActiveItem=0;iActiveItem<lpMultiItemEditStruct->nItemNum;iActiveItem++)
{
if (nCaretLine>=lpMultiItemEditStruct->nItemStartLineList[iActiveItem]&&
nCaretLine<lpMultiItemEditStruct->nItemStartLineList[iActiveItem+1])
break;
}
// set active item is last item
if (iActiveItem>=lpMultiItemEditStruct->nItemNum) iActiveItem=lpMultiItemEditStruct->nItemNum-1;
nItemCaretLine=nCaretLine-lpMultiItemEditStruct->nItemStartLineList[iActiveItem];
// PostMessage(lpMultiItemEditStruct->hItemWndList[iActiveItem],EM_SETCARETPOS,nItemCaretLine,xPos);
// SetFocus(lpMultiItemEditStruct->hItemWndList[iActiveItem]);
// ShowCaret(lpMultiItemEditStruct->hItemWndList[iActiveItem]);
return TRUE;
}
*/
/**************************************************
声明:static int GetItemSequence(HWND hWnd,LPEDITITEM lpEditItem)
参数:
IN hWnd -- 窗口句柄
IN lpEditItem -- 指定编辑条目的结构指针
返回值:返回指定编辑条目的次序
功能描述:得到指定编辑条目的次序。
引用:
************************************************/
static int GetItemSequence(HWND hWnd,LPEDITITEM lpEditItem)
{
LPMULTIITEMEDITSTRUCT lpMultiItemEditStruct;
int i;
lpMultiItemEditStruct=(LPMULTIITEMEDITSTRUCT)GetWindowLong(hWnd,0); // 得到编辑窗口数据
if (lpMultiItemEditStruct==NULL) return 0;
for (i=0;i<lpMultiItemEditStruct->nItemNum;i++)
{ // 判断条目是否是指定条目
// if (hItemWnd==lpMultiItemEditStruct->hItemWndList[i]) break;
if (lpEditItem==&(lpMultiItemEditStruct->lpItemList[i])) break;
}
return i;
}
/**************************************************
声明:static int VScrollMultiItemEdit(HWND hWnd,int nScrollLine)
参数:
IN hWnd -- 窗口句柄
IN nScrollLine -- 滚动的行数
返回值:返回实际滚动的行数
功能描述:垂直滚动控件。
引用:
************************************************/
static int VScrollMultiItemEdit(HWND hWnd,int nScrollLine)
{
LPMULTIITEMEDITSTRUCT lpMultiItemEditStruct;
int i,iRealScrollLines;
int nTextHeight,nNewStartPos;
int nPageLine,nOldDisplayLine;
// RECT rcRedraw;
// LPEDITITEM lpActiveEditItem;
lpMultiItemEditStruct=(LPMULTIITEMEDITSTRUCT)GetWindowLong(hWnd,0); // 得到编辑窗口数据
if (lpMultiItemEditStruct==NULL) return 0;
nPageLine=GetPageLine(hWnd); // 得到一页的行数
if (nScrollLine==0) return 0;
if (nScrollLine>0)
{ // 往下滚
if ((lpMultiItemEditStruct->nDisplayLine+nPageLine)>=lpMultiItemEditStruct->nItemStartLineList[lpMultiItemEditStruct->nItemNum])
return 0;
}
if (nScrollLine<0)
{ // 往上滚
if (lpMultiItemEditStruct->nDisplayLine==0)
return 0;
}
nOldDisplayLine=lpMultiItemEditStruct->nDisplayLine; // 显示行
lpMultiItemEditStruct->nDisplayLine+=nScrollLine; // 设定新的显示行
nPageLine=GetPageLine(hWnd);
if ((lpMultiItemEditStruct->nDisplayLine+nPageLine)>lpMultiItemEditStruct->nItemStartLineList[lpMultiItemEditStruct->nItemNum])
lpMultiItemEditStruct->nDisplayLine=lpMultiItemEditStruct->nItemStartLineList[lpMultiItemEditStruct->nItemNum]-nPageLine;
if (lpMultiItemEditStruct->nDisplayLine<0)
lpMultiItemEditStruct->nDisplayLine=0;
nTextHeight=GetTextHeight(hWnd); // 得到文本高度
iRealScrollLines=(lpMultiItemEditStruct->nDisplayLine-nOldDisplayLine); // 得到实际滚动行数
// GetClientRect(hWnd,&rcRedraw);
for (i=0;i<lpMultiItemEditStruct->nItemNum;i++)
{ // 设定条目的新的开始位置
nNewStartPos=(lpMultiItemEditStruct->nItemStartLineList[i]-lpMultiItemEditStruct->nDisplayLine)*nTextHeight;
lpMultiItemEditStruct->lpItemList[i].iStartPos=nNewStartPos;
// SetWindowPos(lpMultiItemEditStruct->hItemWndList[i],0,0,nNewStartPos,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOREDRAW);
// InvalidateRect(lpMultiItemEditStruct->hItemWndList[i],NULL,TRUE);
}
// lpMultiItemEditStruct->nContextBottomPos+=nScrollLine*nTextHeight;
InvalidateRect(hWnd,NULL,TRUE); // 无效窗口
lpMultiItemEditStruct->nContextBottomPos=(lpMultiItemEditStruct->nItemStartLineList[lpMultiItemEditStruct->nItemNum]-lpMultiItemEditStruct->nDisplayLine)*nTextHeight;
// ClearBottomBlankArea(hWnd);
SetMIEditVScrollPos(hWnd,lpMultiItemEditStruct->nDisplayLine); // 设置滚动条
// lpActiveEditItem=&lpMultiItemEditStruct->lpItemList[lpMultiItemEditStruct->iActiveItem];
SetPDACaret(hWnd); // 设置光标
return (int)iRealScrollLines;
}
/**************************************************
声明:static void HScrollMultiItemEdit(HWND hWnd,int xScrollPos)
参数:
IN hWnd -- 窗口句柄
IN xScrollPos -- 滚动的点数
返回值:无
功能描述:水平滚动控件。
引用:
************************************************/
static void HScrollMultiItemEdit(HWND hWnd,int xScrollPos)
{
LPMULTIITEMEDITSTRUCT lpMultiItemEditStruct;
lpMultiItemEditStruct=(LPMULTIITEMEDITSTRUCT)GetWindowLong(hWnd,0); // 得到编辑窗口数据
if (lpMultiItemEditStruct==NULL) return;
lpMultiItemEditStruct->xDisplayPos+=xScrollPos; // 滚动后新位置
if (lpMultiItemEditStruct->xDisplayPos<0) lpMultiItemEditStruct->xDisplayPos=0;;
SetMIEditHScrollPos(hWnd,(int)((lpMultiItemEditStruct->xDisplayPos)/HSCROLLWIDTH)); // 滚动屏幕
}
/**************************************************
声明:static BOOL AdjustCaretPosition(HWND hWnd)
参数:
IN hWnd -- 窗口句柄
返回值:无
功能描述:调整光标到可见区域。
引用:
************************************************/
static BOOL AdjustCaretPosition(HWND hWnd)
{
LPMULTIITEMEDITSTRUCT lpMultiItemEditStruct;
int nScrollLine,nPageLine;
// RECT rcClientRect;
int nCaretLine;
BOOL bResult=FALSE;
LPEDITITEM lpActiveEditItem;
lpMultiItemEditStruct=(LPMULTIITEMEDITSTRUCT)GetWindowLong(hWnd,0); // 得到编辑窗口数据
if (lpMultiItemEditStruct==NULL) return FALSE;
if (lpMultiItemEditStruct->nItemNum==0) return FALSE; // 没有条目
lpActiveEditItem=&lpMultiItemEditStruct->lpItemList[lpMultiItemEditStruct->iActiveItem]; // 得到激活条目
AdjustCaretInEditItem(hWnd,lpActiveEditItem); // 调整激活条目的光标位置
// nTextHeight=GetTextHeight(hWnd);
// GetClientRect(hWnd,&rcClientRect);
// nPageLine=rcClientRect.bottom/nTextHeight;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -