📄 extrichedit.cpp
字号:
{
temfacepos[i].nPos = temfacepos[i].nPos - newgif * 2 - newbmp * 19 ; //插入picture picture只占一个字符的空间 而插入前占用3个字符
SetSel(temfacepos[i].nPos ,temfacepos[i].nPos + 3 );
CString filepath;
filepath.Format("face\\%d.gif",temfacepos[i].nFaceIndex );
InsertFace(filepath,temfacepos[i].nFaceIndex);
vecFace.insert(vecFace.begin() + frontface + newgif,temfacepos[i]);
newgif ++;
}
else
{
CString substr;
substr = str.Mid(temfacepos[i].nPos - InsertP,temfacepos[i].nPos + 21 - InsertP);
temfacepos[i].nPos = temfacepos[i].nPos - newgif * 2 - newbmp * 19; //插入picture picture只占一个字符的空间 而插入前占用3个字符
SetSel(temfacepos[i].nPos ,temfacepos[i].nPos + 21);
CString filepath;
filepath.Format("image\\%s",substr);
substr = filepath;
strcpy(temfacepos[i].filename ,substr);
InsertFace(substr,-1);
vecbmp.insert(vecbmp.begin() + frontbmp + newbmp,temfacepos[i]);
newbmp ++;
}
}
temfacepos.clear();
for(int i = vecFace.size() - 1;i > count + frontface;i --)
{
vecFace[i].facecount = vecFace[i].facecount + count + bmpcount;
vecFace[i].nPos = vecFace[i].nPos + count + bmpcount;
}
for(int i = vecbmp.size() - 1;i > bmpcount + frontbmp;i --)
{
vecbmp[i].facecount = vecFace[i].facecount + count + bmpcount;
vecbmp[i].nPos = vecFace[i].nPos + count + bmpcount;
}
}
int CExtRichEdit::GetFrontText(long InsertP,int &facecount,int &bmpcount)
{
facecount = GetFaceCount(InsertP);
bmpcount = GetBmpCount(InsertP);
return InsertP + facecount + bmpcount;
}
int CExtRichEdit::GetFaceCount(long InsertP)
{
int count = 0;
for(int i = 0;i < m_facecount - m_bmpcount;i ++)
if(vecFace[i].nPos > InsertP)
break;
else
count ++;
return count;
}
int CExtRichEdit::GetBmpCount(long InsertP)
{
int count = 0;
for(int i = 0;i < m_bmpcount;i ++)
if(vecbmp[i].nPos > InsertP)
break;
else
count ++;
return count;
}
////更新vecFace
//参数:beg需要更新的开始位置,end需要更新的结束位置,facecount picture变化的数目,nPos显示位置的偏移量,add是添加后更新还是删除后更新(true添加后更新,false删除后更新)
void CExtRichEdit::UpDataFace(int beg,int end,int facecount,int nPos,bool add)
{
for(int i = beg;i <= end;i ++)
{
if(add)
{
vecFace[i].facecount = vecFace[i].facecount + facecount;
vecFace[i].nPos = vecFace[i].nPos + nPos;
}
else
{
vecFace[i].facecount = vecFace[i].facecount - facecount;
vecFace[i].nPos = vecFace[i].nPos - nPos;
}
}
}
//获取当前richedit的字符串 表情文件以转义字符表示 其他文件以#+id转义 表示
//参数:str翻译后的字符串 Sel是否只翻译指定的片段(true翻译选择的片段 ,false翻译整个文本 )
//返回值:选中的内容里有 几个picture
int CExtRichEdit::GetEditText(CString &str,bool Sel)
{
int count = 0,bmpcount = 0,facecount = 0;
long selstart = 0 ,selend = 0;
if(Sel)
{
str = GetSelText();
GetSel(selstart,selend); //将图标看成是一个字符
}
else
GetWindowText(str);
if(selstart == 0 && selend == 0)
{
vector<FacePosition> temPostion;
for(int i = 0;i < m_facecount - m_bmpcount;i ++)
{
temPostion.push_back(vecFace[i]);
}
for(int i = 0;i < m_bmpcount;i ++)
{
temPostion.push_back(vecbmp[i]);
}
bool less_than(FacePosition &face1, FacePosition &face2); //声明排序的"条件"函数
sort(temPostion.begin(), temPostion.end(),less_than); //详见我的ObjectSort工程中的说明。可参见《Essential C++》P84
for(int i = 0 ;i < temPostion.size();i ++)
{
int j = temPostion[i].nPos + bmpcount * 20 + facecount * 2;
str.Delete(j - selstart);
if(temPostion[i].nFaceIndex == -1)
{
bmpcount ++;
str.Insert(j - selstart,temPostion[i].filename);
}
else
{
facecount ++;
str.Insert(j - selstart,facestr[vecFace[i].nFaceIndex]);
}
}
count = m_facecount;
}
else
{
vector<FacePosition> temPostion;
for(int i = 0;i < m_facecount - m_bmpcount;i ++)
{
int j = vecFace[i].nPos ;
if(j >= selstart && j <= selend )
{
temPostion.push_back(vecFace[i]);
}
}
for(int i = 0;i < m_bmpcount;i ++)
{
int j = vecbmp[i].nPos ;
if(j >= selstart && j <= selend)
{
temPostion.push_back(vecbmp[i]);
}
}
bool less_than(FacePosition &face1, FacePosition &face2); //声明排序的"条件"函数
sort(temPostion.begin(), temPostion.end(),less_than); //详见我的ObjectSort工程中的说明。可参见《Essential C++》P84
for(int i = 0 ;i < temPostion.size();i ++)
{
int j = temPostion[i].nPos + bmpcount * 20 + facecount * 2;
str.Delete(j - selstart);
if(temPostion[i].nFaceIndex == -1)
{
bmpcount ++;
str.Insert(j - selstart,temPostion[i].filename);
}
else
{
facecount ++;
str.Insert(j - selstart,facestr[vecFace[i].nFaceIndex]);
}
}
}
return count;
}
int CExtRichEdit::DelEditText(CString &str,bool Sel )
{
int count = 0;
long selstart = 0 ,selend = 0;
if(Sel)
{
str = GetSelText();
int len = str.GetLength();
GetSel(selstart,selend); //将图标看成是一个字符
}
else
GetWindowText(str);
if(selstart == 0 && selend == 0)
{
for(int i = 0;i < m_facecount;i ++)
{
int j = vecFace[i].nPos + vecFace[i].facecount;
str.Delete(j - selstart);
str.Insert(j - selstart,facestr[vecFace[i].nFaceIndex]);
}
vecFace.clear();
count = m_facecount;
m_facecount = 0;
}
else
{
int delface[100];
int index = 0;
for(int i = 0;i < m_facecount;i ++)
{
int j = vecFace[i].nPos + + count * 2;
if(j >= selstart && j <= selend + + count * 2)
{
str.Delete(j - selstart);
str.Insert(j - selstart,facestr[vecFace[i].nFaceIndex]);
delface[index ++] = i;
count ++;
}
}
for(int i = 0 ;i < index;i ++)
vecFace.erase(vecFace.begin() + delface[i] - i);
m_facecount = m_facecount - index;
UpDataFace(delface[0],m_facecount - 1,index,str.GetLength() - 2 * index,false);
}
return count;
}
//获取表情文件的index号
//参数:facename表情文件的字符串转意符 (如::) )
//返回值:表情文件的index号 当返回值为-1时表示不是默认的表情文件
int CExtRichEdit::GetFaceName(CString &facename)
{
/*for(int i = 0;i < FACE_COUNT; i ++ )
if(strcpy(facename,cfacename[i]) == 0)
return i;
return -1;*/
return -1;
}
//拷贝数据 当从richedit内拷贝数据时将gif bmp jpg等图象文件转换成CString后在以 CString来拷贝
//参数:del是否是用来剪切
//返回值:选择的段里有 多少pictrue
int CExtRichEdit::copy_data(bool del)
{
/* int pos;
DWORD dwUSer;
int c = GetIRichEditOle()->GetObjectCount();
for(int i = 0 ; i < c ; i++) //遍历位图
{
REOBJECT object; //位图信息存在这里
memset(&object,0,sizeof(REOBJECT));
object.cbStruct = sizeof(REOBJECT);
GetIRichEditOle()->GetObject(i,&object,REO_GETOBJ_ALL_INTERFACES);
pos = object.cp ; //位图的位置信息
dwUSer = object.dwUser; //位图的信息,之前应用程序设置的,应有程序当然知道什么意思了
}*/
int count = 0;
CString str ;
if(!del)
count = GetEditText(str,true);
else
count = DelEditText(str,true);
int len = str.GetLength();
LPSTR pGlobal;
HGLOBAL hGlobal;
OpenClipboard();
EmptyClipboard();
hGlobal=GlobalAlloc(GHND|GMEM_SHARE,(lstrlen(str)+1)*sizeof(TCHAR));
pGlobal=(LPSTR)GlobalLock(hGlobal);
lstrcpy(pGlobal, str);
GlobalUnlock(hGlobal);
SetClipboardData(CF_TEXT, hGlobal);
CloseClipboard();
return count;
}
//剪切
void CExtRichEdit::cut_data()
{
copy_data(true);
keybd_event(VK_DELETE,0,1,0);
keybd_event(VK_DELETE,0,3,0);
}
//粘贴数据 当从数据是从richedit内拷贝来的时候 将转换成字符串的图片文件转换成相应的图片文件显示
void CExtRichEdit::paste_data()
{
char * buffer;
if ( OpenClipboard() )
{
if(IsClipboardFormatAvailable(CF_HDROP)) //获取粘贴的文件名
{
int i;
int cch;
LPSTR lpszFile;
HDROP hDrop=(HDROP)GetClipboardData(CF_HDROP);
int iFiles = DragQueryFile(hDrop,-1,NULL,0);
for (i=0;i<iFiles;i++)
{
cch=DragQueryFile(hDrop,i,NULL,0);
lpszFile=(LPSTR)GlobalAlloc(GPTR,cch+1);
DragQueryFile(hDrop,i,lpszFile,cch+1);
GlobalFree(lpszFile);
}
}
if (!IsClipboardFormatAvailable(CF_TEXT))
return ;
HANDLE hData = GetClipboardData(CF_TEXT);
buffer = (char*)GlobalLock(hData);
GlobalUnlock(hData);
CloseClipboard();
CString str = buffer;
InsertText(str);
}
}
//删除选中内容
void CExtRichEdit::delet_data()
{
CString str ;
DelEditText(str,true);
keybd_event(VK_DELETE,0,1,0);
keybd_event(VK_DELETE,0,3,0);
}
//拷贝文件
void CExtRichEdit::copyfile()
{
CFileDialog dlg(TRUE, _T(".bmp,.gif,.jpg,.ico"), NULL, OFN_HIDEREADONLY, "图片文件 (*.bmp,*.gif,*.jpg,*.ico)|*.bmp||", this);
if( IDOK != dlg.DoModal() )
{
return ;
}
CString str = dlg.GetPathName();
int position = 0;
position = str.Find(_T(".bmp"),position);
if(position == -1)
return ;
char filename[40];
char tem_char[40];
int m = 0,i = 0;
for( i = str.GetLength() - 1;i >=0 ;i --)
{
if(str[i] == '.')
break;
tem_char[m ++] = str[i];
}
tem_char[m] ='.';
tem_char[m + 1] = 0;
m = 0;
int j;
for( j = strlen(tem_char) - 1 ;j >= 0;j --)
filename[m ++] = tem_char[j];
filename[m] = 0;
//------------------------------获取当前目录-------------------------------------//
char temchar[160];
// memset(temchar,0,160);
GetCurrentDirectory(160,temchar);
CString temstr,filepath = temchar;
temstr.Format("\\image");
filepath = filepath + temstr;
recursive_create_dir(filepath);
char file_name[30];
CString date;
COleDateTime now = COleDateTime::GetCurrentTime();
date = now.Format("%Y%m%d");
///////设置时间显示
CString tem;
tem = now.Format("%H%M%S");
date =date + "-" + tem;
for( i = 0;i < date.GetLength();i ++)
{
file_name[i + 1 ] = date.GetAt(i);
}
file_name[0] = '{';
file_name[i + 1] = '}';
for(j = i + 2;j - i - 2 < strlen(filename);j ++)
file_name[j] = filename[j - i - 2];
file_name[j] = 0;
temstr.Format("\\%s",file_name);
filepath = filepath + temstr;
recursive_create_dir(filepath);
//..................................获取当前目录...................................//
CopyFile(str,filepath,false); //拷贝文件
InsertFace(filepath);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -