📄 ppscrolllistlayouter.cpp
字号:
#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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -