动态加入滚动条后,水平滚动条与RichEdit显示内容不能同步的问题??请大家帮助,谢谢!
动态加入滚动条后,水平滚动条与RichEdit显示内容不能同步的问题??请大家帮助,谢谢!
BOOL CCmdLineDlg::OnInitDialog()
{
CDialog::OnInitDialog();
...
if(m_iAutoHorz){
m_wndCmdRecorder.ModifyStyle(0,WS_HSCROLL);//wndCmdRecorder是一个RichEdit控制变量
}
else{
m_wndCmdRecorder.ModifyStyle(WS_HSCROLL,0);
}
问题如题,请问怎么同步呢,我要在资源里直接设置WS_HSCROLL就没有问题.
问题点数:20、回复次数:23Top
1 楼striking(庸人自扰)回复于 2006-03-14 14:48:29 得分 0
不能同步 ?是什么意思Top
2 楼xtmes(E-TECH)回复于 2006-03-14 14:56:14 得分 0
不能同步就是,滚动条的范围和显示位置都不正确.Top
3 楼striking(庸人自扰)回复于 2006-03-14 15:21:19 得分 0
// The pointer to my rich edit control.
extern CRichEditCtrl* pmyRichEditCtrl;
// Add auto horizontal and vertical scrolling.
pmyRichEditCtrl->SetOptions(ECOOP_OR, ECO_AUTOVSCROLL |
ECO_AUTOHSCROLL);
Top
4 楼xtmes(E-TECH)回复于 2006-03-14 15:38:38 得分 0
这句话加进去没有效果啊.大哥也写个对话框的程序帮我看看吧.不用写几行代码的:).先谢谢了:)!!!Top
5 楼xtmes(E-TECH)回复于 2006-03-14 15:47:14 得分 0
我在资源里已经设置了Auto属性了,应该和这个没有关系,而且我加了这个代码也没有作用呢Top
6 楼striking(庸人自扰)回复于 2006-03-14 15:55:07 得分 0
// The pointer to my rich edit control.
extern CRichEditCtrl* pmyRichEditCtrl;
int nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();
// Scroll the rich edit control so that the first visible line
// is the first line of text.
if (nFirstVisible > 0)
{
pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);
}
Top
7 楼xtmes(E-TECH)回复于 2006-03-14 21:27:15 得分 0
这样好象更不行了,
用m_wndCmdRecorder.ModifyStyle(0,WS_HSCROLL);得出来的滚动条,好象和初始化时,它自动生成的滚动条不是一个东西?Top
8 楼xtmes(E-TECH)回复于 2006-03-14 21:29:53 得分 0
我该怎么办啊~~Top
9 楼striking(庸人自扰)回复于 2006-03-15 10:29:09 得分 0
linescroll 也不行?
你有没有研究一下linescroll ?
还有你的richedit是否有这个ES_MULTILINE属性?Top
10 楼xtmes(E-TECH)回复于 2006-03-15 10:52:07 得分 0
大哥,你看明白我的意思没有"动态加入滚动条后",这里的滚动条不是一开始就有了.而且创建了RichEdit之后,我动态添加的属性.你所说的linescroll 当然可以滚动RichEdit了,但是我动态添加的水平滚动条,一是位置ScrollPos不正确,二是大小了不正确.
你可以简单地试一下就清楚了.
创建一个MFC的对话框程序,加入一个RichEdit,在资源的属性里没有WS_SCROLL|AUTO_HSCROLL属性.
现在你在对话框的OnInitDialog里面加上下面的代码:
m_wndCmdRecorder.ModifyStyle(0,WS_HSCROLL);//wndCmdRecorder是一个RichEdit控制变量
你看看这个显示的水平滚动条对不对?
Top
11 楼xtmes(E-TECH)回复于 2006-03-15 10:54:58 得分 0
另外你说的ES_MULTILINE多行属性,包括是否加'\n'这些我都有,也已经实现了加入一行后的滚动,这不是问题的所在.
关键在于水平滚动属性是不是动态添加的?
如果动态添加的,一定不对!
不管是否解决,还是谢谢您了!:)Top
12 楼xtmes(E-TECH)回复于 2006-03-15 10:59:04 得分 0
而且,好象在RichEdit中,用以下方法得不到那个水平滚动条(即使在水平滚动条已经出现的情况).太神奇了.呵呵,百思不得解.
CScrollBar* pBar=m_wndCmdRecorder.GetScrollBarCtrl(SB_HORZ);
Top
13 楼striking(庸人自扰)回复于 2006-03-15 11:21:04 得分 20
被我调出来了. 你在m_wndCmdRecorder.ModifyStyle(0,WS_HSCROLL);//wndCmdRecorder是一个RichEdit控制变量之后
重新movewindow一下.
m_wndCmdRecorder.ModifyStyle(0,WS_HSCROLL);//
if ( m_wndCmdRecorder.GetStyle() & WS_HSCROLL )
{
AfxMessageBox( "WS_HSCROLL" );
}
CRect rc;
m_wndCmdRecorder.GetClientRect( &rc );
m_wndCmdRecorder.MoveWindow( rc );
Top
14 楼striking(庸人自扰)回复于 2006-03-15 11:23:16 得分 0
最好先 load RICHED20.DLLTop
15 楼xtmes(E-TECH)回复于 2006-03-15 11:51:29 得分 0
谢谢兄弟啊,感觉你回了这么多,结贴后一定给分:).
不过现在关键出来了,你看看那个水平滚动条,然后你再直接在资源里面设置水平滚动.
两个创建的滚动条差别大了.呵呵.
你创建这个,中间的滑块大小不对,而且也拖不走.
你再看看直接用资源设置的那个,中间的滑块大小会随文本发生变化的.
你说的Load肯定做了的.AfxOleRichEdi2()Top
16 楼striking(庸人自扰)回复于 2006-03-15 11:56:18 得分 0
换这个, 我不知道那个函数
m_hInstRichEdit20 = LoadLibrary("RICHED20.DLL");
我已经是重新建工程, 按照你的要求试的. 没有问题了.
20分不够了.~~~呵呵.Top
17 楼xtmes(E-TECH)回复于 2006-03-15 12:08:16 得分 0
给一百分也可以啊.分没问题,我们讨论一下吧.你没有发现动态创建的滚动条和在资源里加属性静态创建出来那个不一样么?
其实m_hInstRichEdit20 = LoadLibrary("RICHED20.DLL");和AfxInitRichEdit2()的功能完全一样.Top
18 楼xtmes(E-TECH)回复于 2006-03-15 12:10:58 得分 0
要不我结贴了,兄弟有没有MSN,QQ或POPO,我们交流一下吧:)Top
19 楼striking(庸人自扰)回复于 2006-03-15 12:12:00 得分 0
刚刚有发现, 汗一个.. 这么困难...~~~~Top
20 楼xtmes(E-TECH)回复于 2006-03-15 12:12:45 得分 0
我的MSN:zy1075874@hotmail.com
POPO:zhangyiabc@163.com
我们讨论一下吧.我先给你分?呵呵Top
21 楼xtmes(E-TECH)回复于 2006-03-15 12:14:33 得分 0
加我MSN,我们讨论.呵呵.这个问题不是这么容易的.我现在的做法是.重新创建这个RichEdit.这样做不太好.我是这么做的
if(m_iAutoHorz){
CRect rt;
m_wndCmdRecorder.GetWindowRect(&rt);
m_wndCmdRecorder.DestroyWindow();
m_wndCmdRecorder.CreateEx(WS_EX_CLIENTEDGE,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_NOHIDESEL | ES_WANTRETURN | WS_VSCROLL | WS_HSCROLL | WS_GROUP | WS_TABSTOP,rt,this,IDC_COMMANDRECORDER);
}
else{
CRect rt;
m_wndCmdRecorder.GetWindowRect(&rt);
m_wndCmdRecorder.DestroyWindow();
m_wndCmdRecorder.CreateEx(WS_EX_CLIENTEDGE,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_NOHIDESEL | ES_WANTRETURN | WS_VSCROLL | WS_GROUP | WS_TABSTOP,rt,this,IDC_COMMANDRECORDER);
}
这个办法好笨啊~~~~~555555Top
22 楼xtmes(E-TECH)回复于 2006-03-15 12:21:15 得分 0
问题在于,控件创建后,动态创建的滚动条和它自动出来那个滚动条居然不是一个东西???我记得我三年前好象看到过解释这个问题的文档,现在忘了是怎么回来了.郁闷啊~~!~~~郁闷~~~~~Top
23 楼striking(庸人自扰)回复于 2006-03-15 12:33:26 得分 0
加了. thecpp@hotmail.comTop




