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

📄 pplistbase.cpp

📁 基于ARM平台的控制系统,自己带有MINIGUI,可以直接在VC下运行界面演示程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include "GUIpp.h"

#include "ppListView.h"

#include "DateTime.h"

#if _USE_GUI == 1

NANAListItem::NANAListItem(NANAListBase * pParentView,int nColums)
{
	int 		i;
	w_pParentListView = pParentView;
	w_nSubItemCnt = nColums;
	w_pSubItems = (PSListSubItem)SafeMalloc(sizeof(SListSubItem)*nColums);
    w_pNodeData = NULL;
	for(i=0;i<w_nSubItemCnt;i++)
	{
		w_pSubItems[i].w_nData = 0;
		w_pSubItems[i].w_strText = NULL;
		w_pSubItems[i].w_nIcon = 0;
		w_pSubItems[i].w_Font = w_pParentListView->w_Font;
	}
}

void NANAListItem::DeleteText(void)
{
    int 		i;		
    if(w_nHaveText)
    {
        for(i=0;i<w_nSubItemCnt;i++)
        {
            if(w_pSubItems[i].w_strText)
            {
                SafeFree(w_pSubItems[i].w_strText);
                w_pSubItems[i].w_strText = NULL;
            }
        }
        w_nHaveText = 0;
    }
}

NANAListItem::~NANAListItem()
{
    DeleteText();
	SafeFree(w_pSubItems);
    w_pSubItems = NULL;
}


void NANAListItem::SetItemData(int nSubItem,int nData)
{
	DEBUG_Assert(nSubItem < w_nSubItemCnt );
	
	w_pSubItems[nSubItem].w_nData = nData;
}
void NANAListItem::SetSubItemText(int nSubItem,const char *strText)
{
	DEBUG_Assert(nSubItem < w_nSubItemCnt );

	if(w_pSubItems[nSubItem].w_strText)
	{
		SafeFree(w_pSubItems[nSubItem].w_strText);
        w_pSubItems[nSubItem].w_strText = NULL;
	}
	w_pSubItems[nSubItem].w_strText = (char *)SafeMalloc(strlen(strText) +  1);
	strcpy(w_pSubItems[nSubItem].w_strText,strText);
    w_pSubItems[nSubItem].w_Font = &NANA_FONT12;
	w_pParentListView->SetUIDirty(1);
}

void NANAListItem::SetItemIcon(int nSubItem,int nIcon)
{
	DEBUG_Assert(nSubItem < w_nSubItemCnt );
	
	w_pSubItems[nSubItem].w_nIcon = nIcon;

	w_pParentListView->SetUIDirty(1);
}
void NANAListItem::SetItemFont(int nSubItem, NANA_FONT font)
{
	DEBUG_Assert(nSubItem < w_nSubItemCnt );
	
	w_pSubItems[nSubItem].w_Font = font;

	w_pParentListView->SetUIDirty(1);
}

void NANAListItem::SetItemText(void)
{
    char caMessage[100];
    int j;
    for(j=0;j<w_nSubItemCnt;j++)
    {
        SetSubItemText(j,w_pNodeData->GetNodeDataFieldString(j,caMessage,sizeof(caMessage)));
    }
    w_nHaveText = 1;
};

//////////////////////////////////////////////////////////////////////////

int NANAListBase::GetItemIndex(NANAListItem *pItem)
{
	DEBUG_Assert(pItem->w_pParentListView == this);
	return (w_ListHeader.GetStepsTo(pItem)) - 1;
}
NANAListItem * NANAListBase::NewItem(void)
{
	NANAListItem *pNewItem = new NANAListItem(this,w_nColumn);
	w_ListTail.InsertBefore(pNewItem);
	w_nItemCount ++;
	return pNewItem;
}
NANAListItem * NANAListBase::GetItem(int nItem)
{
	//第一个node是w_ListHeader本身,因此第一个数据项是
	//nItem+1
	return (NANAListItem*)w_ListHeader.GetNextNode(nItem+1);
}
void NANAListBase::DeleteItem(NANAListItem * pItem)
{
	if(pItem == NULL)
	{
		return;
	}
	DEBUG_Assert(pItem->w_pParentListView == this);

	pItem->RemoveMe();
	w_nItemCount--;

	
	delete pItem;
    pItem = NULL;
}
//////////////////////////////////////////////////
NANAIconList::NANAIconList(int nColums):NANAListBase(nColums)
{
	w_itemSelected = NULL;
}
void NANAIconList::DrawItem(int x,int y,int width,int height,NANAListItem * pitem,int bSelected,int bHighlight)
{
	int t_width,t_height;
	int t_x,t_y;
	int i_x,i_y;
	const char * strText = pitem->GetItemText(0);

	//get the required size of text
	TextBlockPrint(strText,0,0,&t_width,&t_height,
					pitem->w_pSubItems[0].w_Font,0,ALIGN_MIDDLE,1,1);
	//plus require size of icon
	ICON * picon = GetIcon(pitem->w_pSubItems[0].w_nIcon);
	i_x = x + (width - (picon->width))/2;
	t_x = x + (width - (t_width))/2;
	i_y = y + (height - t_height - picon->height - 6)/2;
	t_y = i_y + picon->height + 3;


	if(bHighlight)
	{
		RectFill(x+1,y+1,x+width,y+height-1,COLOR_BORDER);
		TextBlockPrint(strText,t_x,t_y,&t_width,&t_height,
			pitem->w_pSubItems[0].w_Font,1,ALIGN_MIDDLE,1,0);
		DrawICON(pitem->w_pSubItems[0].w_nIcon,i_x,i_y,1);
	}else
	{
		RectFill(x+1,y+1,x+width,y+height-1,COLOR_BKGROUND);
		TextBlockPrint(strText,t_x,t_y,&t_width,&t_height,
			pitem->w_pSubItems[0].w_Font,0,ALIGN_MIDDLE,1,0);
		DrawICON(pitem->w_pSubItems[0].w_nIcon,i_x,i_y,0);
	}

	if(bSelected)
	{
		RectLine(x,y,x+width-1,y+height-1,COLOR_BORDER);
	}else{
		RectLine(x,y,x+width-1,y+height-1,COLOR_BKGROUND);
	}
	
}
void NANAIconList::SetItemSize(int width,int height)
{
	w_itemWidth = width;
	w_itemHeight = height;
}
void NANAIconList::OnPaint()
{
	int x,y;
	NANARect rc;
    

	GetWindowRect(&rc);

	x = rc.w_nX1;
	y = rc.w_nY1;

	NANAListItem *pItem = (NANAListItem *)w_ListHeader.GetNextNode(1);
	while ((pItem != &w_ListTail) && y<rc.w_nY2)
	{
		if(x+w_itemWidth >= rc.w_nX2)
		{
			y += w_itemHeight;
			x = rc.w_nX1;
		}	
		DrawItem(x,y,w_itemWidth,w_itemHeight,pItem,(w_itemSelected == pItem),0);
		x += w_itemWidth;
		pItem = (NANAListItem *)pItem->GetNextNode(1);
	}
}
void NANAIconList::OnMouseDown(int x,int y)
{
	int x_item,y_item;
	NANARect rc;
	GetWindowRect(&rc);
	x_item = rc.w_nX1;
	y_item = rc.w_nY1;
	NANAListItem *pItem = (NANAListItem *)w_ListHeader.GetNextNode(1);
	NANAListItem *pItemOrgSel = w_itemSelected;
	while ((pItem != &w_ListTail) && y_item<rc.w_nY2)
	{
		if(x_item+w_itemWidth >= rc.w_nX2)
		{
			y_item += w_itemHeight;
			x_item = rc.w_nX1;
		}
		if(x>x_item && x<x_item + w_itemWidth && y>y_item && y<y_item+w_itemHeight)
		{
			w_itemSelected = pItem;
			DrawItem(x_item,y_item,w_itemWidth,w_itemHeight,pItem,1,1);
		}
		else
		if(pItemOrgSel == pItem)
		{
			//clear old selected Item's apperance
			DrawItem(x_item,y_item,w_itemWidth,w_itemHeight,pItem,0,0);
		}
		x_item += w_itemWidth;
		pItem = (NANAListItem *)pItem->GetNextNode(1);
	}
	GHAL_RefreshAll();
}
void NANAIconList::OnMouseUp(int x,int y)
{
	int x_item,y_item;
	NANARect rc;
	GetWindowRect(&rc);
	x_item = rc.w_nX1;
	y_item = rc.w_nY1;
	NANAListItem *pItem = (NANAListItem *)w_ListHeader.GetNextNode(1);
	while ((pItem != &w_ListTail) && y_item<rc.w_nY2)
	{
		if(x_item+w_itemWidth >= rc.w_nX2)
		{
			y_item += w_itemHeight;
			x_item = rc.w_nX1;
		}
		if(	w_itemSelected == pItem )
		{
			//
			DrawItem(x_item,y_item,w_itemWidth,w_itemHeight,pItem,1,0);
			if(x>x_item && y>y_item && x<x_item+w_itemWidth && y<y_item+w_itemHeight)
			{
				NotifyWindow(GetParentWnd(),UGNC_CLICK,pItem->w_pSubItems[0].w_nData,(unsigned int)pItem);
			}
			break;
		}
		x_item += w_itemWidth;
		pItem = (NANAListItem *)pItem->GetNextNode(1);
	}
	GHAL_RefreshAll();
}

NANAListView::NANAListView(int nColumn,CLinkList * pLinkList):NANAListBase(nColumn)
{
    int i,j;
    NANAListItem * pItem;
    CLinkListNode * pNodeData;
	w_pSelectedItem = &w_ListHeader;
	w_pFirstVisibleItem = &w_ListHeader;
    w_pLinkList = pLinkList;
    for(i=0;i< (w_pLinkList->GetNodeNumber());i++)
    {
        pItem = NewItem();
        pNodeData = w_pLinkList->GetLinkListNode(i);
        pItem->w_pNodeData = pNodeData;
    }
}

NANAListView::~NANAListView()
{
	NANAListItem *pItem;
	
	pItem = GetItem(0);
	while(pItem != &w_ListTail)
	{
		pItem->RemoveMe();
		delete pItem;
		pItem = GetItem(0);
	}
}
NANAListItem * NANAListView::NewItem(void)
{
	NANAListItem *pNewItem = NANAListBase::NewItem();
	if(w_pFirstVisibleItem == &w_ListHeader)
	{
		w_pFirstVisibleItem = pNewItem;
	}
	if(w_pSelectedItem ==  &w_ListTail || w_pSelectedItem == &w_ListHeader)
	{
		w_pSelectedItem = pNewItem;
	}
	SetUIDirty(1);
	return pNewItem;
}

void NANAListView::DeleteItem(NANAListItem * pItem)
{
	if(pItem == NULL)
	{
		return;
	}
	DEBUG_Assert(pItem->w_pParentListView == this);
	
	if(w_pSelectedItem == pItem)
	{
		w_pSelectedItem = (NANAListItem*)pItem->GetNextNode(1);
		if(w_pSelectedItem == &w_ListTail)
		{
			w_pSelectedItem  = (NANAListItem*)pItem->GetPrevNode(1);
		}
	}
	if(w_pFirstVisibleItem == pItem)
	{
		w_pFirstVisibleItem = (NANAListItem*)pItem->GetNextNode(1);
		if(w_pFirstVisibleItem == &w_ListTail)
		{
			w_pFirstVisibleItem  = (NANAListItem*)pItem->GetPrevNode(1);
		}
	}
	NANAListBase::DeleteItem(pItem);
	SetUIDirty(1);
}

void NANAListView::SelectItem(NANAListItem *pItem)
{
	DEBUG_Assert(pItem->w_pParentListView == this);
	if(w_pSelectedItem != pItem)
	{
		w_pSelectedItem = pItem;
		SetUIDirty(1);
	}
}
NANAListItem * NANAListView::GetSelectedItem(void)
{
	if(w_pSelectedItem == &w_ListHeader)
	{
		return NULL;
	}
	return w_pSelectedItem;
}

int NANAListView::GetDisplayLineCount(void)
{
	int nLineHeight;
	NANARect rc;
	GetWindowRect(&rc);
	nLineHeight = LIST_SELECT_TOP_WIDTH + LIST_SELECT_BOTTOM_WIDTH + 
			LIST_TOP_TO_SELECT_MARGIN + LIST_BOTTOM_TO_SELECT_MARGIN +
			16;	
	return (rc.GetHeight()-LIST_FRAME_WIDTH - LIST_TOP_MARGIN - 
					LIST_CAPTION_TOP_MARGIN - LIST_CAPTION_BOTTOM_MARGIN - 
					LIST_CAPTION_TEXT_MARGIN - 16)/nLineHeight;
	
}
void NANAListView::Draw_ScrollBar(NANARect rcBar)
{
	int nPosition;
	int nTopIndex;
	int nScrollBarLength;
	int nTotalLength;
	int nDisplayLines;
	nTotalLength = rcBar.GetHeight() - 1;

	//计算可见行数
	nDisplayLines = GetDisplayLineCount();
	

⌨️ 快捷键说明

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