?? 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 + -