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

📄 listedit.c

📁 在uc_GUI中增加的列表编辑框list_edit源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
        break;
      }
      // Make sure that we draw only when row is in drawing area 
      if (yPos >= ClipRect.y0) {
        GUI_DrawHLine(yPos, ClipRect.x0, ClipRect.x1);
      }
    }
	{
		int tmpposx=0,l=0;
		for(l=0;l<pObj->ScrollStateH.v;l++)
		{
			tmpposx += HEADER_GetItemWidth(pObj->hHeader,l);
		}			
		xPos = EffectSize - tmpposx;
	}
//    xPos = EffectSize - pObj->ScrollStateH.v;
   // for (i = 0; i < NumColumns; i++) {
	 for (i = 0; i < EndCol; i++) {
      xPos += HEADER_GetItemWidth(pObj->hHeader, i);
      // Break when all other columns are outside the drawing area 
      if (xPos > ClipRect.x1) {
        break;
      }
      // Make sure that we draw only when column is in drawing area 
      if (xPos >= ClipRect.x0) {
        GUI_DrawVLine(xPos, ClipRect.y0, ClipRect.y1);
      }
    }
  }
  // Draw the effect 
  WIDGET__EFFECT_DrawDown(&pObj->Widget);
  //*/
}

/*********************************************************************
*
*       LISTEDIT__InvalidateInsideArea
*/
void LISTEDIT__InvalidateInsideArea(LISTEDIT_Handle hObj, LISTEDIT_Obj* pObj) {
  GUI_RECT Rect;
  int HeaderHeight;
  HeaderHeight = HEADER_GetHeight(pObj->hHeader);
  WM_GetInsideRectExScrollbar(hObj, &Rect);
  Rect.y0 += HeaderHeight;
  WM_InvalidateRect(hObj, &Rect);
}

/*********************************************************************
*
*       LISTEDIT__InvalidateRow
*/
void LISTEDIT__InvalidateRow(LISTEDIT_Handle hObj, LISTEDIT_Obj* pObj, int Sel) {
  if (Sel >= 0) {
    GUI_RECT Rect;
    int HeaderHeight, RowDistY;
    HeaderHeight = HEADER_GetHeight(pObj->hHeader);
    RowDistY     = LISTEDIT__GetRowDistY(pObj);
    WM_GetInsideRectExScrollbar(hObj, &Rect);
    Rect.y0 += HeaderHeight + (Sel - pObj->ScrollStateV.v) * RowDistY;
    Rect.y1  = Rect.y0 + RowDistY - 1;
    WM_InvalidateRect(hObj, &Rect);
  }
}

/*********************************************************************
*
*       LISTEDIT__InvalidateCol
*/
void LISTEDIT__InvalidateCol(LISTEDIT_Handle hObj, LISTEDIT_Obj* pObj, int ColSel) 
{
  if (ColSel >= 0) 
  {
    GUI_RECT Rect;
	int i=0;
    int HeaderHeight, RowDistY,ColDistX=0;
    HeaderHeight = HEADER_GetHeight(pObj->hHeader);
    RowDistY     = LISTEDIT__GetRowDistY(pObj);
	//ColDistX	 = LISTEDIT__GetColDistX(pObj,ColSel);
    WM_GetInsideRectExScrollbar(hObj, &Rect);
    Rect.y0 += HeaderHeight + (pObj->RowSel - pObj->ScrollStateV.v) * RowDistY;
    Rect.y1  = Rect.y0 + RowDistY - 1;
	//for(i=0;i<pObj->ColSel-pObj->ScrollStateH.v;i++)
	for(i=0;i<ColSel-pObj->ScrollStateH.v;i++)
	{
		ColDistX+=LISTEDIT__GetColDistX(pObj,pObj->ScrollStateH.v+i);
	}
	Rect.x0 = ColDistX+pObj->Widget.pEffect->EffectSize;;
	Rect.x1 = Rect.x0+LISTEDIT__GetColDistX(pObj,ColSel);
    WM_InvalidateRect(hObj, &Rect);
  }
}

/*********************************************************************
*
*       _SetSelFromPos
*/
static void _SetSelFromPos(LISTEDIT_Handle hObj, LISTEDIT_Obj* pObj, const GUI_PID_STATE* pState) 
{  
  GUI_RECT Rect;
  int x, y, HeaderHeight;
  HeaderHeight = HEADER_GetHeight(pObj->hHeader);
  WM_GetInsideRectExScrollbar(hObj, &Rect);
  x = pState->x - Rect.x0;
  y = pState->y - Rect.y0 - HeaderHeight;
  Rect.x1 -= Rect.x0;
  Rect.y1 -= Rect.y0;
  if ((x >= 0) && (x <= Rect.x1) && (y >= 0) && (y <= (Rect.y1 - HeaderHeight))) 
  {
    unsigned RowSel,ColSel;
	int i,colwidth=0;
    RowSel = (y / LISTEDIT__GetRowDistY(pObj)) + pObj->ScrollStateV.v;
    if (RowSel < GUI_ARRAY_GetNumItems(&pObj->RowArray)) 
	{
      LISTEDIT_SetRowSel(hObj, RowSel);
    }
	for(i=pObj->ScrollStateH.v;i<HEADER_GetNumItems(pObj->hHeader);i++)
	{
		colwidth+=HEADER_GetItemWidth(pObj->hHeader,i);
		if(colwidth>x)
			break;
	}
	ColSel = i;
	LISTEDIT_SetColSel(hObj, ColSel);
  }
}

/*********************************************************************
*
*       _NotifyOwner
*
* Purpose:
*   Notify owner of the window.
*   If no owner is registered, the parent is considered owner.
*/
static void _NotifyOwner(WM_HWIN hObj, int Notification) {
  WM_MESSAGE Msg = {0};
  WM_HWIN hOwner;
  LISTEDIT_Obj* pObj    = LISTEDIT_H2P(hObj);
  hOwner = pObj->hOwner ? pObj->hOwner : WM_GetParent(hObj);
  Msg.MsgId   = WM_NOTIFY_PARENT;
  Msg.Data.v  = Notification;
  Msg.hWin    = hObj;
  WM_SendMessage(hOwner, &Msg);
}

/*********************************************************************
*
*       _OnTouch
*/
static void _OnTouch(LISTEDIT_Handle hObj, LISTEDIT_Obj* pObj, WM_MESSAGE*pMsg) {
  int Notification;
  const GUI_PID_STATE* pState = (const GUI_PID_STATE*)pMsg->Data.p;
  GUI_USE_PARA(pObj);
  if (pMsg->Data.p) {  /* Something happened in our area (pressed or released) */
    if (pState->Pressed) {
      _SetSelFromPos(hObj, pObj, pState);
      Notification = WM_NOTIFICATION_CLICKED;
      WM_SetFocus(hObj);
    } else {
      Notification = WM_NOTIFICATION_RELEASED;
    }
  } else {
    Notification = WM_NOTIFICATION_MOVED_OUT;
  }
  _NotifyOwner(hObj, Notification);
}

/*********************************************************************
*
*       _GetXSize
*
* Purpose:
*   Returns the width of the inside listview area.
*/
static int _GetXSize(LISTEDIT_Handle hObj) {
  GUI_RECT Rect;
  WM_GetInsideRectExScrollbar(hObj, &Rect);
  return Rect.x1 + 1;
}

/*********************************************************************
*
*       _GetHeaderWidth
*
* Purpose:
*   Returns the width of all items in header.
*
* Return value:
*   NumItems > 0:  width of all items.
*   NumItems = 0:  1 (to avoid problem with horizontal scrollbar)
*/
static int _GetHeaderWidth(LISTEDIT_Obj* pObj, HEADER_Handle hHeader) {
  int NumItems, i, r = 1;
  NumItems = HEADER_GetNumItems(hHeader);
  if (NumItems) {
    for (i = 0, r = 0; i < NumItems; i++) {
      r += HEADER_GetItemWidth(hHeader, i);
    }
  }
  if (pObj->ScrollStateH.v > (r - pObj->ScrollStateH.PageSize)) {
    r += pObj->ScrollStateH.PageSize - (r - pObj->ScrollStateH.v);
  }
  return r;
}

/*********************************************************************
*
*       LISTEDIT__UpdateScrollPos
*
* Purpose:
*   Checks whether if we must scroll up or scroll down to ensure
*   that selection is in the visible area. This function also
*   makes sure that scroll positions are in valid ranges.
*
* Return value:
*   Difference between old and new vertical scroll pos.
*/
int LISTEDIT__UpdateScrollPos(LISTEDIT_Handle hObj, LISTEDIT_Obj* pObj,int row) 
{ 
  if(row)
  {
	int PrevScrollStateV;
	PrevScrollStateV = pObj->ScrollStateV.v;
	if (pObj->RowSel >= 0) 
	{	
		WM_CheckScrollPos(&pObj->ScrollStateV, pObj->RowSel, 0, 0);
	}
	else 
	{
		WM_CheckScrollBounds(&pObj->ScrollStateV);
	} 
	{
		WM_CheckScrollBounds(&pObj->ScrollStateH);
	}
	WIDGET__SetScrollState(hObj, &pObj->ScrollStateV, &pObj->ScrollStateH);
	return pObj->ScrollStateV.v - PrevScrollStateV;
  }
  else
  {
	int PrevScrollStateH;
  	PrevScrollStateH = pObj->ScrollStateH.v;
	WM_CheckScrollBounds(&pObj->ScrollStateV);	 
	if (pObj->ColSel >= 0) 
	{	
		WM_CheckScrollPos(&pObj->ScrollStateH, pObj->ColSel, 0, 0);
	}
	else 
	{
		WM_CheckScrollBounds(&pObj->ScrollStateH);
	}
	WIDGET__SetScrollState(hObj, &pObj->ScrollStateV, &pObj->ScrollStateH);
	return pObj->ScrollStateH.v - PrevScrollStateH;
  }
}

/*********************************************************************
*
*       LISTEDIT__UpdateScrollParas
*
* Purpose:
*   Calculates number of items and page size of both vertical
*   and horizontal scrollbar. After this LISTEDIT__UpdateScrollPos will
*   be called to ensure scroll positions are in valid ranges.
*/
int LISTEDIT__UpdateScrollParas(LISTEDIT_Handle hObj, LISTEDIT_Obj* pObj) {
  int NumRows;
  NumRows = GUI_ARRAY_GetNumItems(&pObj->RowArray);
  /* update vertical scrollbar */
  pObj->ScrollStateV.PageSize = _GetNumVisibleRows(hObj, pObj);
  pObj->ScrollStateV.NumItems = (NumRows) ? NumRows : 1;
  /* update horizontal scrollbar */
  //pObj->ScrollStateH.PageSize = _GetXSize(hObj);  
  pObj->ScrollStateH.PageSize = _GetNumVisibleCols(hObj,pObj);  
  //pObj->ScrollStateH.NumItems = _GetHeaderWidth(pObj, pObj->hHeader);
  pObj->ScrollStateH.NumItems = HEADER_GetNumItems(pObj->hHeader);
  return LISTEDIT__UpdateScrollPos(hObj, pObj,1);
}

/*********************************************************************
*
*       _FreeAttached
*
* Purpose:
*   Delete attached objects (if any).
*/
static void _FreeAttached(LISTEDIT_Obj * pObj) {
  int i, j, NumRows, NumColumns;
  NumRows    = GUI_ARRAY_GetNumItems(&pObj->RowArray);
  NumColumns = GUI_ARRAY_GetNumItems(&pObj->AlignArray);
  for (i = 0; i < NumRows; i++) {
    GUI_ARRAY * pRow;
    pRow = (GUI_ARRAY *)GUI_ARRAY_GetpItem(&pObj->RowArray, i);
    /* Delete attached info items */
    for (j = 0; j < NumColumns; j++) {
      LISTEDIT_ITEM * pItem;
      pItem = (LISTEDIT_ITEM *)GUI_ARRAY_GetpItem(pRow, j);
      if (pItem->hItemInfo) {
        GUI_ALLOC_Free(pItem->hItemInfo);
      }
    }
    /* Delete row */
    GUI_ARRAY_Delete(pRow);
  }
  GUI_ARRAY_Delete(&pObj->AlignArray);
  GUI_ARRAY_Delete(&pObj->RowArray);
}

void  LISTEDIT_GetCurItemText(LISTEDIT_Handle hObj, const char * s)
{
	LISTEDIT_Obj* pObj;
   LISTEDIT_ITEM * pItem;
   GUI_ARRAY* pRow;  
   pObj = LISTEDIT_H2P(hObj);
   strcpy(s,pObj->CurString);
}
//void  LISTEDIT_GetItemText   (LISTEDIT_Handle hObj, unsigned Column, unsigned Row, const char * s);


/*********************************************************************
*
*       _AddKey
*
* Returns: 1 if Key has been consumed
*          0 else 
*/
int		firstflag=1;
static int _AddKey(LISTEDIT_Handle hObj, int Key) 
{
  LISTEDIT_Obj* pObj;
  LISTEDIT_ITEM * pItem;
  GUI_ARRAY* pRow;  
  pObj = LISTEDIT_H2P(hObj);
  switch (Key) 
  {
  case GUI_KEY_DOWN:
    LISTEDIT_IncRowSel(hObj);
	firstflag=1;
    return 1;               /* Key has been consumed */
  case GUI_KEY_UP:
    LISTEDIT_DecRowSel(hObj);
	firstflag=1;
    return 1;               /* Key has been consumed */
  case GUI_KEY_ENTER:
//	LISTEDIT_SetItemText(hObj,pObj->ColSel,pObj->RowSel,pObj->CurString);
//	LISTEDIT_IncColSel(hObj);
	firstflag=1;
	break;
  case GUI_KEY_RIGHT:  
    LISTEDIT_IncColSel(hObj);
	firstflag=1;
    return 1;               /* Key has been consumed */
  case GUI_KEY_LEFT:
    LISTEDIT_DecColSel(hObj);
	firstflag=1;
    return 1;               /* Key has been consumed */
  case '0':case '1':case '2':case '3':case '4':
  case '5':case '6':case '7':case '8':case '9':
  case '.':case '-':case 'h':case GUI_KEY_BACKSPACE:
	  {	
	    GUI_RECT rect;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -