ppscrolllistlayouter.cpp

来自「基于ARM平台的控制系统,自己带有MINIGUI,可以直接在VC下运行界面演示程」· C++ 代码 · 共 120 行

CPP
120
字号
#include "GUIpp.h"

#include "ppScrollListLayouter.h"

#if _USE_GUI == 1

void CScrollListLayouter::MoveSel(int nSingleStep)
{
	int	nWidth;
	int	nHeight;
	int 	nVisibleHeight = w_rc.GetHeight();
	int	nHeightToFirstVisible;
	switch(nSingleStep)
	{
	case 1:
		if(w_nSelectedItem<w_nItemCount-1)
			w_nSelectedItem++;
		break;
	case -1:
		if(w_nSelectedItem>0)
			w_nSelectedItem--;
		break;
	}
	///////////////////////

	if(w_nSelectedItem<w_nFirstVisibleItem)
	{
		w_nFirstVisibleItem = w_nSelectedItem;
		InvalidateTarget();
	}
	else
	{
		//判断选择项是否超出了当前下边界
		//如果是,按照w_nSelectedItem必须为最后
		//一项的标准求出w_nFirstVisibleItem
		
		nHeightToFirstVisible = 0;
		for(int i=w_nSelectedItem; i>=w_nFirstVisibleItem; i--)
		{
			MeasureTargetItem(i, nWidth, nHeight,(w_nSelectedItem == i));

			if(nHeightToFirstVisible+nHeight+w_nMargin > nVisibleHeight)
			{
				// if we take  w_nSelectedItem as the last visible item, then 
				// item i will partially-invisible,so (i+1) will be the first visible item
				w_nFirstVisibleItem = (i+1);
				InvalidateTarget();
				break;
			}
			else
			{
				nHeightToFirstVisible += nHeight + w_nMargin;
			}
		}
		
	}
	
}
void CScrollListLayouter::DoLayout()
{
	int	nTotalHeight;
	int 	nScrollPos;
	int	nYPos;
	int	nWidth;
	int	nHeight;
	int	bVisible;
	int 	nVisibleHeight = w_rc.GetHeight();
	
	CRect	rc;
	
	rc.w_nX1 = w_rc.w_nX1;
	rc.w_nX2 = w_rc.w_nX2;

	nTotalHeight = 0;
	nScrollPos = 0; 
	nYPos = 0;
	for(int i=0; i<w_nItemCount; i++)
	{
		MeasureTargetItem(i, nWidth, nHeight,(w_nSelectedItem == i));

		if(i>=w_nFirstVisibleItem)
		{
			//nScrollPos代表滚动第一可见项的位置
			rc.w_nY1 = w_rc.w_nY1 + nYPos;
			rc.w_nY2 = rc.w_nY1 + nHeight;
			
			
			if(nYPos >= 0 && nYPos + nHeight <= nVisibleHeight)
			{
				bVisible = 1;
				nYPos += nHeight + w_nMargin;
			}
			else
			{
				bVisible = 0;
			}
		}
		else
		{
			nScrollPos += nHeight + w_nMargin;
			bVisible = 0;
		}

		nTotalHeight += nHeight + w_nMargin;
		
		LayoutTargetItem(i,rc,bVisible,(w_nSelectedItem == i));
		
	}

	//nTotalHeight:	总高度
	//nVisibleHeight:	可见部分高度
	//nScrollPos:		滚动垂直位置
	//===============================
	//以上信息可以用来绘制滚动条
}



#endif

⌨️ 快捷键说明

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