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

📄 pplistbase.cpp

📁 基于ARM平台的控制系统,自己带有MINIGUI,可以直接在VC下运行界面演示程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	if ( nDisplayLines >=  w_nItemCount)
	{
		//一屏即可显示得下全部内容,显示涨满的滚动条
		nScrollBarLength = nTotalLength;
	}else{
		//分多屏显示,滚动条长度代表着显示内容占全部内容的比例
		nScrollBarLength =( nTotalLength *nDisplayLines ) / w_nItemCount;
	}
	//滚动条不能太小以致无法表现
	if (nScrollBarLength < LIST_MIN_SCROBALL_LEN)
	{
		nScrollBarLength = LIST_MIN_SCROBALL_LEN;
	}
	
	nTopIndex = GetItemIndex(w_pFirstVisibleItem);
	if(w_nItemCount!=0)
	{
		nPosition = rcBar.w_nY1+ 1 + (rcBar.GetHeight()) * nTopIndex / (w_nItemCount);
	}else{
		nPosition = rcBar.w_nY1;
	}
	

	if(nPosition + nScrollBarLength > rcBar.w_nY2)
	{
		nPosition = rcBar.w_nY2 - nScrollBarLength;
	}
	
	if( (w_style & 0xffff0000) == LIST_STYLE_SYMBIAN)
	{
		RectangleBlock(rcBar.w_nX2,rcBar.w_nY1,3 ,rcBar.GetHeight(),1);
		
		DrawVerticalLine(rcBar.w_nX2+1,rcBar.w_nY1,rcBar.GetHeight(),1);
		
		DrawVerticalLine(rcBar.w_nX1,rcBar.w_nY1,rcBar.GetHeight(),1);
		RectangleBlock(rcBar.w_nX1+1,nPosition,6,nScrollBarLength - 1 ,1);
		
		DrawVerticalLine(rcBar.w_nX1+1,nPosition ,
							nScrollBarLength -2,3);
		DrawVerticalLine(rcBar.w_nX1+4,nPosition + 1 ,
							nScrollBarLength -4,3);
		RectangleBlock(rcBar.w_nX1,nPosition + 1,3 ,nScrollBarLength - 4 ,1);
		RectangleBlock(rcBar.w_nX1,nPosition + 2,6 ,nScrollBarLength - 6 ,1);
	}else if( (w_style & 0xffff0000) == LSIT_STYLE_BLACKTITLE)
	{
		DrawVerticalLine(rcBar.w_nX1,rcBar.w_nY1,rcBar.GetHeight(),1);
		DrawVerticalLine(rcBar.w_nX1+ 1,nPosition , nScrollBarLength,1);
		DrawVerticalLine(rcBar.w_nX1+ 2,nPosition + 1 , nScrollBarLength - 2,1);
	}
	
}

void NANAListView::DrawListBoxTitle(NANARect rc)
{
	int i;
	
	rc.w_nX1 += LIST_FRAME_WIDTH + LIST_LEFT_MARGIN ;
	rc.w_nY1 += LIST_FRAME_WIDTH + LIST_TOP_MARGIN ; 
	
	for(i=0;i<w_nColumn;i++)
	{
		if( (w_style & 0xffff0000) == LSIT_STYLE_BLACKTITLE ) 
		{
			if(i == w_nColumn- 1)
			{
				RectangleBlock( rc.w_nX1,rc.w_nY1,
									rc.w_nX2 - rc.w_nX1 - LIST_CAPTION_RIGHT_MARGIN - LIST_CAPTION_LEFT_MARGIN,
									16 + LIST_CAPTION_TOP_MARGIN + LIST_CAPTION_BOTTOM_MARGIN,
									0);
			}else{
				RectangleBlock( rc.w_nX1,rc.w_nY1,
								w_ListHeader.w_pSubItems[i].w_nData + LIST_CAPTION_LEFT_MARGIN + LIST_CAPTION_RIGHT_MARGIN,
								16 + LIST_CAPTION_TOP_MARGIN + LIST_CAPTION_BOTTOM_MARGIN,
								0);	
			}
			TextPrint(w_ListHeader.w_pSubItems[i].w_strText,
					rc.w_nX1+ LIST_CAPTION_LEFT_MARGIN,
					rc.w_nY1+ LIST_CAPTION_TOP_MARGIN,
					w_ListHeader.w_pSubItems[i].w_Font,1);
			
		}
		else if( (w_style & 0xffff0000) == LIST_STYLE_SYMBIAN )
		{
			TextPrint(w_ListHeader.w_pSubItems[i].w_strText,
					rc.w_nX1 + LIST_CAPTION_LEFT_MARGIN,
					rc.w_nY1 + LIST_CAPTION_TOP_MARGIN,
					w_ListHeader.w_pSubItems[i].w_Font,0);
		}else{
			TextPrint(w_ListHeader.w_pSubItems[i].w_strText,
				rc.w_nX1 + LIST_CAPTION_LEFT_MARGIN,
				rc.w_nY1 + LIST_CAPTION_TOP_MARGIN,
				w_ListHeader.w_pSubItems[i].w_Font,0);
		}
		rc.w_nX1+= LIST_CAPTION_LEFT_MARGIN + LIST_CAPTION_RIGHT_MARGIN + 
				w_ListHeader.w_pSubItems[i].w_nData + LIST_COLUMN_MARGIN;
	}
}

// Draw box and display Item text.
void NANAListView::DrawListBoxLines(NANAListItem *pItem,NANARect rc)
{
	int i;
	int nStartX;
	int nStartY;
	int nWidth;
	int nHeight;
	int nSelFrameX;
	int nSelFrameY;
	int nSelWidth;
	int nSelHeight;
	char * strText;

	nStartX = rc.w_nX1;
	nStartY = rc.w_nY1;
	nWidth =  rc.w_nX2-rc.w_nX1;
	nHeight = rc.w_nY2-rc.w_nY1;

	RectangleBlock( nStartX,nStartY,nWidth,nHeight,1);
	
	if ( pItem == w_pSelectedItem )
	{
		nSelFrameX = nStartX;
		nSelFrameY =nStartY;
		nSelWidth = nWidth-1;
		nSelHeight = nHeight-1;
		if( (w_style & 0xffff0000) == LSIT_STYLE_BLACKTITLE )
		{
			RectFrame(nSelFrameX,nSelFrameY,
						nSelWidth,
						nSelHeight);
			DrawVerticalLine(nSelFrameX+nSelWidth,nSelFrameY+1,nSelHeight-2,1);
			DrawHorizontalLine(nSelFrameX+1,nSelFrameY+nSelHeight,nSelWidth-2,1);
		}else if( (w_style & 0xffff0000) == LIST_STYLE_SYMBIAN )
		{
			RectFrame(nSelFrameX,nSelFrameY,
						nSelWidth + LIST_RIGHT_LINE_WIDTH + LIST_RIGHT_LINE_MARGIN -1,
						nSelHeight);
			DrawVerticalLine(nSelFrameX+nSelWidth + LIST_RIGHT_LINE_WIDTH + 
										LIST_RIGHT_LINE_MARGIN -3,
								nSelFrameY+1,nSelHeight-2,1);
			DrawHorizontalLine(nSelFrameX+1,nSelFrameY+nSelHeight,
								nSelWidth + LIST_RIGHT_LINE_WIDTH + 
										LIST_RIGHT_LINE_MARGIN -2,
								1);
		}else{
			RectFrame(nSelFrameX,nSelFrameY,
				nSelWidth,
				nSelHeight);
			DrawVerticalLine(nSelFrameX+nSelWidth,nSelFrameY+1,nSelHeight-2,1);
			DrawHorizontalLine(nSelFrameX+1,nSelFrameY+nSelHeight,nSelWidth-2,1);
		}
		nStartY --;
		nStartX --;
	}
		
	nStartY += LIST_SELECT_TOP_WIDTH + LIST_TOP_TO_SELECT_MARGIN;
	//display item texts
	for( i = 0 ;i < w_nColumn; i++)
	{
		strText = pItem->w_pSubItems[i].w_strText;
		if (i == 0)
		{
			TextPrint( strText,
					nStartX + LIST_SELECT_LEFT_WIDTH + LIST_LEFT_TO_SELECT_MARGIN,
					nStartY,
					pItem->w_pSubItems[i].w_Font,0);
		}else
		{
			TextPrint(strText,
					nStartX,
					nStartY,
					pItem->w_pSubItems[i].w_Font,0);
		}
		nStartX += 	w_ListHeader.w_pSubItems[i].w_nData
					+ LIST_COLUMN_MARGIN + LIST_CAPTION_LEFT_MARGIN + LIST_CAPTION_RIGHT_MARGIN;
	}
	
}


void NANAListView::CreateWnd(NANAWnd * pParentWnd,
					int nX1,int nY1,
					int nWidth,int nHeight,
					int nStyle,
					int nExtendedStyle,
					NANA_FONT font)
{
	w_style = nExtendedStyle;

	w_Font = font;

	for(int i=0;i<w_nColumn;i++)
	{
		w_ListHeader.SetItemFont(i,font);
	}

	//创建窗体
	NANAWnd::CreateWnd(pParentWnd,nX1, nY1, nWidth,nHeight,nStyle);

    w_btnScrollUp.CreateWnd(this,nX1+nWidth-20,nY1+30,20,20);
    w_btnScrollUp.SetCaption("A");
    w_btnScrollDown.CreateWnd(this,nX1+nWidth-20,nY1+nHeight-20,20,20);
    w_btnScrollDown.SetCaption("V");
}
void NANAListView::OnNotify(NANAWnd *pSrcWnd,int nMessageCode,int param1,int param2)
{
    if(pSrcWnd == &w_btnScrollUp)
    {
        this->MoveSelection(-1);
    }
    if(pSrcWnd == &w_btnScrollDown)
    {
        this->MoveSelection(1);
    }
}
void NANAListView::SetColumnCaption(int nColumn,const char *strCaption) 
{
	w_ListHeader.SetSubItemText(nColumn, strCaption);
}
void NANAListView::SetColumnWidth(int nColumn,float fPercentage)
{
	//w_ListHeader的ItemData专门用于存储列宽度
	NANARect rc;
	GetWindowRect(&rc);
	w_ListHeader.SetItemData(nColumn, rc.GetWidth()*fPercentage);
}
NANAListItem * NANAListView::MoveSelection(int nStep)
{
	NANAListItem *pItem;
	int nVisibleDis;

	if(w_pSelectedItem ==  &w_ListTail || w_pSelectedItem == &w_ListHeader)
	{
		return NULL;
	}
	
	nVisibleDis = w_pFirstVisibleItem->GetStepsTo(w_pSelectedItem);
	
	if( INVALID_DISTANCE == nVisibleDis )
	{
		return NULL;
	}
	
	if(nStep>0)
	{
		pItem = (NANAListItem *)w_pSelectedItem->GetNextNode(nStep);
	}
	else
	{
		pItem = (NANAListItem *)w_pSelectedItem->GetPrevNode(-nStep);	
	}
	
	if(pItem != &w_ListTail && pItem != &w_ListHeader)
	{
		
		nVisibleDis += nStep;
		
		w_pSelectedItem = pItem;
	
		if( nVisibleDis >= GetDisplayLineCount() )
		{
			w_pFirstVisibleItem = (NANAListItem *)w_pFirstVisibleItem->GetNextNode(1);
		}
		if( nVisibleDis<0 )
		{
			w_pFirstVisibleItem = w_pSelectedItem;
		}
	}
    SetUIDirty(1);
	return w_pSelectedItem;
}
void NANAListView::OnPaint()
{
	NANARect rc;
	NANARect LineRC;
	int nHeight;
    int nDisplayLines;
    int nTopIndex;
    //计算第一个显示项
    nTopIndex = GetItemIndex(w_pFirstVisibleItem);
    //计算可见行数
    nDisplayLines = GetDisplayLineCount();
    
	GetWindowRect(&rc);

	if (w_style & LIST_STYLE_THIN_FRAME)
	{
		RectFrame(rc.w_nX1,rc.w_nY1,rc.GetWidth(),rc.GetHeight());
	}

	if(w_style & LIST_STYLE_THICK_FRAME)
	{
		RectFrame(rc.w_nX1,rc.w_nY1,rc.GetWidth(),rc.GetHeight());
		RectFrame(rc.w_nX1+1,rc.w_nY1+1,rc.GetWidth()-2,rc.GetHeight()-2);
	}
	
	LineRC.w_nX1 = rc.w_nX2- LIST_SCROLL_WIDTH - LIST_FRAME_WIDTH;
	LineRC.w_nX2= rc.w_nX2 - LIST_FRAME_WIDTH;
	LineRC.w_nY1= rc.w_nY1 + LIST_FRAME_WIDTH + LIST_TOP_MARGIN + 
					LIST_CAPTION_TOP_MARGIN + 16 + LIST_CAPTION_TEXT_MARGIN;
	LineRC.w_nY2= rc.w_nY2 - LIST_FRAME_WIDTH;
	
	Draw_ScrollBar(LineRC);

	DrawListBoxTitle(rc);
	
	if ((w_style & 0xffff0000) == LSIT_STYLE_BLACKTITLE )
	{
		LineRC.w_nX1= rc.w_nX1+ LIST_FRAME_WIDTH + LIST_LEFT_MARGIN;
		LineRC.w_nY1= rc.w_nY1+ LIST_FRAME_WIDTH + LIST_TOP_MARGIN + 
					LIST_CAPTION_TOP_MARGIN + LIST_CAPTION_BOTTOM_MARGIN + 
					LIST_CAPTION_TEXT_MARGIN + 16;
		LineRC.w_nX2= rc.w_nX2- LIST_SCROLL_WIDTH - LIST_FRAME_WIDTH - LIST_RIGHT_MARGIN;
		LineRC.w_nY2= LineRC.w_nY1+ LIST_SELECT_TOP_WIDTH + LIST_SELECT_BOTTOM_WIDTH + 
						LIST_TOP_TO_SELECT_MARGIN + LIST_BOTTOM_TO_SELECT_MARGIN + 16;
	
	}else if ((w_style & 0xffff0000) == LIST_STYLE_SYMBIAN )
	{
		DrawHorizontalLine(rc.w_nX1,rc.w_nY1+ LIST_FRAME_WIDTH	+  
							LIST_TOP_MARGIN + LIST_CAPTION_TOP_MARGIN + 16 +
							LIST_CAPTION_BOTTOM_MARGIN - 1,
							rc.w_nX2- rc.w_nX1- LIST_SCROLL_WIDTH,1);
		DrawVerticalLine  (rc.w_nX2- LIST_FRAME_WIDTH - LIST_SYMBIAN_SCROLL_WIDTH -
								LIST_RIGHT_LINE_MARGIN - LIST_RIGHT_LINE_WIDTH,
							rc.w_nY1+ LIST_FRAME_WIDTH	+  
								LIST_TOP_MARGIN + LIST_CAPTION_TOP_MARGIN + 16 +
								LIST_CAPTION_BOTTOM_MARGIN - 1,
							rc.w_nY2- rc.w_nY1- (LIST_FRAME_WIDTH + LIST_TOP_MARGIN + 
								LIST_CAPTION_TOP_MARGIN  + 16 +
								LIST_CAPTION_BOTTOM_MARGIN + LIST_FRAME_WIDTH),
							LIST_RIGHT_LINE_WIDTH);
		
		LineRC.w_nX1= rc.w_nX1+ LIST_FRAME_WIDTH + LIST_LEFT_MARGIN;
		LineRC.w_nY1= rc.w_nY1+ LIST_FRAME_WIDTH + LIST_TOP_MARGIN + 
					LIST_CAPTION_TOP_MARGIN + LIST_CAPTION_BOTTOM_MARGIN + 
					LIST_CAPTION_TEXT_MARGIN + 16;
		LineRC.w_nX2= rc.w_nX2- LIST_RIGHT_LINE_WIDTH - LIST_FRAME_WIDTH - 
						LIST_SYMBIAN_SCROLL_WIDTH - LIST_RIGHT_LINE_MARGIN;
		LineRC.w_nY2= LineRC.w_nY1+ LIST_SELECT_TOP_WIDTH + LIST_SELECT_BOTTOM_WIDTH + 
						LIST_TOP_TO_SELECT_MARGIN + LIST_BOTTOM_TO_SELECT_MARGIN + 16;
	}else{
		LineRC.w_nX1= rc.w_nX1+ LIST_FRAME_WIDTH + LIST_LEFT_MARGIN;
		LineRC.w_nY1= rc.w_nY1+ LIST_FRAME_WIDTH + LIST_TOP_MARGIN + 
			LIST_CAPTION_TOP_MARGIN + LIST_CAPTION_BOTTOM_MARGIN + 
			LIST_CAPTION_TEXT_MARGIN + 16;
		LineRC.w_nX2= rc.w_nX2- LIST_SCROLL_WIDTH - LIST_FRAME_WIDTH - LIST_RIGHT_MARGIN;
		LineRC.w_nY2= LineRC.w_nY1+ LIST_SELECT_TOP_WIDTH + LIST_SELECT_BOTTOM_WIDTH + 
			LIST_TOP_TO_SELECT_MARGIN + LIST_BOTTOM_TO_SELECT_MARGIN + 16;
	}
	
	nHeight = LineRC.GetHeight();
    NANAListItem *pItem = (NANAListItem *)w_ListHeader.GetNextNode(1);
    while (pItem!=&w_ListTail) {
        pItem->DeleteText();
        pItem = (NANAListItem *)pItem->GetNextNode(1);
    }
    pItem = w_pFirstVisibleItem;
	while ((pItem != &w_ListHeader) && (pItem != &w_ListTail) && (LineRC.w_nY2<rc.w_nY2))
	{
        pItem->SetItemText();
		DrawListBoxLines(pItem,LineRC);
		
		LineRC.w_nY1 += nHeight; 
		LineRC.w_nY2 += nHeight;
		pItem = (NANAListItem *)pItem->GetNextNode(1);
	}
	
}

#endif

void NANAListBase::SetGrid(int nColumns, int nLines)
{

}



const char * TextItem::GetItemText(int nSubItem)
{
    DEBUG_Assert(nSubItem < w_nSubItemCnt );
    return w_pSubItems[nSubItem].w_strText;
}

⌨️ 快捷键说明

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