MFC高级控件RichEdit2.0的使用



MFC高级控件RichEdit的使用


RichEdit控件,可以设置编辑框内不同的行、不同的段落有不同的字体、颜色。
效果如下:

在这里插入图片描述

1、添加一个对话框,设置如下(下图上面的框是RichEdit2.0控件,下面的框是编辑框):

在这里插入图片描述

2、给上图这两个控件设置关联的成员变量(控件类型):

在这里插入图片描述

在这里插入图片描述

3、在类向导中添加对话框虚函数OnInitDialog

BOOL CMFCApplication1Dlg::OnInitDialog()
{
    
    
	
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	DWORD dwOldStyle = m_redit.GetExStyle();	//默认包含透明属性
	m_redit.ModifyStyleEx(dwOldStyle, WS_EX_CLIENTEDGE);	//去除透明属性
	//m_redit.SetBackgroundColor(TRUE, GetSysColor(COLOR_3DFACE));
	m_redit.SetBackgroundColor(FALSE, RGB(30, 30, 30));

	CHARFORMAT2 cf2;
	//memset(&cf2, 0, sizeof(CHARFORMAT2));
	cf2.cbSize = sizeof(CHARFORMAT2);
	cf2.dwMask = CFM_FACE | CFM_SIZE | CFM_COLOR;
	_tcscpy_s(cf2.szFaceName, _countof(cf2.szFaceName), _T("隶书"));
	cf2.yHeight = 320;
	cf2.crTextColor = 255;	设置默认字体颜色
	//cf2.crTextColor = RGB(0, 255, 0);	//也可以用RGB宏
	cf2.dwEffects = CFE_AUTOCOLOR & 0xBFFFFFFF;	//缺省为CFE_AUTOCOLOR 0x40000000
	
	m_redit.SetDefaultCharFormat(cf2);

	m_redit.SetWindowTextW(_T("---欢迎使用本软件---\r\n"));
	m_redit.SetSel(-1, -1);
	m_redit.ReplaceSel(_T("祝你聊天愉快\r\n"));


	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

4、编写发送按钮处理函数

void CMFCApplication1Dlg::OnBnClickedOk()
{
    
    
	//CRichEditCtrl使用大全http://www.cppblog.com/kyelin/archive/2010/11/03/132300.aspx
	UpdateData(TRUE);
	CString str;
	COleDateTime time = COleDateTime::GetCurrentTime();
	str.Format(_T("梦飞龙卷风<[email protected]>   %d:%d:%d\r\n"), time.GetHour(), time.GetMinute(), time.GetSecond());

	CHARFORMAT2 cf2;
	cf2.cbSize = sizeof(CHARFORMAT2);
	cf2.dwMask = CFM_FACE | CFM_SIZE | CFM_COLOR;
	cf2.crTextColor = RGB(210, 115, 25);
	cf2.yHeight = 160;
	cf2.dwEffects = 0;
	_tcscpy_s(cf2.szFaceName, _countof(cf2.szFaceName), _T("宋体"));

	m_redit.SetSel(-1, -1);
	//m_redit.SetSel(m_redit.GetTextLength(), -1);
	//m_redit.SetDefaultCharFormat(cf2);
	m_redit.SetSelectionCharFormat(cf2);
	
	m_redit.ReplaceSel(str);

	GetDlgItemText(IDC_EDT_INPUT, str);
	cf2.dwMask |= CFM_UNDERLINE | CFM_BOLD | CFM_ITALIC;
	cf2.dwEffects |= CFE_UNDERLINE | CFE_BOLD | CFE_ITALIC;
	cf2.dwEffects &= 0xBFFFFFFF;
	_tcscpy_s(cf2.szFaceName, _countof(cf2.szFaceName), _T("楷体"));
	cf2.yHeight = 250;
	cf2.crTextColor = RGB(190, 160, 250);
	m_redit.SetSel(-1, -1);
	//m_redit.SetSel(m_redit.GetTextLength(), -1);
	m_redit.SetSelectionCharFormat(cf2);

	
	m_redit.ReplaceSel(str + _T("\r\n"));

	//cf2.dwEffects &= ~CFE_UNDERLINE;

	m_edit.SetSel(0, -1);
	m_edit.Clear();

	UpdateData(FALSE);
	
	m_edit.SetFocus();
	/*CWnd* pWnd = GetDlgItem(IDC_EDT_INPUT);
	HWND hWnd = pWnd->GetSafeHwnd();
	::SetFocus(hWnd);*/
}

MFC控件设置焦点,实现回车后编辑框内容清空,焦点停留在该编辑框内


  1. 设置对话框控件的tab order。 按Ctrl+D即可看见。将需要被设置到焦点的控件的tab order设为1。

  2. 代码设置(实现回车后编辑框内容清空,焦点停留在该编辑框内):

	m_edit.SetSel(0, -1);
	m_edit.Clear();

	UpdateData(FALSE);
	
	m_edit.SetFocus();
  1. 其他代码设置方式
	//方式一
	myedit1.SetFocus();	//设置焦点
    //myedit1是控件变量名
	
	//方式而
    CWnd* pWnd = GetDlgItem(IDC_EDIT1);//设置焦点
    pWnd->SetFocus();

	//方式三
    CWnd* pWnd2 = GetDlgItem(IDC_EDIT2);
    HWND hWnd = pWnd2->GetSafeHwnd();
    ::SetFocus(hWnd);  //设置焦点
    //全局函数
    //返回值:若函数调用成功,则返回原先拥有键盘焦点的窗口句柄。若hWnd参数无效或窗口未与调用线程的消息队列相关,则返回值为NULL
  1. 其他参考
    对话框的OnInitDialog返回FALSE。解释如下:(摘抄至msdn)

If OnInitDialog returns nonzero, Windows sets the input focus to the first control in the dialog box.
The application can return 0 only if it has explicitly set the input focus to one of the controls in the dialog box.

  1. 转载
    用回车键替代TAB键传递焦点比较符合我们的输入习惯,在MFC中实现的大致不走如下:

1、建立一个基于对话框的MFC应用程序;

2、在对话框中添加若干编辑框和控件,按住ctrl+D键设置焦点顺序(例如你想编辑框IDC_EDIT1设置为第一个焦点,只需要第一个点这个编辑框即可,接下来的依次点就可以了);

3、将所有编辑框的属性中mutilline和want return设为true;

4、在dlg类中重载PreTranslateMessage函数,如下所示:

BOOL **Dlg::PreTranslateMessage(MSG pMsg)//传递焦点
{
// TODO: 在此添加专用代码和/或调用基类

if((pMsg->message == WM_KEYDOWN) && (VK_RETURN == (int) pMsg->wParam))
{
    if(GetFocus()->GetDlgCtrlID() != IDOK)
    {
        pMsg->wParam = VK_TAB;
    }
}

return CDialogEx::PreTranslateMessage(pMsg);

}

注意:1、IDOK为对话框中的缺省按钮ID,若对话框的缺省按钮已更改,则写相对应的缺省按钮的ID号;
2、此方法可以实现在编辑框之间的依次切换,当遇到第一个按钮控件时(一般设置为缺省按钮),按下回车键相当于执行鼠标点击该按钮的功能。
————————————————
版权声明:本文为CSDN博主「hswangjiajia」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hswangjiajia/article/details/12979379

猜你喜欢

转载自blog.csdn.net/zhaopeng01zp/article/details/128560052
今日推荐