📄 pplistbase.cpp
字号:
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 + -