📄 fedit.h
字号:
/******************************************************************************\
*
* 文件名: FWindow.h
* 目的: 定义FEdit类
* 使用说明: FEdit类是对FString的Windows实现,F的用意是指Free
* 即任何人都可以修改它为己所用。
* 在保持此程序完整性的情况下,你可以任意传播它。你也可以修改它
* 来为你服务,如果你要将此程序用于商业目的,请告知我。
*
* CopyLeft 2002 张元一
*
* CopyLeft 是自由软件基金会(FSF)推荐使用的自由软件的标志
*
\******************************************************************************/
#ifndef FWINDOW_H
#define FWINDOW_H
//定义消息ID,此消息用于通知父窗口,当前行列位置已发生改变
#define WM_LCCHANGED 10001
#include <windows.h>
#include <iostream.h>
#include "fedit.h"
#include "resource.h"
#include "fstring.h"
class FEdit
{
//当前字符所占页数
int Page;
//窗口左上角坐标
int xPos,yPos;
//鼠标左键是否按下标志
bool LBDownFlag;
//文件是否已被保存过
bool SaveFlag;
//静态常量,表明FEdit类是否已被注册过
static bool IsClassRegistered;
static HMENU hMenu;
//注册窗口类
bool RegisterClassEx(HINSTANCE hInst);
protected:
HFONT hf;
//字符高宽
int cWidth,cHeight;
int X,Y;
//窗口高宽
int Width,Height;
//字符串缓冲区
FString Str;
//后端缓存
HDC m_hdcBack;
//用于后端缓存的位图
HBITMAP m_BmpBack;
//处理鼠标左键单击消息
//检查指定点是否在窗口显示区域内
bool PosInRect(int x,int y);
//设置滚动条
void SetScrollBar(HWND hWnd);
//调整插入符位置,使其在用户区可见
void AdjustCaretPos();
void SetBackGround();
void SetMenu()
{
if(!IsSelEmpty())
{
EnableMenuItem(hMenu,IDM_CUT,MF_BYCOMMAND|MF_ENABLED);
EnableMenuItem(hMenu,IDM_COPY,MF_BYCOMMAND|MF_ENABLED);
EnableMenuItem(hMenu,IDM_DELETE,MF_BYCOMMAND|MF_ENABLED);
}
else
{
EnableMenuItem(hMenu,IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
EnableMenuItem(hMenu,IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
EnableMenuItem(hMenu,IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
}
if(CanUndo())
EnableMenuItem(hMenu,IDM_UNDO,MF_ENABLED);
else
EnableMenuItem(hMenu,IDM_UNDO,MF_GRAYED);
if(CanRedo())
EnableMenuItem(hMenu,IDM_REDO,MF_ENABLED);
else
EnableMenuItem(hMenu,IDM_REDO,MF_GRAYED);
}
virtual void OnLButtonDown(HWND hWnd);
//处理光标位置改变消息
virtual void OnLCChanged(){SetMenu();}
//处理鼠标移动消息
virtual void OnMouseMove(HWND hWnd);
//处理水平滚动条消息
virtual void OnHScroll(WPARAM wParam,LPARAM lParam);
//处理垂直滚动条消息
virtual void OnVScroll(WPARAM wParam,LPARAM lParam);
//初始化编辑框
virtual void InitEdit(HWND hWnd);
//处理WM_PAINT消息
virtual void OnDraw(HDC hDC);
//处理WM_SIZE消息
virtual void OnSize(HWND hWnd);
//处理WM_CHAR消息
virtual void OnChar(WPARAM wParam, LPARAM lParam);
//处理WM_KEYDOWN消息
virtual void OnKeyDown(HWND hWnd,WPARAM wParam, LPARAM lParam);
//消息处理函数
virtual LRESULT WndProc(HWND hWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam);
//消息处理函数管理函数
static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam);
public:
static COLORREF hBgColor;
static COLORREF hTextColor;
static HBITMAP hBackGround;
static char BGFile[256];
//窗口句柄
HWND m_hWnd;
//存储当前文件名
char FileName[MAX_PATH];
FEdit(void)
{
SaveFlag=true;
strcpy(FileName,"无标题");
m_hWnd=NULL;
Page=1;
Width=Height=0;
cWidth=8;
cHeight=16;
X=Y=5;
xPos=yPos=0;
LBDownFlag=false;
hf=(HFONT)GetStockObject(ANSI_FIXED_FONT);
}
virtual ~FEdit(void){
DeleteObject(m_hdcBack);
DeleteObject(m_BmpBack);
}
//创建编辑窗口
virtual bool CreateEx(HINSTANCE hInst,HWND hParent,int x, int y,
int nWidth, int nHeight);
//获得当前行号
int GetLine(){return Str.GetLine();}
//获得当前列号
int GetColumn(){return Str.GetColumn();}
//显示窗口
BOOL ShowWindow(int nCmdShow) const
{
return ::ShowWindow(m_hWnd, nCmdShow);
}
//更新窗口
BOOL UpdateWindow(void) const
{
return ::UpdateWindow(m_hWnd);
}
//选区是否为空
bool IsSelEmpty(){return Str.IsSelEmpty();}
//文件是否保存
bool IsSaved(){return SaveFlag;}
//清空缓冲区
void InitBuffer()
{
SelectAll();
DeleteSel();
HideCaret(m_hWnd);
AdjustCaretPos();
SetScrollBar(m_hWnd);
InvalidateRect(m_hWnd,NULL,false);
}
//保存文件
bool SaveFile()
{
SaveFlag=true;
return Str.SaveFile(FileName);
}
//大开文件
bool OpenFile()
{
Str.InitBuffer();
SaveFlag=true;
FILE *fp;
fp=fopen(FileName,"r");
if(fp==0) return false;
Str.ReadFile(fp);
/* while((c=getc(fp))!=EOF)
{
if(c==0x09)
{
if((Str.GetPos()-1)%4!=0)
while((Str.GetPos()-1)%4!=0)
Str.Insert(0x20);
else
for(int i=0;i<4;i++)
Str.Insert(0x20);
}
else
Str.Insert(c);
}*/
fclose(fp);
Str.GetLineWidth(1);
SetScrollBar(m_hWnd);
InvalidateRect(m_hWnd,NULL,false);
return true;
}
//将选取粘到剪贴板
bool CopySel();
//删除选区
void DeleteSel()
{
Str.DeleteSel();
SaveFlag=false;
InvalidateRect(m_hWnd,NULL,false);
}
//从剪贴板粘帖字符
bool PasteChar();
//全部选择
void SelectAll()
{
Str.SelectAll();
SetMenu();
SendMessage(GetParent(m_hWnd),WM_LCCHANGED,0,0);
InvalidateRect(m_hWnd,NULL,false);
}
//跳至指定行
bool GotoLine(int line)
{
HideCaret(m_hWnd);
if(line<1&&line>Str.GetTotalLine())
return false;
Str.MoveToPos(line,1);
AdjustCaretPos();
SetScrollBar(m_hWnd);
InvalidateRect(m_hWnd,NULL,false);
return true;
}
//查找目标字符串
bool Find(char* content,bool up,bool icmp);
//替换
bool Replace(char* src,char *dst,bool icmp);
//替换全部
bool ReplaceAll(char* src,char* dst,bool icmp);
//插入日期及时间,需要说明的是由于中国处与东8区,
//因此需要在小时上加上8方可得到正确的时间
void Insert(char* str)
{
HideCaret(m_hWnd);
Str.Insert(str);
AdjustCaretPos();
SetScrollBar(m_hWnd);
OnDraw(GetDC(m_hWnd));
}
void InsertTimeDate()
{
SYSTEMTIME SysTime;
char cTime[256];
GetSystemTime(&SysTime);
sprintf(cTime,"公元%d年%d月%d日 %d:%d:%d",SysTime.wYear,
SysTime.wMonth,SysTime.wDay,(SysTime.wHour+8)%24,
SysTime.wMinute,SysTime.wSecond);
Str.Insert(cTime);
SaveFlag=false;
HideCaret(m_hWnd);
AdjustCaretPos();
SetScrollBar(m_hWnd);
InvalidateRect(m_hWnd,NULL,false);
}
void Undo()
{
Str.Ud();
SendMessage(GetParent(m_hWnd),WM_LCCHANGED,0,0);
SaveFlag=false;
HideCaret(m_hWnd);
AdjustCaretPos();
SetScrollBar(m_hWnd);
InvalidateRect(m_hWnd,NULL,false);
}
void Redo()
{
Str.Rd();
SendMessage(GetParent(m_hWnd),WM_LCCHANGED,0,0);
SaveFlag=false;
HideCaret(m_hWnd);
AdjustCaretPos();
SetScrollBar(m_hWnd);
InvalidateRect(m_hWnd,NULL,false);
}
bool CanUndo(){return Str.CanUndo();}
bool CanRedo(){return Str.CanRedo();}
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -