📄 editbase.c
字号:
/***************************************************
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 + -