C++ MFC / VS2013 edit control 编辑框 逐行显示 txt ,显示多行,底部更新

txt逐行读取并显示
一. 多行txt, 编辑框显示成一行
void CFaceTemptureDlg::OnButtonClick_SO2()
{
	// TODO:  在此添加控件通知处理程序代码
	CString strLine, strTemp, result;
	int row = 0;
	CString filename = L"111.txt";
	CStdioFile file(L"111.txt", CFile::modeRead);

	while (file.ReadString(strLine))
	{
		//char *str = strLine.GetBufferSetLength(strLine.GetLength());
		char *str = (char *)strLine.GetBufferSetLength(strLine.GetLength());
		char *p;
		if (strLine != "")
		{
			result += strLine;
			GetDlgItem(IDC_Edit_SO2)->SetWindowText(result);
			row++;
			
		}
	}
	file.Close();   
   若文件内容为:
        2017/9/2  13:25  45
        2017/9/3  14:65  59
   读取结果为:
   编辑框显示一行:2017/9/2  13:25  452017/9/3  14:65  59
                             

缺陷 读中文则出现乱码
能解决此问题的,请留言,非常感谢!
二.多行txt,编辑框显示多行(原样显示)
void CFaceTemptureDlg::OnButtonClick_SO2()
{
	CString strLine, strTemp, result;
	int row = 0;
	CString filename = L"111.txt";
	CStdioFile file(L"111.txt", CFile::modeRead);

	while (file.ReadString(strLine))
	{
		//char *str = strLine.GetBufferSetLength(strLine.GetLength());
		char *str = (char *)strLine.GetBufferSetLength(strLine.GetLength());
		//char *p;
		if (strLine != "")
		{
			result += _T("\r\n") + strLine;
			//result += strLine;
			GetDlgItem(IDC_Edit_SO2)->SetWindowText(result);
			GetDlgItem(IDC_Edit_SO2)->UpdateWindow();
			//result = " ";
			row++;
		}
	}
	file.Close();
}

若txt内容为:
2017/9/2 13:25 45
2017/9/3 14:65 59
2017/9/10 52:69 45 96
2016/9/5 56:3 33
2016/6/5 5:3 06
2019/9/6/10 12:20 11
2019/3/5 10:11 12
2013/45/52 22:2 55
2012/2/1 22:56 23
2012/2/12 12:89 55
2015/1/2 2:23 12
2015/1/2 3:10 70
2015/1/2 4:15 12
2015/1/2 5:16 13
2015/1/3 6:2 15


显示结果:
            
关键:
将 
			result += strLine;
改成:
			result += _T("\r\n") + strLine;

三. 编辑框在底部显示最新内容
前提:添加编辑框的控件变量,本例是,CEdit类: m_Edit_SO2   (由于已经添加过了,所以显示不成黑色)
           
法一:
void CFaceTemptureDlg::OnButtonClick_SO2()
{
	// TODO: Add your command handler code here 

	/完美,滚动到底部
	CString strLine, strTemp, result;
	int row = 0;
	CString filename = L"111.txt";
	CStdioFile file(L"111.txt", CFile::modeRead);

	while (file.ReadString(strLine))
	{
	char *str = (char *)strLine.GetBufferSetLength(strLine.GetLength());
	if (strLine != "")
	{
	    result += _T("\r\n") + strLine;
	    GetDlgItem(IDC_Edit_SO2)->SetWindowText(result);
	    GetDlgItem(IDC_Edit_SO2)->UpdateWindow();
		m_Edit_SO2.LineScroll(m_Edit_SO2.GetLineCount(), 0);
	    row++;

	}
	}
	file.Close();  
	/
}
总结:
1. 区别:
第二部分显示内容,看到最上面的内容,txt底部的内容在下面但是看不到;
而这次则,上面的内容看不到,底部的内容能看到。(可对比两张结果图)
2. 和之前代码比添加了:
		m_Edit_SO2.LineScroll(m_Edit_SO2.GetLineCount(), 0);
显示结果如下:
                        
 法二:
 
void CFaceTemptureDlg::OnButtonClick_SO2()
{
	// TODO: Add your command handler code here 

	/完美,滚动到底部
	CString strLine, strTemp, result;
	int row = 0;
	CString filename = L"111.txt";
	CStdioFile file(L"111.txt", CFile::modeRead);

	while (file.ReadString(strLine))
	{
	char *str = (char *)strLine.GetBufferSetLength(strLine.GetLength());
	if (strLine != "")
	{
	    result += _T("\r\n") + strLine;
	    GetDlgItem(IDC_Edit_SO2)->SetWindowText(result);
	    GetDlgItem(IDC_Edit_SO2)->UpdateWindow();
		//m_Edit_SO2.LineScroll(m_Edit_SO2.GetLineCount(), 0);
		m_Edit_SO2.SendMessage(WM_VSCROLL, SB_BOTTOM, 0);
	    row++;

	}
	}
	file.Close();  
	/
}
添加了:
m_Edit_SO2.SendMessage(WM_VSCROLL, SB_BOTTOM, 0);
结果同上
总结:
		m_Edit_SO2.LineScroll(m_Edit_SO2.GetLineCount(), 0);
		m_Edit_SO2.SendMessage(WM_VSCROLL, SB_BOTTOM, 0);
这两行代码等价(可选择任意一个)
四:添加滚动条
设置Edit Control控件的一些属性
①设置Edit Control 属性Multiline为true,表示该控件支持多行
②设置Want Return 属性设置为true,表示该控件支持换行输入
③设置Vertical Scrollbar 属性为true,表示该控件具有垂直滚动条
                                                                          

五.  VC(MFC) edit控件滚动条自动到达底部的几种实现












  • 7
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以使用CEdit类的SetWindowText函数将十六进制格式的字符串显示edit control上。 具体步骤如下: 1. 在对应的对话框类中定义CEdit类型的变量来操作edit control。 例如: ```c++ class CMyDialog : public CDialogEx { public: CMyDialog(CWnd* pParent = nullptr); // 标准构造函数 virtual ~CMyDialog(); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_MY_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 afx_msg void OnBnClickedButtonOpen(); afx_msg void OnBnClickedButtonSend(); afx_msg void OnBnClickedButtonClear(); afx_msg LRESULT OnReceiveData(WPARAM wParam, LPARAM lParam); // 串口数据接收消息处理函数 protected: CEdit m_editReceive; // ... }; ``` 在这个例子中,可以看到定义了一个名为m_editReceive的CEdit类型的变量,用于操作接收数据的edit control。 2. 接收串口数据,并转化为十六进制格式的字符串。 通常使用异步操作来接收串口数据,可以在Create函数后使用SetCommMask来设置需要的事件,如EV_RXCHAR,表示有数据接收事件。可以在OnReceiveData消息处理函数中将接收到的数据转化为十六进制格式的字符串。 这里使用一个名为HexToStr的函数来将十六进制格式的数据转化为字符串。 ```c++ LRESULT CMyDialog::OnReceiveData(WPARAM wParam, LPARAM lParam) { DWORD dwRead; BYTE szTemp[4096] = { 0 }; CString strText, strTemp; if (wParam == ID_COM_PORT) //串口事件 { if (lParam & EV_RXCHAR) //有字符接收 { if (ReadFile(m_hComm, szTemp, sizeof(szTemp), &dwRead, nullptr)) { strTemp = HexToStr(szTemp, dwRead); // 将接收到的数据转化为十六进制格式的字符串 strText = m_editReceive.GetText(); // 获取edit control显示内容 strText += strTemp; // 将新接收到的数据添加到显示内容后面 m_editReceive.SetWindowText(strText); // 将新的显示内容设置到edit control中 } } } return 0; } ``` 3. 实现HexToStr函数。 HexToStr函数可以将字节数组转化为十六进制格式的字符串。 ```c++ CString HexToStr(BYTE* pData, DWORD dwLength) { CString strResult; for (DWORD i = 0; i < dwLength; i++) { CString strHex; strHex.Format(_T("%02X"), pData[i]); strResult += strHex + _T(" "); // 格式化为十六进制格式的字符串 } return strResult; } ``` 4. 在界面的初始化函数OnInitDialog中设置edit control显示格式。 可以在OnInitDialog函数中使用SetLimitText设置edit control的最大字符数,使用SetReadOnly设置edit control为只读,防止用户修改。 ```c++ BOOL CMyDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: 在此添加额外的初始化 m_editReceive.SetLimitText(10240); // 设置最大字符数 m_editReceive.SetReadOnly(TRUE); // 设置只读 return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值