📄 edit.c
字号:
/***************************************************
Copyright(c) 版权所有,1998-2003微逻辑。保留所有权利。
***************************************************/
/**************************************************
文件说明:编辑类
版本号:1.0.0.456
开发时期:2001-12-26
作者:Jami chen 陈建明
修改记录:
2004.07.19 增加消息功能WM_SYSCOLORCHANGE, 用于在在系统颜色重新
设置后,需要重新装载新的颜色
**************************************************/
//#include "StdAfx.h"
//#include <ctype.h>
#include "eframe.h"
//#include "Resource.h"
//#include <memory.h>
//#include <wingdi.h>
#include <estring.h>
//#include "Show.h"
#include "eedit.h"
#include "eeBase.h"
#include "eclipbrd.h"
//#include <gwmesrv.h>
// define const
#define EDIT classEDIT
static const char classEDIT[]="Edit";
#define DOT '.'
//#define _MAPPOINTER
//#define INITIALEDITSIZE 64
#define INITIALEDITSIZE 64
//#define LINEHEIGHT 16
//#define CHINESEWIDTH 16
#define NORMALCOLOR 0
#define INVERTCOLOR 1
/*
#define PE_SHOWCLIENT 0x00000000
#define PE_SHOWLINEEND 0x00000001
#define PE_SHOWTEXTEND 0x00000002
#define PE_SHOWSPECIALLEN 0x00000003
*/
#define ENTERCODE 0x0D
#define BACKSPACE 0x08
// static function declare area
LRESULT CALLBACK PDAEditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
ATOM RegisterEditClass(HINSTANCE hInstance);
static LRESULT DoDeleteChar(HWND hWnd);
static LRESULT InitialPDAEdit(HWND hwnd,LPARAM lParam); // initial PDAEdit State data
static LRESULT DoSize(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoMouseMove(HWND hWnd,WPARAM wParam,LPARAM lParam);
static void DoLButtonUp(HWND hWnd,WPARAM wParam,LPARAM lParam);
static void DoProcessChar(HWND hWnd,WPARAM wParam,LPARAM lParam);
static void DoGetCaretPosition(HWND hWnd,WPARAM wParam,LPARAM lParam);
static void DoSetCaretPosition(HWND hWnd,WPARAM wParam,LPARAM lParam);
static void DoSetxDisplayPos(HWND hWnd,WPARAM wParam,LPARAM lParam);
static int DoVScrollWindow(HWND hWnd,WPARAM wParam,LPARAM lParam);
static void DoHScrollWindow(HWND hWnd,WPARAM wParam,LPARAM lParam);
static void ClearBottomBlankArea(HWND hWnd,HDC hdc,LPEDITITEM lpEditItem);
static void DoKeyDown(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoPaint(HWND hWnd,HDC hdc);
static LRESULT DoPrintClient(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoStyleChanged(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoSysColorChanged(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoSetFocus(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoKillFocus(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoCharFromPos(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoGetFirstVisibleLine(HWND hWnd);
static LRESULT DoGetLimitText(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoGetLine(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoGetLineCount(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoGetModify(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoGetPasswordChar(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoGetSel(HWND hWnd, WPARAM wParam, LPARAM lParam);
static LRESULT DoGetThumb(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoSetLimitText(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoLineFromChar(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoLineIndex(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoLinelength(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoLineScroll(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoPosFromChar(HWND hWnd, WPARAM wParam,LPARAM lParam);
static LRESULT DoReplaceSel(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoScroll(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoScrollCaret(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoSetModify(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoSetPasswordChar(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoSetReadOnly(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoSetSel(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoCopy(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoPaste(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoCut(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoClear(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoSetText(HWND hWnd , WPARAM wParam ,LPARAM lParam);
static LRESULT DoGetText(HWND hWnd , WPARAM wParam ,LPARAM lParam);
static LRESULT DoGetTextLength(HWND hWnd , WPARAM wParam ,LPARAM lParam);
static LRESULT DoEmpty(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoSearchString(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoWindowPosChanged(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoSetColor(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoGetColor(HWND hWnd,WPARAM wParam,LPARAM lParam);
static void ReleasePDAEdit(HWND hWnd);
static void SetPDAEditVScrollPos(HWND hWnd,int nNewScrollPos);
static void SetPDAEditHScrollPos(HWND hWnd,int nNewScrollPos);
static int VScrollWindowInPDAEdit(HWND hWnd,int nScrollLine);
static void HScrollWindowInPDAEdit(HWND hWnd,int nHScrollPos);
static char * ab_strstr( const char * str1, const char * str2 );
// **************************************************
// 声明:ATOM RegisterPDAEditClass(HINSTANCE hInstance)
// 参数:
// IN hInstance -- 实例句柄
// 返回值:返回系统注册结果
// 功能描述:注册编辑类
// 引用:
// **************************************************
ATOM RegisterPDAEditClass(HINSTANCE hInstance)
{
WNDCLASS wcex;
// size of the struct 'WNDCLASSEX'
// wcex.cbSize = sizeof(WNDCLASSEX);
// the class propertiy
wcex.style = CS_HREDRAW | CS_VREDRAW;
// this class window procedure
wcex.lpfnWndProc = (WNDPROC)PDAEditProc;
// no class extra
wcex.cbClsExtra = 0;
// window extra 4 byte to save address
wcex.cbWndExtra = sizeof(long);
wcex.hInstance = hInstance;
// no icon
wcex.hIcon = NULL;
// I-Beam Cursor
wcex.hCursor = LoadCursor(NULL, IDC_IBEAM);
// background color
wcex.hbrBackground = 0;
// no menu
wcex.lpszMenuName = NULL; // no menu ,add to future
// class name
wcex.lpszClassName = EDIT;
// no small icon
// wcex.hIconSm = NULL;
// register this class
return RegisterClass(&wcex);
}
// **************************************************
// 声明:LRESULT CALLBACK PDAEditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
// 参数:
// IN hWnd -- 窗口句柄
// IN uMsg -- 要处理的消息
// IN wParam -- 消息参数
// IN lParam -- 消息参数
// 返回值:消息处理结果
// 功能描述:处理编辑类消息。
// 引用:
// **************************************************
LRESULT CALLBACK PDAEditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_CREATE:
// Create a window use this class
return InitialPDAEdit(hWnd,lParam); // initial PDAEdit State data
case WM_COMMAND:
break;
case WM_PAINT:
// Paint this window
hdc = BeginPaint(hWnd, &ps); // Get hdc
DoPaint(hWnd,hdc);
EndPaint(hWnd, &ps); //release hdc
break;
case WM_SIZE: // 窗口尺寸改变
return DoSize(hWnd,wParam,lParam);
case WM_WINDOWPOSCHANGED:
return DoWindowPosChanged(hWnd,wParam,lParam);
case WM_LBUTTONDOWN:
// the mouse left button be pressed down
DoLButtonDown(hWnd,wParam,lParam);
break;
case WM_MOUSEMOVE:
// the mouse move
DoMouseMove(hWnd,wParam,lParam);
break;
case WM_LBUTTONUP:
// the mouse left button be released
DoLButtonUp(hWnd,wParam,lParam);
break;
case WM_SETFOCUS:
// this window get focus
// Create new caret
return DoSetFocus(hWnd,wParam,lParam);
case WM_KILLFOCUS:
// this window lose foucs
// kill caret
// DeletePDACaret(hWnd);
return DoKillFocus(hWnd,wParam,lParam);
case WM_CHAR:
// input char
DoProcessChar(hWnd,wParam,lParam);
break;
case WM_KEYDOWN:
// have key be pressed
DoKeyDown(hWnd,wParam,lParam);
break;
case WM_DESTROY:
// close this window
ReleasePDAEdit(hWnd);
// PostQuitMessage(0);
break;
case EM_GETCARETPOS: // 得到光标位置
DoGetCaretPosition(hWnd,wParam,lParam);
break;
case EM_SETCARETPOS: // 设置光标位置
DoSetCaretPosition(hWnd,wParam,lParam);
break;
case MIEM_SETXDISPLAYPOS: // 设置水平方向的显示位置
DoSetxDisplayPos(hWnd,wParam,lParam);
break;
case WM_VSCROLL: // 垂直滚动
DoVScrollWindow(hWnd,wParam,lParam);
break;
case WM_HSCROLL: // 水平滚动
DoHScrollWindow(hWnd,wParam,lParam);
break;
case EM_CHARFROMPOS: //得到指定点的字符
return DoCharFromPos(hWnd,wParam,lParam);
case EM_GETFIRSTVISIBLELINE: //得到第一个可见行
return DoGetFirstVisibleLine(hWnd);
case EM_GETTHUMB: // 得到垂直滚动条滚动块的位置
return DoGetThumb(hWnd,wParam,lParam);
case EM_GETLIMITTEXT: // 得到当前编辑区的文本限制
return DoGetLimitText(hWnd,wParam,lParam);
case EM_GETLINE: // 得到指定行的数据
return DoGetLine(hWnd,wParam,lParam);
case EM_GETLINECOUNT: //得到编辑区的总行数
return DoGetLineCount(hWnd,wParam,lParam);
case EM_GETMODIFY: // 得到当前编辑区的修改标志
return DoGetModify(hWnd,wParam,lParam);
case EM_GETPASSWORDCHAR:// 得到当前编辑区的密码字符
return DoGetPasswordChar(hWnd,wParam,lParam);
case EM_GETSEL: // 得到编辑区的选择区域
return DoGetSel(hWnd,wParam,lParam);
case EM_LINEFROMCHAR: // 返回指定索引字符的行索引
return DoLineFromChar(hWnd,wParam,lParam);
case EM_LINEINDEX: // 得到指定行索引所对应的字符索引
return DoLineIndex(hWnd,wParam,lParam);
case EM_LINELENGTH: // 得到指定字符所在行的字符个数
return DoLinelength(hWnd,wParam,lParam);
case EM_LINESCROLL: // 滚动窗口
return DoLineScroll(hWnd,wParam,lParam);
case EM_POSFROMCHAR: // 得到指定字符的坐标
return DoPosFromChar(hWnd,wParam,lParam);
case EM_REPLACESEL: // 用指定的字符串替换选择字符
return DoReplaceSel(hWnd,wParam,lParam);
case EM_SCROLL: // 垂直滚动屏幕
return DoScroll(hWnd,wParam,lParam);
case EM_SCROLLCARET: // 滚动光标到可见位置
return DoScrollCaret(hWnd,wParam,lParam);
case EM_SETLIMITTEXT: // 设置编辑区的文本限制
return DoSetLimitText(hWnd,wParam,lParam);
case EM_SETMODIFY: // 设置新的修改标志
return DoSetModify(hWnd,wParam,lParam);
case EM_SETPASSWORDCHAR: // 设置新的密码字符
return DoSetPasswordChar(hWnd,wParam,lParam);
case EM_SETREADONLY: // 设置编辑区的只读属性
return DoSetReadOnly(hWnd,wParam,lParam);
case EM_SETSEL: // 设置选择区域
return DoSetSel(hWnd,wParam,lParam);
case EM_EMPTY: // 清空编辑区
return DoEmpty(hWnd,wParam,lParam);
case EM_SEARCHSTRING: // 查找字串
return DoSearchString(hWnd,wParam,lParam);
// Color Control
// case EM_SETCOLOR:
// return DoSetColor(hWnd,wParam,lParam);
// case EM_GETCOLOR:
// return DoGetColor(hWnd,wParam,lParam);
case WM_SETCTLCOLOR : // 设置窗口颜色
return DoSetColor(hWnd,wParam,lParam);
case WM_GETCTLCOLOR : // 得到当前窗口的颜色
return DoGetColor(hWnd,wParam,lParam);
case WM_COPY: // 拷贝选择区域字符到剪切板
return DoCopy(hWnd,wParam,lParam);
case WM_PASTE: // 粘帖
return DoPaste(hWnd,wParam,lParam);
case WM_CUT: // 剪切
return DoCut(hWnd,wParam,lParam);
case WM_CLEAR: // 清除
return DoClear(hWnd,wParam,lParam);
case WM_SETTEXT: // 设置编辑区文本
return DoSetText(hWnd,wParam,lParam);
case WM_GETTEXT: // 得到编辑区的文本
return DoGetText(hWnd,wParam,lParam);
case WM_GETTEXTLENGTH: // 得到编辑区的文本长度
return DoGetTextLength(hWnd,wParam,lParam);
case WM_PRINTCLIENT: // 将编辑区打印到指定的设备
DoPrintClient(hWnd,wParam,lParam);
break;
case WM_STYLECHANGED: // 窗口风格改变
case WM_ENABLE: // 窗口改变
return DoStyleChanged(hWnd,wParam,lParam);
// !!! Add By Jami chen in 2004.07.19
case WM_SYSCOLORCHANGE:
return DoSysColorChanged(hWnd,wParam,lParam);
// !!! Add End By Jami chen in 2004.07.19
default:
// default procedure
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// **************************************************
// 声明:static LRESULT InitialPDAEdit(HWND hWnd,LPARAM lParam)
// 参数:
// IN hWnd -- 窗口句柄
// IN lParam -- 指向CREATESTRUCT的指针,可以为NULL。
// 返回值:成功返回0,否则返回-1。
// 功能描述:创建编辑控件
// 引用:
// **************************************************
static LRESULT InitialPDAEdit(HWND hWnd,LPARAM lParam) // initial PDAEdit State data
{
LPEDITITEM lpEditItem;
LPCREATESTRUCT lpcs;
LPPDAEDITPROPERTY lpPDAEditProperty;
DWORD dwStyle;
int nFormatLen;
lpcs = (LPCREATESTRUCT) lParam; // structure with creation data
// RETAILMSG(1,(TEXT("Enter InitialPDAEdit ...\r\n")));
// Get Edit Window struct PDAEDITPROPERTY data
lpPDAEditProperty=(LPPDAEDITPROPERTY)lpcs->lpCreateParams;
dwStyle=lpcs->style; // 得到窗口风格
dwStyle&=~ES_MULTIITEMEDIT; // 清除多条目编辑的风格
SetWindowLong(hWnd,0,NULL); // 设置窗口扩展为空
// allocate memory to struct EDITITEM
lpEditItem=(LPEDITITEM)malloc(sizeof(EDITITEM));
// allocate failare then return FALSE
if (lpEditItem==NULL)
{
/// SendNotificationMsg(hWnd,EN_ERRSPACE);
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -