📄 strlrview.c
字号:
#include "StrLrView.h"
#ifdef _WIN32
#include "stdafx.h"
#else
#include <main_task.h>
#include <osg.h>
#endif
#ifndef NULL
#define NULL 0
#endif
void DrawLrArrow(pLRVIEW pview ,int leftenable)/*left == 1:左箭头 left==0:右箭头*/
{
int left,top;
#ifdef _WIN32
CDC *dc = AfxGetApp()->GetMainWnd()->GetDC();
dc->SetBkMode(0);
if(leftenable)
{
left = pview->localx + 10;
top = pview->localy + pview->high / 2 - 10;
dc->TextOut(left,top,"<---");
} else
{
left = pview->localx + pview->width - LR_CELL_WIDTH / 2 + 10;
top = pview->localy + pview->high / 2 - 10;
dc->TextOut(left,top,"--->");
}
AfxGetApp()->GetMainWnd()->ReleaseDC(dc);
#else
if(leftenable)
{
left = pview->localx ;
top = pview->localy + pview->high / 2 - 10;
/* dc->TextOut(left,top,"<---");*/
FNTDrawText(Colors_thkblue1,1,left,top ,"<---");
} else
{
left = pview->localx + pview->width - LR_CELL_WIDTH / 2 ;
top = pview->localy + pview->high / 2 - 10;
/*dc->TextOut(left,top,"--->");*/
FNTDrawText(Colors_thkblue1,1,left,top ,"--->");
}
#endif
}
void DrawLrArows(pLRVIEW pview)
{
if(pview->cellnum <= pview->ospnum)/*两个箭头都不画*/
{
return ;
}
if(pview->cellnum > pview->ospnum && pview->baseindex == 0)/*只画右箭头*/
{
/*擦去左箭头*/
/*画右箭头*/
DrawLrArrow(pview,0);
return;
}
if(pview->cellnum > pview->ospnum && pview->baseindex > 0
&&(pview->cellnum - pview->baseindex) >pview->ospnum)/*画双箭头箭头*/
{
/*画左箭头*/
DrawLrArrow(pview,0);
DrawLrArrow(pview,1);
return;
}
if(pview->cellnum > pview->ospnum && pview->baseindex > 0
&&(pview->cellnum - pview->baseindex) <=pview->ospnum)/*只画左箭头*/
{
/*擦去右箭头*/
/*画左箭头*/
DrawLrArrow(pview,1);
return;
}
}
void DrawLrText(void *tp,int x,int y ,int index,int color)
{
pLRVIEW pview = (pLRVIEW )tp;
char *p = GetLrListData(pview,index);
#ifdef _WIN32
CDC *dc = AfxGetApp()->GetMainWnd()->GetDC();
dc->SetBkMode(0);
dc->SetTextColor(color);
if(p)
dc->TextOut(x,y,p);
AfxGetApp()->GetMainWnd()->ReleaseDC(dc);
#else
#endif
}
void DrawLrCell(void *p,int x,int y,int right,int bottom,int index,int color)
{
pLRVIEW pview = (pLRVIEW )p;
if(pview->locked || pview->cellnum <=0 ) return ;
#ifdef _WIN32
CDC *dc = AfxGetApp()->GetMainWnd()->GetDC();
CBrush brush(color);
dc->SelectObject(brush);
dc->Rectangle(CRect(x,y,right,bottom));
if(index - pview->baseindex == pview->coursorx)
DrawLrText(pview,x,y , index,5);
else
DrawLrText(pview,x,y , index,0);
AfxGetApp()->GetMainWnd()->ReleaseDC(dc);
#else
#endif
}
void DrawLrFrame(pLRVIEW pview)
{
void (*DrawCellFunc)(void * ,int ,int ,int ,int ,int ,int );
if(pview->locked) return ;
if(pview->OwnerDrawCell)
DrawCellFunc = pview->OwnerDrawCell;
else
DrawCellFunc = DrawLrCell;
#ifdef _WIN32
CDC *dc = AfxGetApp()->GetMainWnd()->GetDC();
int drawstartx = pview->localx + LR_CELL_WIDTH / 2;
/*绘画框架*/
GFMDrawRectangle(pview->localx,pview->localy ,
pview->localx + pview->width,pview->localy + pview->high ,
3,1);
/*绘画单元*/
for(int i = 0 ;i < pview->ospnum;i++)
{
if( i == pview->coursorx)
(*DrawCellFunc)(pview,i * LR_CELL_WIDTH + drawstartx,pview->localy + pview->high /2 - LR_CELL_HIGH / 2,/* 焦点状态CELL*/
drawstartx + (i+1) * LR_CELL_WIDTH,pview->localy + pview->high /2 + LR_CELL_HIGH / 2,pview->baseindex + i,4);
else if(pview->baseindex + i >= pview->cellnum)/*消除不存再的单元画面*/
GFMDrawRectangle( i * LR_CELL_WIDTH + drawstartx,pview->localy + pview->high /2 - LR_CELL_HIGH / 2,/* 焦点状态CELL*/
drawstartx + (i+1) * LR_CELL_WIDTH,pview->localy + pview->high /2 + LR_CELL_HIGH / 2,4,1);
else
(*DrawCellFunc)(pview,i * LR_CELL_WIDTH + drawstartx,pview->localy + pview->high /2 - LR_CELL_HIGH / 2,/*一般状态CELL*/
drawstartx + (i+1) * LR_CELL_WIDTH,pview->localy + pview->high /2 + LR_CELL_HIGH / 2,pview->baseindex + i,5);
}
/*绘画指示箭头*/
if(!pview->locked)
DrawLrArows( pview);
AfxGetApp()->GetMainWnd()->ReleaseDC(dc);
#else
#endif
}
void ShowLrList( pLRVIEW pview)
{
if(pview->OwnerDrawFrame)
(*pview->OwnerDrawFrame)(pview);
else
DrawLrFrame(pview);
}
pLRVIEW CreateLrList(int x,int y,int width,int high,int itemnum,int ptrmode)/*prtmode:是否建立指针缓冲*/
{
pLRVIEW p = (pLRVIEW)malloc(sizeof(LRVIEW));
memset(p,0,sizeof(LRVIEW));
p->localx = x;
p->localy = y;
p->width = width;
p->high = high;
p->ospnum = p->width / LR_CELL_WIDTH - 1;
p->itemmode = ptrmode;
p->strlist = CreateStrList(itemnum);
/*p->locked = 1;/*NULL list have no focus*/
/* p->cellnum = 33;/*for test*/
if(!p->strlist)
{
free(p);
return NULL;
}
return p;
}
void DeleteLrList(pLRVIEW pview)
{
DeleteStrList(pview->strlist);
free(pview);
}
void FreeLrListItems(pLRVIEW pview)
{
FreeStrListItems(pview->strlist);
pview->cellnum = 0;
pview->baseindex = 0;
pview->coursorx = 0;
}
int MoveLrCursor(pLRVIEW pview,int xstep,int ystep)/*CELL 已经定长,可以较为方便的实现翻叶*/
{
if(!pview||pview->locked || pview->cellnum <=0 ) return -1;
pview->coursorx += xstep;
if(pview->coursorx + pview->baseindex > pview->cellnum - 1)/*已经到ITEM极限*/
{
if((pview->cellnum % pview->ospnum) == 0)/*刚好满叶时*/
{
pview->coursorx = pview->ospnum -1;
return pview->cellnum -1;
}else/*不满叶时*/
{
pview->coursorx = pview->cellnum %pview->ospnum -1;
pview->baseindex = pview->cellnum - (pview->cellnum % pview->ospnum);
return pview->baseindex + pview->coursorx;
}
}
if(pview->coursorx > pview->ospnum - 1)/*可以向前翻叶时翻叶*/
{
pview->coursorx = 0;
pview->baseindex += pview->ospnum;
return pview->baseindex + pview->coursorx;
}
if(pview->coursorx < 0 && pview->baseindex > 0)/*可以向后翻叶时*/
{
pview->baseindex -= pview->ospnum ;
pview->coursorx = pview->ospnum -1;
return pview->baseindex + pview->coursorx;
}
if(pview->coursorx < 0)/*向左移动光标到极限时*/
{
pview->coursorx = 0;
return pview->baseindex + pview->coursorx;
}
return pview->baseindex + pview->coursorx;
}
/*
向LRLIST增加ITEM,若已经设定POINTER模式,只是简单的增加指针。
*/
int AddToLrList(pLRVIEW pview,char *data)
{
pview->cellnum++;
if( pview->itemmode == ITEM_NOD)
return AddStrListItem(pview->strlist,data);
else
return AddStrPtrItem(pview->strlist,data);
}
int InsertToLrList(pLRVIEW pview,char *data,int cellx)
{
return (int)data;
}
void DelFromLrList(pLRVIEW pview,int index)
{
if(pview->cellnum < 0)
{
pview->cellnum = 0;
pview->coursorx = -1;
return;
}
DeleteStrListItem(pview->strlist,index);
pview->coursorx--;
pview->cellnum--;
if( pview->coursorx< 0 && pview->baseindex >= pview->ospnum)
{
pview->baseindex -= pview->ospnum;
if(pview->baseindex < 0) pview->baseindex =0 ;
pview->coursorx = (pview->ospnum -1);
}
else if(pview->coursorx< 0 && pview->cellnum <=0)
{
pview->coursorx = -1;
pview->cellnum = 0;
}
else if(pview->coursorx < 0 && pview->cellnum >= 1)
pview->coursorx = 0;
}
char * GetLrListData(pLRVIEW pview,int index)
{
return GetStrItem(pview->strlist,index);
}
void LockLrList(pLRVIEW pview)
{
if(pview)
pview->locked = 1;
}
void UnLockLrList(pLRVIEW pview)
{
if(pview)
pview->locked = 0;
}
int IsLrLocked(pLRVIEW pview)
{
if(pview)
return pview->locked;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -