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

📄 strlrview.c

📁 汉字在计算机内存放分为两种情况
💻 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 + -