RichEdit控件 追加新行

smartdog_1 2014-01-02 10:43:38
各位前辈:

我用Win32 api 写了一个UI,使用RichEdit显示文本。

第一次添加文本时 SendMessage(hwndrich, EM_SETTEXTEX, (WPARAM)&st, (LPARAM)text);

之后再添加文本我想 换一行添加,但是不知道用什么方法了。

随着添加的行数增加,如何实现自动滚动,并且最先添加的自动向上滚动 ?


谢谢!
...全文
914 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
asksomeone 2021-06-24
  • 打赏
  • 举报
回复

BOOL AppendTextToRich(TCHAR* text, int len)
{
    //1、自动换行
    //2、自动滚动
    //3、尾行添加文本
    //4、重新开始时自动清除所有内容

    if (TxtEditor != NULL)
    {
 
        int nLen = GetWindowTextLength(TxtEditor);

        //SendMessage(hwndrich, EM_SETSEL, (WPARAM)nLen, (LPARAM)-1);
        //::SendMessage(hEdit, EM_SETSEL, -1, -1);
        SendMessage(TxtEditor, EM_SETSEL, -1, -1);
        SendMessage(TxtEditor, EM_REPLACESEL, -1, (LPARAM)(text));
        int cxPhys = GetDeviceCaps(GetDC(TxtEditor), PHYSICALWIDTH);
        SendMessage(TxtEditor, EM_SETTARGETDEVICE, (WPARAM)GetDC(TxtEditor), cxPhys / 2);

        // Create "print preview". 
        //SendMessage(hwnd, EM_SETTARGETDEVICE, (WPARAM)hdc, cxPhys / 2);
        /*SendMessage(RichText.hWnd, EM_SETTARGETDEVICE, _
            GetDC(RichText.hWnd), RichText.Width / 15)*/
        //SendMessage(TxtEditor, EM_SETSEL, -1, -1);
        //SendMessage(TxtEditor, EM_REPLACESEL, -1, (LPARAM)(text));

        //自动滚动到最后一行
        SendMessage(TxtEditor, WM_VSCROLL, SB_BOTTOM, 0);
        return TRUE;
    }
    else
        return FALSE;
}

「已注销」 2014-02-21
  • 打赏
  • 举报
回复
我不知道你是怎么写的,我给你的那段在我这里是可以的。
许文君 2014-02-21
  • 打赏
  • 举报
回复
不行就先直接获取所有内容到字符串,然后字符串追加再替换,这个肯定可以
向立天 2014-02-21
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
smartdog_1 2014-01-15
  • 打赏
  • 举报
回复
小弟目前还没结解决,希望知道的前辈能指点一下
smartdog_1 2014-01-12
  • 打赏
  • 举报
回复
使用了上面的所有方法都不行,可能是小弟其他地方弄错了。 完整的程序如下: 主代码:


// Exec.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "Exec.h"
#include <Commdlg.h>
#include <iostream>
#include <iostream>
#include <string>
#include <fstream>
#include <Richedit.h>
#include <shellapi.h>

//模块句柄
HINSTANCE gInstance = NULL;
//主窗口句柄
HWND hWnd = NULL;

BOOL AppendTextToRich(TCHAR *text, int len)
{
	//1、自动换行
	//2、自动滚动
	//3、尾行添加文本
	//4、重新开始时自动清除所有内容
	
	if (hWnd != NULL)
	{
		HWND hwndrich=GetDlgItem(hWnd, IDC_RICHEDIT2_LOG);  	
		
		int nLen = GetWindowTextLength(hwndrich);

		//SendMessage(hwndrich, EM_SETSEL, (WPARAM)nLen, (LPARAM)-1);
		//::SendMessage(hEdit, EM_SETSEL, -1, -1);
		SendMessage(hwndrich, EM_SETSEL, -1, -1);
		SendMessage(hwndrich, EM_REPLACESEL, 0, (LPARAM)(text));

		SendMessage(hwndrich, EM_SETSEL, -1, -1);
		SendMessage(hwndrich, EM_REPLACESEL, 0, (LPARAM)(text));

		//自动滚动到最后一行
		SendMessage(hwndrich, WM_VSCROLL, SB_BOTTOM, 0);
		return TRUE;	
	}
	else
		return FALSE;
}

BOOL CALLBACK DialogProc(HWND hDlg, UINT uMsg,  
	WPARAM wParam, LPARAM lParam)  
{  
	BOOL fReturn = TRUE;  
	HICON hIcon = NULL;
	HANDLE hfile = NULL;
	DWORD dwsize = 0;
	
	LOGFONT LogFont = {0};
	HFONT hFont = NULL;
	HWND hWndStatic = NULL;

	hWnd = hDlg;//保持窗口句柄

	switch(uMsg)  
	{  
	case WM_CLOSE:
		EndDialog(hDlg, NULL);
		break;
	case WM_INITDIALOG:
		hIcon = LoadIcon(gInstance, MAKEINTRESOURCE(IDI_ICON));
		SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon);

		//设置控件字体	
		lstrcpy(LogFont.lfFaceName, _T("宋体"));
		LogFont.lfWeight = 400;
		LogFont.lfHeight = -20; // 字体大小
		LogFont.lfCharSet = 134;
		LogFont.lfOutPrecision = 3;
		LogFont.lfClipPrecision = 2;
		LogFont.lfOrientation = 45;
		LogFont.lfQuality = 1;
		LogFont.lfPitchAndFamily = 2;

		// 创建字体
		hFont = CreateFontIndirect(&LogFont);

		// 取得控件句柄
		hWndStatic = GetDlgItem(hDlg, IDC_FILE_PATH);

		// 设置控件字体
		SendMessage(hWndStatic, WM_SETFONT, (WPARAM)hFont, 0); 

		//设置Log窗口的字体大小
		LogFont.lfHeight = -15;
		SendMessage(GetDlgItem(hDlg, IDC_RICHEDIT2_LOG), WM_SETFONT, (WPARAM)hFont, 0);
		
		AppendTextToRich(_T("你好\r\n"), wcslen(_T("你好\r\n")));
		
		break;
	case WM_COMMAND:
		switch(wParam)
		{			
			case IDC_BUTTON_OPEN:				
				break;
			case  ID_RUN:				
				break;
			case IDC_EXIT:
				EndDialog(hDlg, 0);
				break;	
			default:break;
		}
		break;
	default:  
		fReturn = FALSE;  
		break;
	}  
	return fReturn;  
}  

int APIENTRY _tWinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPTSTR    lpCmdLine,
	int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

	//不装载此dll的话richedit控件不会显示
	LoadLibrary(_T("RichEd20.dll"));

	gInstance = hInstance;
	DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG_MAIN),  NULL, DialogProc, NULL);  
		
	ExitProcess(0);
}

资源文件:

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG_MAIN DIALOGEX 0, 0, 316, 180
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_NOFAILCREATE | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "执行",ID_RUN,259,79,50,14
    PUSHBUTTON      "退出",IDC_EXIT,259,134,50,14
    GROUPBOX        "打开配置文件",IDC_STATIC,2,2,313,38
    EDITTEXT        IDC_FILE_PATH,6,12,241,23,ES_AUTOHSCROLL | ES_READONLY
    PUSHBUTTON      "打开",IDC_BUTTON_OPEN,258,12,50,22
    GROUPBOX        "",IDC_STATIC,3,44,310,134
    CONTROL         "",IDC_RICHEDIT2_LOG,"RichEdit20W",ES_AUTOHSCROLL | ES_READONLY | WS_BORDER | WS_TABSTOP,8,53,241,121
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_DIALOG_MAIN, DIALOG
    BEGIN
    END
END
#endif    // APSTUDIO_INVOKED


#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#ifndef APSTUDIO_INVOKED\r\n"
    "#include ""targetver.h""\r\n"
    "#endif\r\n"
    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "#include ""windows.h""\r\n"
    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON                ICON                    "Icon.ico"
#endif    // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED


资源头文件


//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 Exec.rc 使用
//
#define IDC_MYICON                      2
#define IDD_EXEC_DIALOG                 102
#define IDM_ABOUT                       104
#define IDR_MAINFRAME                   128
#define IDD_DIALOG_MAIN                 129
#define IDI_ICON1                       134
#define IDI_ICON                        134
#define IDC_EDIT1                       1001
#define IDC_FILE_PATH                   1001
#define IDC_BUTTON_OPEN                 1002
#define IDC_RICHEDIT21                  1003
#define IDC_RICHEDIT2_LOG               1003
#define ID_RUN                          1004
#define IDC_EXIT                        1005
#define IDC_EDIT3                       1008
#define IDC_STATIC                      -1

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC                     1
#define _APS_NEXT_RESOURCE_VALUE        135
#define _APS_NEXT_COMMAND_VALUE         32771
#define _APS_NEXT_CONTROL_VALUE         1009
#define _APS_NEXT_SYMED_VALUE           110
#endif
#endif


Eleven 2014-01-09
  • 打赏
  • 举报
回复
::SendMessage(hEdit, EM_SETSEL, -1, -1); ::SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)(_T("Hello World!\r\n"))); 编辑框设置AUTO HSCROLL/VSCROLL MultiLine等属性
smartdog_1 2014-01-09
  • 打赏
  • 举报
回复
引用 3 楼 smartdog_1 的回复:
我刚才试了试,还是不能成功


BOOL AppendTextToRich(TCHAR *text, int len)
{
	//1、自动换行
	//2、自动滚动
	//3、尾行添加文本
	//4、重新开始时自动清除所有内容
	
	if (hWnd != NULL)
	{
		HWND hwndrich=GetDlgItem(hWnd,IDC_RICHEDIT2_LOG);  	
		
		for (int i = 0; i < 2; i++)
		{		
			SETTEXTEX stex = { ST_NEWCHARS, 1200 };
			SendMessage(hwndrich, EM_SETTEXTEX, (WPARAM)&stex, (LPARAM)L"\r\n");
			SendMessage(hwndrich, EM_SETTEXTEX, (WPARAM)&stex, (LPARAM)L"h a");
		}
	
		return TRUE;	
	}
	else
		return FALSE;
}


以上是我的代码,麻烦知道的给个参考
这个是选择区域,然后替换文本。但是SetSel (nLen,nLen)的两个参数怎么确定 ? 而且我要是是WIN32 API SetSel不是 WIN32 API
Isnis-fallen 2014-01-09
  • 打赏
  • 举报
回复
自定义消息, 里面用SetSel (nLen,nLen); ReplaceSel
「已注销」 2014-01-08
  • 打赏
  • 举报
回复
SETTEXTEX stex = { ST_NEWCHARS, 1200 }; SendMessage(hwnd, EM_SETTEXTEX, (WPARAM)&stex, (LPARAM)L"\r\n"); SendMessage(hwnd, EM_SETTEXTEX, (WPARAM)&stex, (LPARAM)L"hahaha");
smartdog_1 2014-01-08
  • 打赏
  • 举报
回复
我刚才试了试,还是不能成功


BOOL AppendTextToRich(TCHAR *text, int len)
{
	//1、自动换行
	//2、自动滚动
	//3、尾行添加文本
	//4、重新开始时自动清除所有内容
	
	if (hWnd != NULL)
	{
		HWND hwndrich=GetDlgItem(hWnd,IDC_RICHEDIT2_LOG);  	
		
		for (int i = 0; i < 2; i++)
		{		
			SETTEXTEX stex = { ST_NEWCHARS, 1200 };
			SendMessage(hwndrich, EM_SETTEXTEX, (WPARAM)&stex, (LPARAM)L"\r\n");
			SendMessage(hwndrich, EM_SETTEXTEX, (WPARAM)&stex, (LPARAM)L"h a");
		}
	
		return TRUE;	
	}
	else
		return FALSE;
}


以上是我的代码,麻烦知道的给个参考
oyljerry 2014-01-08
  • 打赏
  • 举报
回复
发送的字符串中添加\r\n到想换行的位置
第1章 窗口 1.1 实例1:通过HWND获得CWnd指针 1.2 实例2:获得应用程序主窗口的指针 1.3 实例3:获得指定点的窗口 1.4 实例4:最大化和最小化窗口 1.5 实例5:关闭窗口 1.6 实例6:设置窗口的大小和位置 1.7 实例7:居中显示窗口 1.8 实例8:顶层显示窗口 1.9 实例9:设置窗口图标 1.10 实例10:获得和设置窗口的标题 1.11 实例11:显示或隐藏窗口的标题栏 1.12 实例12:改变窗口形状 1.13 实例13:设置窗口的透明区域 1.14 实例14:透明窗口 1.15 实例15:窗口闪烁 1.16 实例16:图片窗口 1.17 实例17:动画窗口 1.18 实例18:桌面窗口 1.19 实例19:最小化桌面所有窗口 1.20 实例20:获取任务栏窗口 1.21 实例21:显示或隐藏任务栏 1.22 实例22:枚举桌面所有顶层窗口 第2章 菜单和光标 2.1 实例23:动态添加和删除菜单项 2.2 实例24:在系统菜单中添加和删除菜单项 2.3 实例25:禁用关闭按钮 2.4 实例26:启用和禁用菜单项 2.5 实例27:设置菜单项的检查状态 2.6 实例28:快捷菜单 2.7 实例29:获取光标的坐标 2.8 实例30:限制光标的移动范围 2.9 实例31:自定义光标 2.10 实例32:等待光标 第3章 控制栏 3.1 实例33:创建工具栏 3.2 实例34:设置工具栏标题 3.3 实例35:停靠工具栏 3.4 实例36:设置工具栏位图 3.5 实例37:为工具栏按钮添加文本标签 3.6 实例38:为工具栏按钮添加下拉箭头 3.7 实例39:为工具栏按钮设置热点图像 3.8 实例40:启用或禁用工具栏的工具提示 3.9 实例41:在工具栏中添加组合框 3.10 实例42:创建状态栏 3.11 实例43:在状态栏中添加进度条 3.12 实例44:显示或隐藏工具栏和状态栏 3.13 实例45:使用组合栏 第4章 对话框 4.1 实例46.创建模式对话框 4.2 实例47:创建非模式对话框 4.3 实例48:关闭模式对话框 4.4 实例49:关闭非模式对话框 4.5 实例50:在模式对话框中使用OK和Cancel按钮 4.6 实例51:在非模式对话框中使用OK和Cancel按钮 4.7 实例52:在对话框中添加最大化和最小化按钮 4.8 实例53:使基于对话框的程序不在任务栏中显示 4.9 实例54:使对话框大小可调整 4.10 实例55:居中显示对话框 4.11 实例56:不显示对话框 4.12 实例57;全屏显示对话框 4.13 实例58:改变对话框的背景颜色 4.14 实例59:改变对话框中控件的颜色 4.15 实例60:在对话框中输出文本 4.16 实例61:在对话框中加载菜单 4.17 实例62:在对话框中加载工具栏 4.18 实例63:在对话框中加载视图 4.19 实例64:使用Enter键控制对话框中控件的输入焦点 4.20 实例65:屏蔽对话框按Esc或Enter键退出 4.21 实例66.设置应用程序中对话框的默认颜色 4.22 实例67:创建消息对话框 4.23 实例68:实现对话框在桌面工作区的停靠 4.24 实例69:在客户区中移动对话框 第5章 框架和文档视图 5.1 实例70:禁止框架窗口在标题中显示文档名 5.2 实例71:设置文档的标题 5.3 实例72-设置框架窗口的标题 5.4 实例73:设置主框架窗口初始时大小 5.5 实例74:设置MDI子框架窗口初始时大小 5.6 实例75:最小化框架窗口 5.7 实例76:设置框架窗口最大化时的大小和位置 5.8 实例77:保存或恢复框架窗口的状态 5.9 实例78:删除SDI框架窗口中的菜单 5.10 实例79:删除MDI框架窗口中的菜单 5.11 实例80:改变视图的背景颜色 5.12 实例81:改变MDI主框架窗口的背景颜色 5.13 实例82:使MDI启动时不生成新的子窗口 5.14 实例83:排列MDI子框架窗口 5.15 实例84:在SDI中切换多视图 5.16 实例85:在SDI中动态切分窗口 5.17 实例86:在SDI中静态切分窗口 5.18 实例87:滚动视图的使用 5.19 实例88:列表视图的使用 5.20 实例89:树视图的使用 5.21 实例90:HTMI视图的使用 5.22 实例91:在视图中获得文档指针 5.23 实例92:在框架中获得当前视图指针 5.24 实例93:新建或打开文档 5.25 实例94:创建新的框架窗口 5.26 实例95:实现单文档-多视图结构 5.27 实例96:在应用程序中遍历文档模板 5.28 实例97:在文档中遍历视图 第16章 通用控件 6.1 实例98:通过控件ID获取控件窗口指针 6.2 实例99:通过控件窗口指针获取控件ID 6.3 实例100:获取指定点的控件指针 6.4 实例101:遍历控件 6.5 实例102:根据父窗口的大小改变控件的大小和位置 6.6 实例103:显示或隐藏控件 6.7 实例104:启用或禁用控件 6.8 实例105:改变控件的颜色 6.9 实例106:设置控件的焦点 6.10 实例107:为控件添加工具提示 6.11 实例108:在编辑框中追加文本 6.12 实例109:在编辑框中实现多行显示 6.13 实例110:限制编辑框输入文本的长度 6.14 实例111:限制编辑框只能输入数字 6.15 实例112:将编辑框中输入的字符转换为大写(小写) 6.16 实例113:在按钮上显示图标 6.17 实例114:实现位图按钮 6.18 实例115:设置和获取单选按钮的选中状态 6.19 实例116:设置和获取一组单选按钮的选中状态 6.20 实例117:组合框的使用 6.21 实例118:实现带自动完成功能的组合框 6.22 实例119:设置组合框中列表框的宽度 6.23 实例120:在组合框中显示文件列表 6.24 实例121:在列表框中添加水平滚动条 6.25 实例122:进度条的使用 6.26 实例123:滑块的使用 6.27 实例124:旋转按钮的使用 6.28 实例125:在列表控件中插入列 6.29 实例126:设置列表控件的显示方式 6.30 实例127:设置列表控件的背景图片 6.31 实例128:在列表控件中整行选中 6.32 实例129:在列表控件中显示网格线 6.33 实例130:在列表控件中使用复选框 6.34 实例131:在列表控件中排序表项 6.35 实例132:在树控件中插入项 6.36 实例133:在树控件中添加连线和按钮 6.37 实例134:从树控件中删除项. 6.38 实例135:展开和选择树提件项 6.39 实例136:设置树控件中项的图像 6.40 实例137:遍历树控件 6.41 实例138:如何使用标签控件 6.42 实例139:日期时间控件的使用 6.43 实例140:显示RichEdit控件 第7章 GDI 7.1 实例141:通过HDC获取CDC指针 7.2 实例142:创建屏幕DC 7.3 实例143:选择预定义的GDI对象 7.4 实例144:获取文本的长度和高度 7.5 实例145:在长文本末端显示省略号 7.6 实例146:设置文本的对齐方式 7.7 实例147:设置背景模式 7.8 实例148:绘制图形 7.9 实例149:画笔的使用 7.10 实例150:字体的使用 7.11 实例151:实现“橡皮筋”功能 7.12 实例152:显示位图资源 7.13 实例153:显示位图文件 7.14 实例154:用桌面背景填充指定区域 7.15 实例155:坐标映射 7.16 实例156:获取其他程序的图标 第8章 文件 8.1 实例157:获取或设置文件的属性 8.2 实例158:获取文件的信息 8.3 实例159:实现文件夹对话框 8.4 实例160:在列表框或组合框中显示文件和目录列表 8.5 实例161:复制文件 8.6 实例162:移动文件 8.7 实例163:删除文件 8.8 实例164:重命名文件 8.9 实例165:查找文件 8.10 实例166:使用Shell操作文件 8.11 实例167:获取应用程序的目录 8.12 实例168:获取或设置进程的当前目录 8.13 实例169:获取Windows目录和System目录 8.14 实例170:创建临时文件 8.15 实例171:创建目录 8.16 实例172:删除目录 8.17 实例173:逐行读取文本文件 8.18 实例174:在INI文件中读写数据 8.19 实例175:获取INI文件的全部段名 8.20 实例176:获取INI文件指定段的全部键名和键值 第9章 打印 9.1 实例177:通过打印对话框 …… 第10章 多线程 第11章 网络 第12章 ADO数据库 第13章 动态链接库 第14章 系统 第15章 设备管理 第16章 数据类型及转换 ......

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧