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

📄 editbase.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 5 页
字号:
/***************************************************
Copyright(c) 版权所有,1998-2003微逻辑。保留所有权利。
***************************************************/
/**************************************************
文件说明:编辑类
版本号:1.0.0.456
开发时期:2001-12-26
作者:Jami chen 陈建明
修改记录:
	2004.07.12  修改颜色设置错误,当readme, diable的颜色与一般文本颜色不同是,会有部分
				使用一般文本的背景色,部分使用正确的颜色
**************************************************/
//#include <stdlib.h>
#include "eebase.h"
#include <eframe.h>
#include <estring.h>
#include "eclipbrd.h"
#include "ecaret.h"
#include "eGlobmem.h"
//#include <gwmesrv.h>

//#define LINE_BANK

/***********************************************************************************************/
 BOOL FormatEdit(HWND hWnd,LPEDITITEM lpEditItem,LPFORMATANALYSIS lpFmtAnalysis);
// BOOL FormatEdit(HWND hWnd,LPFORMATANALYSIS lpFmtAnalysis);
 int GetFmtTextLen(LPTSTR lpFmtBunch);
 int GetFmtNumeric(LPTSTR lpCurChar,LPTSTR lpNumericBuffer);
 void FormatEditText(HWND hWnd,LPEDITITEM lpEditItem,LPFORMATANALYSIS lpFmtAnalysis);
 void ShowFormatText(HWND hWnd,HDC hdc,LPEDITITEM lpEditItem,LPTSTR lpText,int nTextLen,int *lpnCurCharPos,int *lpnCurLine);
 SIZE GetSize(HWND hWnd,LPTSTR lpText,int cTextLen);
 int GetFmtItem(LPFORMATANALYSIS lpFmtAnalysis,LPTSTR lpCurChar);
 int CanInsertToFmtItem(LPFORMATANALYSIS lpFmtAnalysis,TCHAR HiByte,TCHAR LoByte);
/***********************************************************************************************/

// This function for debug
void ErrorDisplay(LPCTSTR lpCaption);

// public function declare area
//int GetTextHeight(HWND hWnd);
extern void SendNotificationMsg( HWND hWnd, WORD wNotifyCode);
//  function declare area
void SaveEditText(LPTSTR lpSaveBuffer,LPCTSTR lpBuffer,int cbEditLen);
//void GetEditText(LPTSTR lpGetBuffer,LPCTSTR lpBuffer,int cbEditLen);

 void ClearEditItemStruct(LPEDITITEM lpEditItem);
 void DrawPDAEditControl(HWND hWnd,HDC hdc,LPEDITITEM lpEditItem,DWORD dwFlag);
 BOOL CreatePDACaret(HWND hWnd,LPEDITITEM lpEditItem);
 BOOL SetPDACaret(HWND hWnd);
 BOOL ShowPDACaret(HWND hWnd);
 BOOL HidePDACaret(HWND hWnd);
 BOOL DeletePDACaret(HWND hWnd);
 BOOL SetPDACaretPosition(HWND hWnd,LPEDITITEM lpEditItem,int xPos,int yPos);
 void SetPDAEditColor(HWND hWnd,HDC hdc,int nColorStyle);
 void DrawPDAEditSpecialText(HWND hWnd,HDC hdc,LPEDITITEM lpEditItem,LPTSTR lpShowAddress,
							   int nShowPos,int nShowLine,int nShowLen,DWORD dwStyle);
 void GetCoordinate(HWND hWnd,LPEDITITEM lpEditItem,LPTSTR lpPosition,int * lpxPos,int * lpnLine,BOOL bIsMultiLine);
 void ClearInvert(HWND hWnd,LPEDITITEM lpEditItem, BOOL bFlag);
 BOOL InsertChar(HWND hWnd,LPEDITITEM lpEditItem,CHAR HiByte,CHAR LoByte);
 BOOL PickCharacter(CHAR HiByte,CHAR LoByte,DWORD dwStyle);
 void ClearLine(HWND hWnd,HDC hdc,LPEDITITEM lpEditItem,int xPos,int yPos);
 void ClearTextEnd(HWND hWnd,HDC hdc,LPEDITITEM lpEditItem,int xPos,int yPos);
 void ClearTextHead(HWND hWnd,HDC hdc,LPEDITITEM lpEditItem,int xPos,int yPos);
 void DisplayInvertChange(HWND hWnd,LPEDITITEM lpEditItem);
 BOOL AdjustCaretInEditItem(HWND hWnd,LPEDITITEM lpEditItem);
 int  BackSpaceChar(HWND hWnd,LPEDITITEM lpEditItem);
 BOOL MoveCaretToPreChar(HWND hWnd,LPEDITITEM lpEditItem);
 int DeleteCaretChar(HWND hWnd,LPEDITITEM lpEditItem);
 int DeleteChar(HWND hWnd,LPEDITITEM lpEditItem);
// void DoKeyDown(HWND hWnd,WPARAM wParam,LPARAM lParam);
 BOOL DeleteInvert(HWND hWnd,LPEDITITEM lpEditItem);
 void FillPassWordChar(LPTSTR lpEditBuffer,int nFillLength,TCHAR chPasswordChar);


 LPTSTR GetLinePosition(HWND hWnd,LPEDITITEM lpEditItem,LPTSTR lpLineStart,int xPos,BOOL bIsMultiLine,int * lpRealPos);
 int GetxStartOfLine(HWND hWnd,LPEDITITEM lpEditItem,LPCTSTR lpLineAddress);

 LPTSTR GetLineAddress(HWND hWnd,LPEDITITEM lpEditItem,int nLine);
 int GetTotalLine(HWND hWnd,LPEDITITEM lpEditItem);
 void SetInvertArea(HWND hWnd,LPEDITITEM lpEditItem);
 void SetCaretToStart(HWND hWnd,LPEDITITEM lpEditItem);
 int GetWindowWidth(HWND hWnd,LPEDITITEM lpEditItem);
 int GetWindowHeight(HWND hWnd);
 BOOL GetPDACharWidth(HWND hWnd,LPINT lpASCIICodeWidthBuffer,LPINT lpChineseCodeWidth);
 void SetWindowRect(HWND hWnd,LPEDITITEM lpEditItem,BOOL bRedraw);

 void SetPDAEditVScrollRange(HWND hWnd,int nTotalLine);
 int GetPageLine(HWND hWnd);
 void SetPDAEditScrollPage(HWND hWnd);
 void ScrollCaretInPDAEdit(HWND hWnd,int nScrollLine);
 void SetEditVScrollPos(HWND hWnd,int nNewScrollPos);
 void SetEditHScrollPos(HWND hWnd,int nNewScrollPos);
 void DrawLineSeparate(HWND hWnd,HDC hdc,LPEDITITEM lpEditItem,int nCurLine);
// void JumpToNextItem(HWND hWnd,LPEDITITEM lpEditItem);
 int GetLineLength(HWND hWnd,LPEDITITEM lpEditItem,LPCTSTR lpLineAddress,int *lpLineWidth);
 void InsertString(HWND hWnd,LPEDITITEM lpEditItem,LPCTSTR lpString,int cchLen);
 void SetCaretCoordinate(HWND hWnd,LPEDITITEM lpEditItem);


static void ShowCallBackFlag(HWND hWnd,HDC hdc,LPEDITITEM lpEditItem);

/**************************************************
声明:void ClearEditItemStruct(LPEDITITEM lpEditItem)
参数:
	IN lpEdititem -- 编辑条目结构指针
返回值:无
功能描述:清除编辑条目结构。
引用: 
************************************************/
void ClearEditItemStruct(LPEDITITEM lpEditItem)
{  // clear Edit State
	    // Clear Edit buffer
		memset( lpEditItem->lpPDAEditBuffer, 0, lpEditItem->cbEditBufferLen );
		memset( lpEditItem->lpPDASaveEditBuffer, 0, lpEditItem->cbEditBufferLen );
		// Set display Poisition to (0,0)
		lpEditItem->nDisplayx=0;
		lpEditItem->nDisplayLine=0;
		
		// Set Caret Position to (0,0)
		lpEditItem->nCaretx=0;
		lpEditItem->nCaretLine=0;
		lpEditItem->lpCaretPosition=lpEditItem->lpPDAEditBuffer;
		
		// set Invert area to 0
		lpEditItem->lpInvertEnd=NULL;
		lpEditItem->lpInvertStart=NULL;
		lpEditItem->lpInvertInitial=NULL;
		lpEditItem->lpOldInvertEnd=NULL;
		lpEditItem->lpOldInvertStart=NULL;

		// Clear Modified flag
		lpEditItem->fModified=FALSE;

		// the default Password char is '*'
		lpEditItem->chPassWordWord='*';
		
		// No input char
		lpEditItem->HiByte=0;
    lpEditItem->LoByte=0;
    lpEditItem->HalfByte=FALSE;

//		lpEditItem->nTotalLine=-1;
}
/**************************************************
声明:void DrawPDAEditControl(HWND hWnd,HDC hdc,LPEDITITEM lpEditItem,DWORD dwFlag)
参数:
	IN hWnd -- 窗口句柄
	IN hdc -- 设备句柄
	IN lpEdititem -- 编辑条目结构指针
	IN dwFlag -- 绘制标志
返回值:无
功能描述:绘制编辑条目。
引用: 
************************************************/
 void DrawPDAEditControl(HWND hWnd,HDC hdc,LPEDITITEM lpEditItem,DWORD dwFlag)
{
		// display whole text from coordinate (0,0)
    DrawPDAEditSpecialText(hWnd,hdc,lpEditItem,NULL,0,0,0,dwFlag);
//    ReleaseDC(hWnd,hdc);
		return;
}
/**************************************************
声明:BOOL CreatePDACaret(HWND hWnd,LPEDITITEM lpEditItem)
参数:
	IN hWnd -- 窗口句柄
	IN lpEdititem -- 编辑条目结构指针
返回值:成功返回TRUE,否则返回FALSE
功能描述:创建光标。
引用: 
************************************************/
BOOL CreatePDACaret(HWND hWnd,LPEDITITEM lpEditItem)
{
	// Create a width is 2 ,and height is LINEHEIGHT Caret
	int nTextHeight;
	DWORD dwStyle;
//		dwStyle=WindowLong(hWnd,GWL_STYLE);
        dwStyle=lpEditItem->dwStyle;
//		if (dwStyle&ES_READONLY)
//			return FALSE;

		nTextHeight=GetTextHeight(hWnd);
        // 创建光标
#ifdef CPU_68K
		CreateCaret(hWnd,NULL,1,nTextHeight);
#else
		CreateCaret(hWnd,NULL,2,nTextHeight);
#endif
		return TRUE;
}
/**************************************************
声明:BOOL SetPDACaret(HWND hWnd)
参数:
	IN hWnd -- 窗口句柄
返回值:成功返回TRUE,否则返回FALSE
功能描述:设置光标。
引用: 
************************************************/
BOOL SetPDACaret(HWND hWnd)
{
	int x,y;
//  LPEDITITEM lpEditItem;
//	BOOL Result;
	int nTextHeight;
	DWORD dwStyle;
  LPMULTIITEMEDITSTRUCT lpMultiItemEditStruct;
  LPEDITITEM lpEditItem;

		// get focus
//		if (GetFocus()!=hWnd) return FALSE;
// 为什么要去掉这句话,加上 ???  Jami chen 2003.08.07
	if (GetFocus()!=hWnd) 
		return FALSE;

    dwStyle=GetWindowLong(hWnd,GWL_STYLE);  // 得到创建风格
    if (dwStyle&ES_MULTIITEMEDIT)
    {
      lpMultiItemEditStruct=(LPMULTIITEMEDITSTRUCT)GetWindowLong(hWnd,0);  // 得到多条目结构句柄
      if (lpMultiItemEditStruct==NULL) return 0;
      lpEditItem=&lpMultiItemEditStruct->lpItemList[lpMultiItemEditStruct->iActiveItem]; // 得到激活条目的结构结构
    }
    else
    {
      lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);  // 得到编辑区结构句柄
      if (lpEditItem==NULL) return 0;
    }


	// get line height
    nTextHeight=GetTextHeight(hWnd);

	    // Get struct EDITITEM data
//		lpEditItem=(LPEDITITEM)GetWindowLong(hWnd,0);
//    lpEditItem=&lpMultiItemEditStruct->lpItemList[lpMultiItemEditStruct->iActiveItem];
//    if(lpEditItem==NULL) return FALSE;

		dwStyle=lpEditItem->dwStyle;  // 得到条目风格
//		if (dwStyle&ES_READONLY)
//			return FALSE;
		// Get Caret x position
	  x=lpEditItem->nCaretx;
		// Get Caret y Position
		y=lpEditItem->nCaretLine*nTextHeight+lpEditItem->iStartPos;

//    gotoxy(0,20);
//    printf("x=%d\n",x);
//    printf("y=%d\n",y);
		// Set Caret Position
		HidePDACaret(hWnd);
		SetCaretPos(x,y);  // 设置光标位置
		ShowPDACaret(hWnd);

		// Set Success
	    return TRUE;
}
/**************************************************
声明: BOOL ShowPDACaret(HWND hWnd)
参数:
	IN hWnd -- 窗口句柄
返回值:无
功能描述:显示光标。
引用: 
************************************************/
 BOOL ShowPDACaret(HWND hWnd)
{
	ShowCaret(hWnd);  // 显示光标
	return TRUE;
}
/**************************************************
声明: BOOL HidePDACaret(HWND hWnd)
参数:
	IN hWnd -- 窗口句柄
返回值:无
功能描述:隐藏光标。
引用: 
************************************************/
 BOOL HidePDACaret(HWND hWnd)
{
	HideCaret(hWnd);  // 隐藏光标
	return TRUE;
}
/**************************************************
声明: BOOL DeletePDACaret(HWND hWnd)
参数:
	IN hWnd -- 窗口句柄
返回值:无
功能描述:删除光标。
引用: 
************************************************/
 BOOL DeletePDACaret(HWND hWnd)
{
// !!! Delete By Jami chen in 2004.07.15
// 在非同步模式(PostMessage)下,收到WM_KILLFOCUS
//时GetFocus()得到的窗口句柄已经不是当前窗口
	//if (GetFocus()!=hWnd)
	//	return FALSE;
// !!! Delete End By Jami chen in 2004.07.15
	DestroyCaret();  // 破坏光标
	return TRUE;
}
/**************************************************
声明: BOOL SetPDACaretPosition(HWND hWnd,LPEDITITEM lpEditItem,int xPos,int yPos)
参数:
	IN hWnd -- 窗口句柄
	IN lpEdititem -- 编辑条目结构指针
	IN xPos -- x坐标
	IN yPos -- y坐标
返回值:无
功能描述:设置光标位置。
引用: 
************************************************/
 BOOL SetPDACaretPosition(HWND hWnd,LPEDITITEM lpEditItem,int xPos,int yPos)
{
	DWORD dwStyle;
	int nLine,nTotalLine,nCaretPosition;
	LPTSTR lpLineAddress;
	int nPointCoordinate;
	int nTextHeight;
//  int nItem;
// !!! Add By Jami chen in 2004.10.18
	LPTSTR lpNewCaret;
// !!! Add End

		// get line height
		nTextHeight=GetTextHeight(hWnd);

//    yPos-=lpEditItem->iStartPos;
		// Get Edit Control Style
		dwStyle=lpEditItem->dwStyle;
		// Get the x_coordinate from the text origin
		nPointCoordinate=xPos+lpEditItem->nDisplayx;


		if (dwStyle&ES_MULTILINE)
		{ // the edit control is multiple line
			// get caret line position from window origin
			lpEditItem->nCaretLine=yPos/nTextHeight;

			// get this window text total line
			nTotalLine=GetTotalLine(hWnd,lpEditItem);
			// get caret line position from text origin
			nLine=lpEditItem->nCaretLine+lpEditItem->nDisplayLine;
			// if the caret line > text total line ,then set caret line
			// to the text end
			if (nTotalLine<=nLine)
				lpEditItem->nCaretLine=nTotalLine-lpEditItem->nDisplayLine-1;

			// if the caret line out the text origin the set caret line to
			// the text first line
			if (nLine<0)
			{
				nLine=0;
				lpEditItem->nCaretLine=0-lpEditItem->nDisplayLine;
			}
			// Get text address of the caret line
			lpLineAddress=GetLineAddress(hWnd,lpEditItem,nLine);
			// Get Caret Position
// !!! Modified By jami chen in 2004.10.18
//			lpEditItem->lpCaretPosition=GetLinePosition(hWnd,lpEditItem,lpLineAddress,nPointCoordinate,TRUE,&nCaretPosition);
			lpNewCaret=GetLinePosition(hWnd,lpEditItem,lpLineAddress,nPointCoordinate,TRUE,&nCaretPosition);
// !!! Modified End
		}
		else
		{ // the edit control is single line
			// the caret line always in the first line
			lpEditItem->nCaretLine=0;
			// Get Caret Position
//			lpEditItem->lpCaretPosition=GetLinePosition(hWnd,lpEditItem->lpPDAEditBuffer,nPointCoordinate,FALSE,&nCaretPosition);
// !!! Modified By jami chen in 2004.10.18
//			lpEditItem->lpCaretPosition=GetLinePosition(hWnd,lpEditItem,lpEditItem->lpPDAControlBuffer,nPointCoordinate,FALSE,&nCaretPosition);
			lpNewCaret=GetLinePosition(hWnd,lpEditItem,lpEditItem->lpPDAControlBuffer,nPointCoordinate,FALSE,&nCaretPosition);
// !!! Modified End
		}

// !!! Add By Jami chen in 2004.10.18
		if (lpNewCaret == lpEditItem->lpCaretPosition)
		{
			// 光标位置没有发生改变
			return FALSE;
		}
		// 设置新的光标位置
		lpEditItem->lpCaretPosition = lpNewCaret;
// !!! Add End

		if (lpEditItem->lpCaretPosition<lpEditItem->lpPDAEditBuffer)
		{   // 设置光标到起始位置
			SetCaretToStart(hWnd,lpEditItem);
		}
		else
		{

⌨️ 快捷键说明

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