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

📄 richeditctrlex.cpp

📁 信使小精灵,是一个简易的聊天工具。主要是演示了网络编程的主要步骤。本程序使用封装好的函数库
💻 CPP
字号:
// richeditctrlex.cpp : implementation file
//

#include "stdafx.h"
#include "richeditctrlex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

///////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//菜单 ID
#define ID_RICH_UNDO			(WM_USER + 101)
#define ID_RICH_CUT             (WM_USER + 102)
#define ID_RICH_COPY            (WM_USER + 103)
#define ID_RICH_PASTE           (WM_USER + 104)
#define ID_RICH_CLEAR           (WM_USER + 105)
#define ID_RICH_SELECTALL       (WM_USER + 106)
#define ID_RICH_SETFONT         (WM_USER + 107)

//设置鼠标形状触发器 ID
#define SETCURSOR_TIMER			(WM_USER + 201)
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CRichEditCtrlEx

CRichEditCtrlEx::CRichEditCtrlEx()
{
}

CRichEditCtrlEx::~CRichEditCtrlEx()
{
}


BEGIN_MESSAGE_MAP(CRichEditCtrlEx, CRichEditCtrl)
	//{{AFX_MSG_MAP(CRichEditCtrlEx)
	ON_WM_KILLFOCUS()
	ON_WM_CREATE()
	ON_WM_RBUTTONDOWN()
	ON_WM_RBUTTONUP()
	ON_COMMAND(ID_RICH_COPY, OnCopy)
	ON_COMMAND(ID_RICH_CUT, OnCut)
	ON_COMMAND(ID_RICH_PASTE, OnPaste)
	ON_COMMAND(ID_RICH_SELECTALL, OnSelectAll)
	ON_COMMAND(ID_RICH_UNDO, OnUndo)
	ON_COMMAND(ID_RICH_CLEAR, OnClear)
	ON_COMMAND(ID_RICH_SETFONT, OnSelectFont)
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRichEditCtrlEx message handlers
int CRichEditCtrlEx::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CRichEditCtrl::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here	
	SetScrollRange(SB_VERT, 0, MAX_LINECOUNT);
	
	return 0;
}

void CRichEditCtrlEx::OnKillFocus(CWnd* pNewWnd) 
{
	CRichEditCtrl::OnKillFocus(pNewWnd);
	
	if( (NULL != m_hWnd) && (::IsWindow(m_hWnd)) )
	{
		UnSelect();
	}
}

void CRichEditCtrlEx::OnCopyEx()
{
	long lTextLen = GetTextLength();
	UINT nSelText = ( (lTextLen > 0) && (GetSelectionType() != SEL_EMPTY) );
	if(nSelText)
	{
		Copy();
	}
}

void CRichEditCtrlEx::OnCopy() 
{
	Copy();
}

void CRichEditCtrlEx::OnCut()
{
	Cut();
}

void CRichEditCtrlEx::OnPaste()
{
	Paste();
}

void CRichEditCtrlEx::OnSelectAll()
{
	SetSel(0, -1); 
}

void CRichEditCtrlEx::OnUndo()
{
	Undo(); 
}

void CRichEditCtrlEx::OnClear()
{	
	HideSelection(TRUE, FALSE);
	SetReadOnly(FALSE);

	try 
	{		
		OnSelectAll();
		Clear();
		
		UnSelect();
	}
	catch(...) {}

	SetReadOnly();
	HideSelection(FALSE, FALSE);
}

void CRichEditCtrlEx::OnSelectFont() 
{
	// TODO: Add your command handler code here
	CHARFORMAT cf;
	LOGFONT lf;
	memset(&cf, 0, sizeof(CHARFORMAT));
	memset(&lf, 0, sizeof(LOGFONT));

	//判断是否选择了内容
	BOOL bSelect = (GetSelectionType() != SEL_EMPTY) ? TRUE : FALSE;
	if (bSelect)
	{
		GetSelectionCharFormat(cf);
	}
	else
	{
		GetDefaultCharFormat(cf);
	}

	//得到相关字体属性
	BOOL bIsBold = cf.dwEffects & CFE_BOLD;
	BOOL bIsItalic = cf.dwEffects & CFE_ITALIC;
	BOOL bIsUnderline = cf.dwEffects & CFE_UNDERLINE;
	BOOL bIsStrickout = cf.dwEffects & CFE_STRIKEOUT;

	//设置属性
	lf.lfCharSet = cf.bCharSet;
	lf.lfHeight = cf.yHeight/15;
	lf.lfPitchAndFamily = cf.bPitchAndFamily;
	lf.lfItalic = bIsItalic;
	lf.lfWeight = (bIsBold ? FW_BOLD : FW_NORMAL);
	lf.lfUnderline = bIsUnderline;
	lf.lfStrikeOut = bIsStrickout;
	sprintf(lf.lfFaceName, cf.szFaceName);
	
	CFontDialog dlg(&lf);
	dlg.m_cf.rgbColors = cf.crTextColor;
	if (dlg.DoModal() == IDOK)
	{
		dlg.GetCharFormat(cf);			//获得所选字体的属性
		if (bSelect)
		{
			SetSelectionCharFormat(cf);	//为选定的内容设定所选字体
		}
		else
		{
			SetWordCharFormat(cf);		//为将要输入的内容设定字体
		}
	}
}

void CRichEditCtrlEx::OnRButtonDown(UINT nFlags, CPoint point) 
{
	//设置为焦点
	SetFocus();

	CRichEditCtrl::OnRButtonDown(nFlags, point);
}

void CRichEditCtrlEx::OnRButtonUp(UINT nFlags, CPoint point) 
{
	//设置为焦点
	SetFocus();

	//创建一个弹出式菜单
	CMenu tPopmenu;
	tPopmenu.CreatePopupMenu();

	//添加菜单项目
	//tPopmenu.AppendMenu(0, ID_RICH_UNDO, "&Undo");
	//tPopmenu.AppendMenu(0, MF_SEPARATOR);
	//tPopmenu.AppendMenu(0, ID_RICH_CUT, "&Cut");
	tPopmenu.AppendMenu(0, ID_RICH_COPY, "复制 (&C)");
	//tPopmenu.AppendMenu(0, ID_RICH_PASTE, "&Paste");
	tPopmenu.AppendMenu(0, MF_SEPARATOR);
	tPopmenu.AppendMenu(0, ID_RICH_CLEAR, "清除 (&R)");
	tPopmenu.AppendMenu(0, MF_SEPARATOR);
	tPopmenu.AppendMenu(0, ID_RICH_SELECTALL, "全选 (&A)");
	//tPopmenu.AppendMenu(0, MF_SEPARATOR);
	//tPopmenu.AppendMenu(0, ID_RICH_SETFONT, "Select &Font");

	//初始化菜单项
	long lTextLen = GetTextLength();

	//UINT nUndo=(CanUndo() ? 0 : MF_GRAYED );
	//tPopmenu.EnableMenuItem(ID_RICH_UNDO, MF_BYCOMMAND|nUndo);
	//UINT nPaste=(CanPaste() ? 0 : MF_GRAYED) ;
	//tPopmenu.EnableMenuItem(ID_RICH_PASTE, MF_BYCOMMAND|nPaste);	

	UINT nSelText = ( (lTextLen > 0) && (GetSelectionType() != SEL_EMPTY) ) ? MF_ENABLED : MF_GRAYED;
	//tPopmenu.EnableMenuItem(ID_RICH_CUT, MF_BYCOMMAND|nSelText);
	tPopmenu.EnableMenuItem(ID_RICH_COPY, MF_BYCOMMAND|nSelText);

	UINT nClear = (lTextLen > 0) ? MF_ENABLED : MF_GRAYED;
	tPopmenu.EnableMenuItem(ID_RICH_CLEAR, MF_BYCOMMAND|nClear);

	long lStartChar = 0;
	long lEndChar = 0;
	GetSel(lStartChar, lEndChar);
	long lSelTextLen = lEndChar - lStartChar;
	UINT nSelAll = ( (lTextLen > 0) && (lSelTextLen < lTextLen) ) ? MF_ENABLED : MF_GRAYED;
	tPopmenu.EnableMenuItem(ID_RICH_SELECTALL, MF_BYCOMMAND|nSelAll);

	//把鼠标形状设置为标准箭头
	SetTimer(SETCURSOR_TIMER, 0, NULL);

	//显示菜单
	CPoint pt;
	GetCursorPos(&pt);	
	tPopmenu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
	tPopmenu.DestroyMenu();

	CRichEditCtrl::OnRButtonUp(nFlags, point);
}

void CRichEditCtrlEx::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if( SETCURSOR_TIMER == nIDEvent )
	{
		KillTimer(nIDEvent);

		SetFocus();
		SetCursor(::LoadCursor(NULL, IDC_ARROW));
	}
	
	CRichEditCtrl::OnTimer(nIDEvent);
}

///////////////////////////////////////////////////////////////////////
BOOL CRichEditCtrlEx::AppendText(LPCTSTR lpszText, COLORREF clrText, 
								 BOOL bAddDateTime /*= TRUE*/)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	if( (NULL == lpszText) || (0 == strlen(lpszText)) ) return FALSE;
	
	if( (NULL != m_hWnd) && (::IsWindow(m_hWnd)) )
	{
		CHARFORMAT   tCharFormat;
		memset(&tCharFormat,0,sizeof(CHARFORMAT));
		
		tCharFormat.cbSize=sizeof(CHARFORMAT);
		tCharFormat.dwMask=CFM_COLOR;
		tCharFormat.crTextColor=clrText;
		//SetWordCharFormat(tCharFormat);

		CString strDateTime("");

		if( bAddDateTime )
		{
			SYSTEMTIME tSysTime;
			GetLocalTime(&tSysTime);		
			strDateTime.Format("==> %04ld-%02ld-%02ld   %02ld:%02ld:%02ld.%03ld -- ", 
				tSysTime.wYear, tSysTime.wMonth, tSysTime.wDay,
				tSysTime.wHour, tSysTime.wMinute, tSysTime.wSecond, 
				tSysTime.wMilliseconds);
		}

		CString strText = (CString)lpszText;
		if( strText.FindOneOf("\r\n") == -1 )
		{
			strText += (CString)"\n";
		}

		CString strLogInfo = strDateTime + strText;
		CString strTextOut = strLogInfo;
		
		//首先记住当前选择的位置,
		//如果光标处于末尾且没有选择文字,就让光标一直处于末尾
		//如果已经选择了文字,选择的范围不变
		long lStartChar = 0;
		long lEndChar = 0;
		GetSel(lStartChar, lEndChar);
		long lTextLen = GetTextLength();		
		if( lEndChar > lTextLen ) 
		{
			UnSelect();
			lEndChar = lTextLen;			
		}
		BOOL bAtTheEndOf = (lEndChar == lTextLen);

		UnSelect();
		SetWordCharFormat(tCharFormat);
		ReplaceSel(strTextOut, FALSE);
		
		if( bAtTheEndOf )
		{
			lTextLen = GetTextLength();			
			lStartChar = lTextLen;
			lEndChar = lStartChar;			
		}
		
		SetSel(lStartChar, lEndChar);
		////
	
		if( bAtTheEndOf )
		{
			LineScroll(3);
		}
		else
		{
			LineScroll(0);
		}

		int nLineCount = GetLineCount();
		if( nLineCount > MAX_LINECOUNT-1 )
		{
			OnClear();
		}
	}

	return TRUE;
}

void CRichEditCtrlEx::UnSelect()
{
	SetSel(-1,-1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -