在多行文本控件中.怎样才能移动到第一行可见?

a99899s1 2017-04-22 11:05:45


如图,用CRichEditCtrl控件输出多行文本,第一行移上去了,怎么才能移动到第一行,使第一行可见,
我是在对话框初始化的时候设置的文本,并且该窗口初始化完成后是隐藏的,,
第一次显示这个窗口的时候,第一行文本移动到上面去了,不能看到,
需要移动滚动条才能看到第一行文本.
试过LineScroll(),ScrollWindow(),都不管用,
这个窗口只有这一个控件,没有别的了.如果再添加一个按扭,并显示,这时编辑框文本就直接显示到第一行了,
加了这个按扭,LineScroll(),这个函数就变管用了,
但这就是个帮助关于窗口,.有一个文本控件就够了,没必要再有个按扭,
问下,怎么才能在初始化完成后,第一次显示这个窗口时文本显示是第一行?在没有其他控件的情况下.
...全文
237 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2017-04-25
  • 打赏
  • 举报
回复
多行 edit 请使用 Replace ,而不是 SetWindowText
schlafenhamster 2017-04-25
  • 打赏
  • 举报
回复
重新调整了CHelpDlg的窗口大小 ,使用 MoveWindow()?
a99899s1 2017-04-25
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
多行 edit 请使用 Replace ,而不是 SetWindowText
ReplaceSel也是调用的SetWindowText, 这个edit只设置一次文本,用哪个都差不多吧, 这个贴虽然没有完全解决问题,但我也找到了原因,并且最终效果也达到了,就结贴吧,
a99899s1 2017-04-24
  • 打赏
  • 举报
回复
最关键的是我重新调整了富文本框的大小,,
a99899s1 2017-04-24
  • 打赏
  • 举报
回复
[quote=引用 7 楼 schlafenhamster 的回复:] .... 我找到原因了.我在初始化里,设置好编辑框文本后.然后对所有窗口的大小和位置进行了重新调整. 重设窗口大小后编辑框文本就移动了,并且我在窗口显示时,把焦点设给了这个窗口, 就是因为这2个原回.富文本框里的文本怎么也移动不到第一行, 我注释掉,SetFocus();然后在窗口大小调整后再设置文本,这时显示窗口,文本就能显示出来第一行了, 但我还有个问题.我想把设置的文本写在初台化里.怎么才能在调整窗口后,让文本显示到第一行呢? 我试过 int all = m_HelpTextEdit.GetLineCount(); m_HelpTextEdit.LineScroll(0 - all, 0); UpdateWindow(); Invalidate(); 都是没有效果的,你问我初始化里都写了啥?其实当初就写了一行设置文本的,就没有别的了, BOOL CHelpDlg::OnInitDialog() { CDialogEx::OnInitDialog(); 第一行 //设置富文本框的字体.颜色. 第二行 m_HelpTextEdit.SetWindowText(_T("...;只有这一句,关键的. } 然后 void CHelpDlg::OnShowWindow(BOOL bShow, UINT nStatus) { CDialogEx::OnShowWindow(bShow, nStatus); if (bShow == TRUE) { SetFocus(); //为了不让焦点在其他关键控件上.焦点移到了窗口. } } 然后在创建CHelpDlg的程序主窗口.重新调整了CHelpDlg的窗口大小.然后文本显示就不正常了. 但我还有个问题.我想把设置的文本写在初台化里.怎么才能在调整窗口后,让文本显示到第一行呢?
schlafenhamster 2017-04-23
  • 打赏
  • 举报
回复
"放初始化里就不管用了" 看看你的 初始化 代码
schlafenhamster 2017-04-23
  • 打赏
  • 举报
回复

//
#define CLIENT_LINES 17

DWORD CPeekCommDlg::AppendText(BYTE *pdata,UINT len,COLORREF FgColor)
{
	CharNewColor(FgColor);
//  make a sz
	BYTE *pnew=KillHalfHZ(pdata,len);
//
	LONG nStartChar;
	LONG nEndChar;
	m_RichEdit.GetSel(nStartChar,nEndChar);
	m_RichEdit.SetSel(nEndChar,nEndChar);// go end
	m_RichEdit.ReplaceSel((char*)pnew);
	delete [] pnew;
//	if (bScroll)
	{
		int all=m_RichEdit.GetLineCount();
		if(all > CLIENT_LINES) m_RichEdit.LineScroll(all-CLIENT_LINES,0);
	}
//
	return len;
}
是 // if (bScroll) { int all=m_RichEdit.GetLineCount(); if(all > CLIENT_LINES) m_RichEdit.LineScroll(all-CLIENT_LINES,0); } 产生的 结果。
schlafenhamster 2017-04-23
  • 打赏
  • 举报
回复
应该是

//
	for(int jj=0;jj<50;jj++)
	{
		AppendText((BYTE*)"haha\r\nhaha\r\n",12,RGB(255,0,0));
		AppendText((BYTE*)"wawa\r\nwawa\r\n",12,RGB(0,0,255));
	}
	int len=m_RichEdit.LineLength(0);
	m_RichEdit.Clear();
	m_RichEdit.SetSel(0,len);
	m_RichEdit.SetFocus();
	return FALSE;//TRUE;  // return TRUE  unless you set the focus to a control

a99899s1 2017-04-22
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
int all=m_RichEdit.GetLineCount(); // if(all > CLIENT_LINES) m_RichEdit.LineScroll(all-CLIENT_LINES,0); LineScroll(all,0);
不管用啊,你这代码只往上移,都移出屏了,改成0-all;就没效果, 这些代码放在按扭里是管用的,放初始化里就不管用了
schlafenhamster 2017-04-22
  • 打赏
  • 举报
回复
int all=m_RichEdit.GetLineCount(); // if(all > CLIENT_LINES) m_RichEdit.LineScroll(all-CLIENT_LINES,0); LineScroll(all,0);
a99899s1 2017-04-22
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
richEdit.LineScroll(0);
已试过,不管用,代码是在窗口初始化,没有显示的情况下执行的.显示后没果,
zgl7903 2017-04-22
  • 打赏
  • 举报
回复
richEdit.LineScroll(0);

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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