📄 edit.cpp
字号:
// edit.cpp: implementation of the edit class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "myeditor.h"
#include "edit.h"
#include "commdlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
edit::edit()
{
}
edit::~edit()
{
}
void edit::gethwnd(HWND hwnd) //获得主窗口句柄,参数为主窗口句柄
{
hWnd=hwnd;
}
void edit::gethwndedit(HWND hwnd) //获得编辑框句柄,参数为编辑框句柄
{
hWndEdit=hwnd;
}
void edit::FontInitialize (HWND hWndEdit) //字体初始化,参数为编辑框句柄
{
GetObject (GetStockObject (DEFAULT_GUI_FONT), sizeof (LOGFONT),
(PTSTR) &logfont) ;
hFont = CreateFontIndirect (&logfont) ;
SendMessage (hWndEdit, WM_SETFONT, (WPARAM) hFont, 0) ;
}
void edit::FileInitialize (OPENFILENAME *ofn) //初始化OPENFILENAME结构,参数为OPENFILENAME结构体指针
{
static TCHAR szFilter[] = TEXT ("文本文件 (*.txt)\0*.txt\0") \
TEXT ("所有文件 (*.*)\0*.*\0\0") ;
ofn->lStructSize = sizeof (OPENFILENAME) ;
ofn->hwndOwner = hWnd ;
ofn->hInstance = NULL ;
ofn->lpstrFilter = szFilter ;
ofn->lpstrCustomFilter = NULL ;
ofn->nMaxCustFilter = 0 ;
ofn->nFilterIndex = 0 ;
ofn->lpstrFile = NULL ;
ofn->nMaxFile = MAX_PATH ;
ofn->lpstrFileTitle = NULL ;
ofn->nMaxFileTitle = MAX_PATH ;
ofn->lpstrInitialDir = NULL ;
ofn->lpstrTitle = NULL ;
ofn->Flags = 0 ;
ofn->nFileOffset = 0 ;
ofn->nFileExtension = 0 ;
ofn->lpstrDefExt = TEXT ("txt") ;
ofn->lCustData = 0L ;
ofn->lpfnHook = NULL ;
ofn->lpTemplateName = NULL ;
}
//处理打开对话框,参数为OPENFILENAME结构体指针、文件名字符串指针和带路径文件名字符串指针,返回打开操作是否完成的BOOL值
BOOL edit::FileOpenDlg (OPENFILENAME *ofn, PTSTR pstrFileName, PTSTR pstrTitleName)
{
ofn->hwndOwner = hWnd ;
ofn->lpstrFile = pstrFileName ;
ofn->lpstrFileTitle = pstrTitleName ;
ofn->Flags = OFN_HIDEREADONLY | OFN_CREATEPROMPT ;
return GetOpenFileName (ofn) ;
}
//处理另存为对话框,参数为OPENFILENAME结构体指针、文件名字符串指针和带路径文件名字符串指针,返回另存为操作是否完成的BOOL值
BOOL edit::FileSaveDlg (OPENFILENAME *ofn, PTSTR pstrFileName, PTSTR pstrTitleName)
{
ofn->hwndOwner = hWnd ;
ofn->lpstrFile = pstrFileName ;
ofn->lpstrFileTitle = pstrTitleName ;
ofn->Flags = OFN_OVERWRITEPROMPT ;
return GetSaveFileName (ofn) ;
}
//文件读取并在编辑框中显示,参数为指向文件的指针,返回是否打开文件成功
BOOL edit::FileRead ( PTSTR hFile)
{
HANDLE hBuffer;
LPSTR pBuffer;
long lPos1,lPos2;
int iFile;
//打开文件
iFile=_lopen(hFile,OF_READ);
//判断所需缓存大小
lPos1=_llseek(iFile,0l,1);
lPos2=_llseek(iFile,0l,2);
_llseek(iFile,lPos1,0);
//分配缓冲区
hBuffer = LocalAlloc(LMEM_MOVEABLE|LMEM_ZEROINIT,lPos2+1);
//判断是否分配成功
if ( hBuffer==NULL ) return FALSE;
pBuffer=(LPSTR)LocalLock(hBuffer);
_lread(iFile,pBuffer,(WORD)lPos2);
_lclose(iFile);
pBuffer[(WORD)lPos2] = '\0' ;
SetWindowText (hWndEdit, (PTSTR) pBuffer) ;
LocalUnlock(hBuffer) ;
LocalFree(pBuffer);
return TRUE;
}
//文件写入操作,参数为指向文件的指针,返回是否写入文件成功
BOOL edit::FileWrite ( PTSTR pstrFileName)
{
LPSTR pBuffer;
HANDLE hBuffer;
int hFile;
long iLength;
OFSTRUCT OfStruct;
//判断所需缓存大小
iLength = GetWindowTextLength (hWndEdit) ;
//分配缓冲区
hBuffer = LocalAlloc(LMEM_MOVEABLE|LMEM_ZEROINIT , iLength+2);
//判断是否分配成功
if ( hBuffer==NULL ) return FALSE;
pBuffer = (LPSTR)LocalLock(hBuffer);
GetWindowText (hWndEdit, pBuffer, iLength + 1) ;
hFile=OpenFile(pstrFileName, &OfStruct, OF_CREATE|OF_WRITE);
//写入文件
_lwrite(hFile, pBuffer, iLength);
_lclose(hFile);
return TRUE;
}
//处理字体对话框并改变字体,参数为CHOOSEFONT结构体指针,HFONT变量和表示文件是否被编辑的变量指针
void edit::SetFont(CHOOSEFONT *cf, HFONT hSetFont, BOOL *fChange)
{
cf->lStructSize=sizeof(CHOOSEFONT);
cf->hwndOwner=hWndEdit;
cf->lpLogFont=&lf;
cf->rgbColors=RGB(0,0,0);
cf->nFontType=SCREEN_FONTTYPE;
cf->hDC = NULL ;
cf->iPointSize = 0 ;
cf->Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS | CF_EFFECTS ;
cf->lCustData = 0 ;
cf->lpfnHook = NULL ;
cf->lpTemplateName = NULL ;
cf->hInstance = NULL ;
cf->lpszStyle = NULL ;
cf->nFontType = 0 ;
cf->nSizeMin = 0 ;
cf->nSizeMax = 0 ;
if (ChooseFont(cf))
{
hDC=GetDC(hWnd);
hSetFont=CreateFontIndirect(cf->lpLogFont);
SelectObject(hDC,hSetFont);
SetTextColor(hDC,cf->rgbColors);
SendMessage (hWndEdit, WM_SETFONT, (WPARAM) hSetFont, 1) ;
GetClientRect (hWndEdit, &rect) ;
InvalidateRect (hWndEdit, &rect, TRUE) ;
*fChange=TRUE; //标记为已修改
}
}
//处理查找对话框,参数为指向FINDREPLACE的指针,返回查找消息句柄
HWND edit::FindFindDlg (LPFINDREPLACE pfr)
{
pfr->lStructSize = sizeof (FINDREPLACE) ;
pfr->hwndOwner = hWnd ;
pfr->hInstance = NULL ;
pfr->Flags = FR_HIDEUPDOWN ;
pfr->lpstrFindWhat = szFindText ;
pfr->lpstrReplaceWith = NULL ;
pfr->wFindWhatLen = sizeof(szFindText);
pfr->wReplaceWithLen = 0 ;
pfr->lCustData = 0 ;
pfr->lpfnHook = NULL ;
pfr->lpTemplateName = NULL ;
return FindText (pfr) ;
}
//处理查找对话框,参数为指向FINDREPLACE的指针,返回替换消息句柄
HWND edit::FindReplaceDlg (LPFINDREPLACE pfr)
{
pfr->lStructSize = sizeof (FINDREPLACE) ;
pfr->hwndOwner = hWnd ;
pfr->hInstance = NULL ;
pfr->Flags = FR_HIDEUPDOWN ;
pfr->lpstrFindWhat = szFindText ;
pfr->lpstrReplaceWith = szReplText ;
pfr->wFindWhatLen = sizeof(szFindText) ;
pfr->wReplaceWithLen = sizeof(szReplText) ;
pfr->lCustData = 0 ;
pfr->lpfnHook = NULL ;
pfr->lpTemplateName = NULL ;
return ReplaceText (pfr) ;
}
//查找的实现,参数为查找字符串的长度变量的指针,指向FINDREPLACE的指针,返回查找是否成功
BOOL edit::FindFindText ( int * piSearchOffset, LPFINDREPLACE pfr)
{
pfr->lpstrFindWhat = szFindText ;
// 读档
iLength = GetWindowTextLength (hWndEdit) ;
if (NULL == (pstrDoc = (PTSTR) malloc ((iLength + 1) * sizeof (TCHAR))))
return FALSE ;
GetWindowText (hWndEdit, pstrDoc, iLength + 1) ;
// 在整个文档中查找字符串
pstrPos = _tcsstr (pstrDoc + * piSearchOffset, pfr->lpstrFindWhat) ;
free (pstrDoc) ;
// 如果没找到则返回FALSE
if (pstrPos == NULL)
return FALSE ;
iPos = pstrPos - pstrDoc ;
* piSearchOffset = iPos + lstrlen (pfr->lpstrFindWhat) ;
// 选中查找文本
SendMessage (hWndEdit, EM_SETSEL, iPos, * piSearchOffset) ;
SendMessage (hWndEdit, EM_SCROLLCARET, 0, 0) ;
return TRUE ;
}
//查找下一个,参数为查找字符串的长度变量的指针,指向FINDREPLACE的指针,返回查找是否成功
BOOL edit::FindNextText ( int * piSearchOffset,LPFINDREPLACE pfr)
{
pfr->lpstrFindWhat = szFindText ;
return FindFindText ( piSearchOffset, pfr) ;
}
BOOL edit::FindReplaceText ( int * piSearchOffset, LPFINDREPLACE pfr) //替换
{
// 查找文本
if (!FindFindText ( piSearchOffset, pfr))
return FALSE ;
// 替换文本
SendMessage (hWndEdit, EM_REPLACESEL, 0, (LPARAM) pfr->lpstrReplaceWith) ;
* piSearchOffset = iPos + lstrlen (pfr->lpstrReplaceWith);
// 选种替换后的字符
SendMessage (hWndEdit, EM_SETSEL, iPos, * piSearchOffset) ;
return TRUE ;
}
//检查是否有需查找的字符串,返回查找字符串是否为空
BOOL edit::FindValidFind (void) //检查是否有需查找的字符串
{
return * szFindText != '\0' ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -