⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multiple.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 5 页
字号:
{
    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 + -