⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extrichedit.cpp

📁 类似QQ,MSN表情的richedit,用来测试表情控件的
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		{
			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 + -