RichEdit控件 追加新行

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

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

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

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

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


谢谢!
...全文
1078 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
Aist-memory 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到想换行的位置

15,980

社区成员

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

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