📄 multiple.c
字号:
/***************************************************
Copyright(c) 版权所有,1998-2003微逻辑。保留所有权利。
***************************************************/
/**************************************************
文件说明:多条目编辑类
版本号:1.0.0.456
开发时期:2001-12-26
作者:Jami chen 陈建明
修改记录:
2004.07.19 增加消息功能WM_SYSCOLORCHANGE, 用于在在系统颜色重新
设置后,需要重新装载新的颜色
**************************************************/
//#include "StdAfx.h"
#include "eframe.h"
#include "eWindows.h"
//#include "Resource.h"
#include <estring.h>
//#include <memory.h>
//#include <CTYPE.h>
//#include "Show.h"
#include "eedit.h"
#include "eebase.h"
//#include <gwmesrv.h>
#include <eobjcall.h>
//#define _MAPPOINTER
// define const
#define MULTIITEMEDIT classMULTIEDIT
static const char classMULTIEDIT[]={"MultiItemEdit"};
// This function for debug
//void ErrorDisplay(LPCTSTR lpCaption);
// function declare area
LRESULT CALLBACK MultiItemEditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
ATOM RegisterMultiItemEditClass(HINSTANCE hInstance);
extern int GetTextHeight(HWND hWnd);
static void ReleaseMultiItemEdit(HWND hWnd);
//static void DoSizeChanged(HWND hWnd,WPARAM wParam,LPARAM lParam);
static void ReSetItemPos(HWND hWnd,int iChangedSequence,int nChangedLine,BOOL bRedraw);
static void ClearBottomBlankArea(HWND hWnd);
static int GetItemSequence(HWND hWnd,LPEDITITEM lpEditItem);
static int VScrollMultiItemEdit(HWND hWnd,int nScrollLine);
static void HScrollMultiItemEdit(HWND hWnd,int xScrollPos);
static BOOL AdjustCaretPosition(HWND hWnd);
static void SetMIEditVScrollRange(HWND hWnd,int nTotalLine,int nWindowLine);
static void SetMIEditScrollPage(HWND hWnd);
static void SetMIEditVScrollPos(HWND hWnd,int nNewScrollPos);
static int DoVScrollWindow(HWND hWnd,WPARAM wParam,LPARAM lParam);
static void DoHScrollWindow(HWND hWnd,WPARAM wParam,LPARAM lParam);
//static int GetPageLine(HWND hWnd);
static void SetMIEditHScrollPos(HWND hWnd,int nNewScrollPos);
//static void DoDisplayChanged(HWND hWnd,WPARAM wParam,LPARAM lParam);
void SetCaretToNextItem(HWND hWnd,LPEDITITEM lpEditItem);
//static BOOL MoveCaret(HWND hWnd,int nScrollLine);
static BOOL MoveCaret(HWND hWnd,int nScrollLine,int iHorzPos);
static BOOL SetEditItem(HWND hWnd,LPEDITITEM lpEditItem,LPEDITITEMPROPERTY lpEditItemProperty,int iItemStartPos);
static LRESULT DoGetThumb(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoKeyDown(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT InitialMultiItemEdit(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoPaint(HWND hWnd,HDC hdc);
static LRESULT DoSize(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoWindowPosChanged(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 LRESULT DoLButtonUp(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoProcessChar(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 DoPrintClient(HWND hWnd,WPARAM wParam,LPARAM lParam);
//static LRESULT DoNoticeSetFocus(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoCharFromPos(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoGetFirstVisibleLine(HWND hWnd,WPARAM wParam,LPARAM lParam);
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 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 DoSetText(HWND hWnd , WPARAM wParam ,LPARAM lParam);
static LRESULT DoSetItemText(HWND hWnd , WPARAM wParam ,LPARAM lParam);
static LRESULT DoGetText(HWND hWnd , WPARAM wParam ,LPARAM lParam);
static LRESULT DoGetItemText(HWND hWnd , WPARAM wParam ,LPARAM lParam);
static LRESULT DoGetTextLength(HWND hWnd , WPARAM wParam ,LPARAM lParam);
static LRESULT DoGetItemTextLength(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 DoEmpty(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoInsertItem(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoSetItem(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoDeleteItem(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoSetItemCallBack(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoGetActiveItem(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 LRESULT DoGetItemStyle(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoSetItemStyle(HWND hWnd,WPARAM wParam,LPARAM lParam);
static LRESULT DoSysColorChanged(HWND hWnd,WPARAM wParam,LPARAM lParam);
static void DoGetCaretPosition(HWND hWnd,WPARAM wParam,LPARAM lParam);
/**************************************************
声明:ATOM RegisterMultiItemEditClass(HINSTANCE hInstance)
参数:
IN hInstance -- 实例句柄
返回值:返回系统注册结果
功能描述:注册多条目编辑类
引用:
************************************************/
ATOM RegisterMultiItemEditClass(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)MultiItemEditProc;
// 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_ARROW);
// no background
wcex.hbrBackground = 0;
// no menu
wcex.lpszMenuName = NULL; // no menu ,add to future
// class name
wcex.lpszClassName = MULTIITEMEDIT;
// no small icon
// wcex.hIconSm = NULL;
// register this class
return RegisterClass(&wcex);
}
/**************************************************
声明:LRESULT CALLBACK MultiItemEditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
参数:
IN hWnd -- 窗口句柄
IN uMsg -- 要处理的消息
IN wParam -- 消息参数
IN lParam -- 消息参数
返回值:消息处理结果
功能描述:处理多条目编辑类消息。
引用:
************************************************/
LRESULT CALLBACK MultiItemEditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_CREATE: // 创建窗口
// Create a window use this class
return InitialMultiItemEdit(hWnd,wParam,lParam);
case WM_COMMAND: // 命令消息
break;
case WM_PAINT:
// Paint this window
hdc = BeginPaint(hWnd, &ps); // Get hdc
// ClearBottomBlankArea(hWnd);
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_SETFOCUS: // 设置焦点
return DoSetFocus(hWnd,wParam,lParam);
case WM_KILLFOCUS: // 杀死焦点
return DoKillFocus(hWnd,wParam,lParam);
case WM_LBUTTONDOWN: // 鼠标左键按下
return DoLButtonDown(hWnd,wParam,lParam);
case WM_MOUSEMOVE: // 鼠标移动
return DoMouseMove(hWnd,wParam,lParam);
case WM_LBUTTONUP: // 鼠标左键弹起
return DoLButtonUp(hWnd,wParam,lParam);
case WM_CHAR: // 字符输入
return DoProcessChar(hWnd,wParam,lParam);
case WM_KEYDOWN: // 键盘消息
return DoKeyDown(hWnd,wParam,lParam);
case WM_DESTROY: // 破坏窗口
// close this window
ReleaseMultiItemEdit(hWnd);
break;
case WM_VSCROLL: // 垂直滚动
DoVScrollWindow(hWnd,wParam,lParam);
break;
case WM_HSCROLL: // 水平滚动
DoHScrollWindow(hWnd,wParam,lParam);
break;
case WM_PRINTCLIENT: // 打印客户区数据
DoPrintClient(hWnd,wParam,lParam);
break;
// !!! 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
case EM_CHARFROMPOS: // 得到指定点的字符
return DoCharFromPos(hWnd,wParam,lParam);
case EM_GETFIRSTVISIBLELINE: // 得到第一个可见行的索引
return DoGetFirstVisibleLine(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_GETSEL: // 得到编辑区的选择区域
return DoGetSel(hWnd,wParam,lParam);
case EM_GETPASSWORDCHAR: // 得到条目的密码字符
return DoGetPasswordChar(hWnd,wParam,lParam);
case EM_GETTHUMB: // 得到垂直滚动条滚动块的位置
return DoGetThumb(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);
// new message
case EM_INSERTITEM: // 在指定条目下插入一个条目
return DoInsertItem(hWnd,wParam,lParam);
case EM_SETITEM: // 设置指定条目的文本
return DoSetItem(hWnd,wParam,lParam);
case EM_DELETEITEM: // 删除指定条目
return DoDeleteItem(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 EM_GETITEMTEXT: // 得到指定条目编辑区的文本
return DoGetItemText(hWnd,wParam,lParam);
case EM_SETITEMTEXT: // 设置指定条目的文本
return DoSetItemText(hWnd,wParam,lParam);
case EM_GETITEMTEXTLENGTH: // 得到指定条目编辑区的文本长度
return DoGetItemTextLength(hWnd , wParam ,lParam);
case EM_SETITEMCALLBACK: // 设置指定条目的回调函数指针
return DoSetItemCallBack(hWnd,wParam,lParam);
case EM_GETACTIVEITEM: // 得到激活条目的索引
return DoGetActiveItem(hWnd,wParam,lParam);
// 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 EM_GETITEMSTYLE: // 得到指定条目的风格
return DoGetItemStyle(hWnd,wParam,lParam);
case EM_SETITEMSTYLE: // 设定指定条目的风格
return DoSetItemStyle(hWnd,wParam,lParam);
case EM_GETCARETPOS: // 得到光标位置
DoGetCaretPosition(hWnd,wParam,lParam);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -