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

📄 m_mtext.c

📁 ucOS 模拟环境
💻 C
字号:
//----------------------------------------------------------------------
// FileName	: M_MText.c
// Project	: SII_PHS
// Memo		: 
//----------------------------------------------------------------------
#ifdef PCVER
	#include "assert.h"
#else
	#include "skb.h"
	#include "lcd.h"
#endif	
#include "keydef.h"
#include "draw.h"
#include "typedef.h"
#include "m_data.h"
#include "m_mtext.h"
#include "m_index.h"
#include "keyEvent.h"

#define MAXWORDS 300  

uchar MT_GvRamNo;
static uint ENDX, ENDY, LINELENGTH, LINENUM;
static uchar count = 0;	
static uchar begin = 0;  
static uint Text[MAXWORDS];	
static uint pos = 0;		
static uint offset = 0;

//======================================================================
// Function Name:	void M_MTextInit()
// Purpose      :	Main Text Initialization
// Parameter    :	None
// Return       :	None
// Remarks      :	正文初始化	
// Change Log   :	
//                Author       Date       Description	
//              John Wong      2004/2       SII-PHS	
//======================================================================

void M_MTextInit()
{
	ENDX = 112 / FONTWIDTH * FONTWIDTH;
	ENDY = 128 / FONTHEIGHT * FONTHEIGHT;
	LINELENGTH  = ENDX / FONTWIDTH;
	LINENUM     = ENDY / FONTHEIGHT;

	offset = (CODESTARTY - (ENDY - FONTHEIGHT *  2)) / 2 - 1;		

	MT_GvRamNo = MD_SetGvramArea(0, 0, ENDX, ENDY); 
	MD_SetCurGvramCousor(MT_GvRamNo, 0, 0);
	
}
//======================================================================
// Function Name:	void MainText()
// Purpose      :	Main Text Editing 
// Parameter    :	None
// Return       :	None
// Remarks      :	正文编辑
// Change Log   :	
//                Author       Date       Description	
//              John Wong      2004/2       SII-PHS	
//======================================================================
void MainText()
{
	short event = 0;
	uchar key;
	Point Pt;
	Point * point = &Pt;
	uint px, py;
	uchar i;

	UpdateText();

   while(g_Thread)
   {
	  key = GetKey(event);
      switch(key)
      {
      case KEY_DOWN_ENT:	
			UpdateTextArea();
			return;
//======================================================================
      case KEY_DOWN_LEFT:
			if (pos <= 0) break;
			pos --;

			MD_GetCurGvramCousor(MT_GvRamNo, point);
			px = point->x;
			py = point->y;

			if ( px > 0 )
			{
				px -= FONTWIDTH;
				MD_SetCurGvramCousor(MT_GvRamNo, px, py);
			}
			else if ( py > 0 )
			{
				px = ENDX - FONTWIDTH;
				py = py - FONTHEIGHT;
				MD_SetCurGvramCousor(MT_GvRamNo, px, py);
			}
			else 
			{
				px = ENDX - FONTWIDTH;
				py = 0;
				MD_SetCurGvramCousor(MT_GvRamNo, px, py);
				begin--;
			}
			UpdateText();
			break;
//======================================================================
      case KEY_DOWN_RIGHT:
			if (pos >= count) break; 
			pos ++;

			MD_GetCurGvramCousor(MT_GvRamNo, point);
			px = point->x;
			py = point->y;
  			
			if ( px < ENDX -  FONTWIDTH)	
			{
				px += FONTWIDTH;
				MD_SetCurGvramCousor(MT_GvRamNo, px, py);
			}
			else if ( py < ENDY -  FONTHEIGHT )
			{
				px = 0;
				py += FONTHEIGHT;
				MD_SetCurGvramCousor(MT_GvRamNo, px, py);
			}
			else
			{
				px = 0;
				MD_SetCurGvramCousor(MT_GvRamNo, px, py);
				begin++;
			}
			UpdateText();
			break;
//======================================================================
      case KEY_DOWN_UP:
			if (pos < LINELENGTH) break;
			pos -= LINELENGTH;

			MD_GetCurGvramCousor(MT_GvRamNo, point);
			px = point->x;
			py = point->y;

			if ( py > 0 )
			{
				py -= FONTHEIGHT;
				MD_SetCurGvramCousor(MT_GvRamNo, px, py);
			}
			else 
			{
				begin--;
			}

			UpdateText();	  
			break;
//======================================================================
      case KEY_DOWN_DOWN:
			MD_GetCurGvramCousor(MT_GvRamNo, point);
			px = point->x;
			py = point->y;

			if (pos + LINELENGTH <= count)						//next line is not the end
			{
				pos += LINELENGTH;			
				if ( py < ENDY - FONTHEIGHT )
				{
					py += FONTHEIGHT;
					MD_SetCurGvramCousor(MT_GvRamNo, px, py);
				}
				else 
				{
					begin++;
				}
			}
			else if (pos / LINELENGTH < count / LINELENGTH )	//next line is the end
			{
				pos = count;
				if ( py < ENDY - FONTHEIGHT )
				{
					px = (pos%LINELENGTH) * FONTWIDTH ;
					py += FONTHEIGHT;
					MD_SetCurGvramCousor(MT_GvRamNo, px, py);
				}
				else
				{
					begin++;
					px = (pos%LINELENGTH) * FONTWIDTH;
					MD_SetCurGvramCousor(MT_GvRamNo, px, py);
				}			
			}
			else break;
			UpdateText();		
			break;
//======================================================================
      case KEY_DOWN_C:											
			if ( count <= 0)    
			{
				MD_Clear (0,	0,		ENDX,		ENDY,		MT_GvRamNo);				
				return;
			}
			
			MD_GetCurGvramCousor(MT_GvRamNo, point);
			px = point->x;
			py = point->y;

			if (pos == count )							//at the end
			{				
				pos --;
				if ( px > 0 )      
					MD_SetCurGvramCousor(MT_GvRamNo, (uint)(px - FONTWIDTH), py);		
				else if ( py > 0 )  
					MD_SetCurGvramCousor(MT_GvRamNo, (uint)(ENDX - FONTWIDTH) , (uint)(py - FONTHEIGHT));
				else 
				{
					MD_SetCurGvramCousor(MT_GvRamNo, (uint)(ENDX - FONTWIDTH) ,0 );
					begin--;
				}
			}
			else
			{
				for (i = 0; pos + i + 1 < count ;i++)
					Text[pos + i] = Text[pos + i + 1];
			}

			Text[--count ] = 0;
			UpdateText();
			break;
      default:
//#ifdef PCVER
 //        assert(0);
//#endif
	   break;

      }
	#ifdef PCVER
		UpdateGvram();
	#endif

   }
}
//======================================================================
// Function Name:	void DrawOnetext(uint ulTextNo)
// Purpose      :	Add or Insert a New Char
// Parameter    :	uint ulTextNo
// Return       :	None
// Remarks      :	追加或插入一个字
// Change Log   :	
//                Author       Date       Description	
//              John Wong      2004/2       SII-PHS	
//======================================================================

void DrawOnetext(uint ulTextNo)
{

	uint px,py,i;
	Point Pt;
	Point * point = &Pt;

	if (count >= MAXWORDS) return; 
#ifdef PCVER
	ulTextNo = (ulTextNo >> 8) | (ulTextNo << 8);		//reverse
#endif
	if (pos < count )									//not at the end
	{
		for (i = count; i > pos ;i--)
			Text[i] = Text[i - 1];
	}
															
	Text[pos] = ulTextNo;	
	count ++;
	pos ++;
	MD_GetCurGvramCousor(MT_GvRamNo, point);
	px = point->x;
	py = point->y;

	if ( px < ENDX -  FONTWIDTH)	
	{
		px += FONTWIDTH;
		MD_SetCurGvramCousor(MT_GvRamNo, px, py);
	}
	else if ( py < ENDY -  FONTHEIGHT )
	{
		py +=  FONTHEIGHT;
		MD_SetCurGvramCousor(MT_GvRamNo, 0 , py);
	}
	else
	{
		begin++;
		MD_SetCurGvramCousor(MT_GvRamNo, 0 , py);
	}

	UpdateTextArea(); 

}

//======================================================================
// Function Name:	void UpdateText()
// Purpose      :	Update the Main Text Screen While Editing
// Parameter    :	None
// Return       :	None
// Remarks      :	刷新屏幕(编辑状态下)
// Change Log   :	
//                Author       Date       Description	
//              John Wong      2004/2       SII-PHS	
//======================================================================

static void UpdateText()
{
	uchar i;
	Point pt;
	Point * point = &pt;
	uint px,py;

#ifndef PCVER
	Lcdfreeze(1);
#endif

	MD_GetCurGvramCousor(MT_GvRamNo, point);
	px = point->x;
	py = point->y;

	MD_Clear (0,	0,		ENDX,		ENDY,		MT_GvRamNo);

	for (i = 0; i < LINENUM; i++)
	{

		MD_SetCurGvramCousor(MT_GvRamNo,  0,  (uint)(i * FONTHEIGHT) );

		if ((begin + i + 1) * LINELENGTH <= count)
			MD_UnicTextVLine(Text + (begin + i) * LINELENGTH , MT_GvRamNo, (uchar)LINELENGTH);

		else if ((begin + i) * LINELENGTH <= count)
			MD_UnicTextVLine(Text + (begin + i) * LINELENGTH , MT_GvRamNo,(uchar)(count % LINELENGTH));

	}

	MD_Reverse ( px , py ,	(uint)(px + FONTWIDTH ), (uint)(py + FONTHEIGHT),	MT_GvRamNo);	
	MD_SetCurGvramCousor(MT_GvRamNo, px , py);

#ifdef PCVER
	UpdateGvram();
#endif
#ifndef PCVER
	Lcdfreeze(0);
#endif

}


//======================================================================
// Function Name:	void UpdateTextArea()
// Purpose      :	Update the Main Text Screen While Drawing
// Parameter    :	None
// Return       :	None
// Remarks      :	刷新屏幕(输入状态下)
// Change Log   :	
//                Author       Date       Description	
//              John Wong      2004/2       SII-PHS	
//======================================================================
 
void UpdateTextArea()
{
	Point pt;
    Point * point = &pt;
	uint px,py;
	uchar i;
	
#ifndef PCVER
	Lcdfreeze(1);
#endif

	MD_GetCurGvramCousor(MT_GvRamNo, point);
	px = point->x;
	py = point->y;

	if (py == ENDY - 2 * FONTHEIGHT)
	{
		begin ++;
		py -= FONTHEIGHT;
		MD_SetCurGvramCousor(MT_GvRamNo,px,py  );
	}
	else if (py == ENDY - FONTHEIGHT)
	{
		begin += 2;
		py -=  2 * FONTHEIGHT;
		MD_SetCurGvramCousor(MT_GvRamNo,px,py );
	}
	
	MD_Clear (0,	0,		ENDX,		ENDY,		MT_GvRamNo);

	for (i = 0; i < LINENUM - 2 ; i++)
	{

		MD_SetCurGvramCousor(MT_GvRamNo,  0, (uint)(i * FONTHEIGHT + offset ));

		if ((begin + i + 1) * LINELENGTH <= count)
			MD_UnicTextVLine(Text + (begin + i) * LINELENGTH , MT_GvRamNo,(uchar)LINELENGTH);

		else if ((begin + i) * LINELENGTH <= count)
			MD_UnicTextVLine(Text + (begin + i) * LINELENGTH , MT_GvRamNo,(uchar)(count % LINELENGTH));

	}


	MD_Reverse ( px , (uint)(py + offset) ,	(uint)(px + FONTWIDTH ), (uint)(py + FONTHEIGHT + offset) ,	MT_GvRamNo);	
	MD_SetCurGvramCousor(MT_GvRamNo, px , py );

	#ifdef PCVER
		UpdateGvram();
	#endif

	#ifndef PCVER
		Lcdfreeze(0);
	#endif

}


⌨️ 快捷键说明

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