通过滚动条同步两个Richedit
vbrichtextbox透明、行距设置、判断垂直滚动条出现
vbrichtextbox透明、行距设置、判断垂直滚动条出现这个要求是文本阅读时候产生,让richtextBox透明,显出背景图,比如一本书页的样子,或者其他。
那么就需要透明。
当然还要控制行距。
同时最好不要出现那个默认的灰色滚动条,破坏整个效果。
一、透明'声明部分Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As LongConst GWL_EXSTYLE = (-20)Const WS_EX_TRANSPARENT = &H20&'使用部分Dim rtn As Longrtn = GetWindowLong(RichTextBox1.hwnd, GWL_EXSTYLE)SetWindowLong RichT extBox1.hwnd, GWL_EXSTYLE, rtn Or WS_EX_TRANSPARENT说明:透明的RichT extBox文字内容是可以显现的。
同时,如果你对整个窗体使用了 SetWindowLong函数控制整体透明效果,或者色彩过滤,则对控件的再次使用会失效。
二、行距设置'API函数声明Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long'参数初始化Private Const WM_USER = &H400Private Const EM_SETPARAFORMAT = WM_USER + 71 Public Const MAX_TAB_STOPS As Long = 32Public Const PFM_LINESPACING As Long = 256'声明一个结构Public Type PARAFORMAT2cbSize As LongdwMask As LongwNumbering As IntegerwEffects As IntegerdxStartIndent As LongdxRightIndent As LongdxOffset As LongwAlignment As IntegercTabCount As IntegerrgxTabs(MAX_TAB_STOPS - 1) As Long dySpaceBefore As LongdySpaceAfter As LongdyLineSpacing As LongsStyle As IntegerbLineSpacingRule As BytebOutlineLevel As BytewShadingWeight As Integer wShadingStyle As Integer wNumberingStart As Integer wNumberingStyle As Integer wNumberingTab As Integer wBorderSpace As IntegerwBorderWidth As IntegerwBorders As IntegerEnd Type'使用部分Private pf2 As PARAFORMAT2 '实例化结构变量'构造一个设置函数Private Sub sethang(rt As RichTextBox, num As Long) 'num 值推荐范围200-1500Dim retval As LongIf rt.SelText = "" Thenrt.SelStart = 0rt.SelLength = Len(rt)End Ifpf2.cbSize = LenB(pf2)pf2.bLineSpacingRule = 4pf2.dyLineSpacing = numpf2.dwMask = PFM_LINESPACINGretval = SendMessage(rt.hwnd, EM_SETPARAFORMAT, ByVal 0&, pf2)End Sub三、判断垂直滚动条是否出现'API调用与二相同,增加一些参数值。
DXperience之RichEditControl控件Bug解决方法
由Devexpress公司开发的控件套装DXperience中有不少组件有Bug,如T abPage得多线程问题,这里要说的时RichEditControl控件的滚动条的问题。
Bug现象:代码:RichEditControl ric=new RichEditControl();ric.Enabled=false;……..ric.Enabled=true;设置RichEditControl控件Enabled属性为false,然后在重新设置为true之后RichEditControl控件的滚动条将处于禁用状态,用调试器查看滚动条的Enabled属性为false,所以确定在重新设置为true的时候滚动条并未被置为true,用Reflector查看相关代码为:protected override void OnEnabledChanged(EventArgs e){base.OnEnabledChanged(e);if (base.Enabled && this.Focused){this.DestroyCaretTimer();this.InitializeCaretTimer();this.ShowCaretCore();this.VerticalScrollBar.Enabled = true;this.HorizontalScrollBar.Enabled = true;}else{this.DestroyCaretTimer();this.HideCaretCore();this.VerticalScrollBar.Enabled = false;this.HorizontalScrollBar.Enabled = false;}this.OnUpdateUI();}问题出在base.Enabled && this.Focused上,this.Focused一直为false,因此if块代码并未被执行,所以滚动条的Enabled始终为falseBug解决办法:1. 使得Focused值为true2. 使得VerticalScrollBar和HorizontalScrollBar控件的Enabled为true这里采用第二种方式解决,由于RichEditControl控件并未暴露任何有关滚动条的属性或方法,且访问性为非protected,因此直接访问设置或者通过继承的方式是无法做到的,所以必须采用反射的方式才能达到这个目的,这里还必须使用二次反射,第一次反射查找到VerticalScrollBar和HorizontalScrollBar属性,然后在通过反射取得Enabled属性,这里也可以直接通过强制转换通过GetValue函数获取的对象为指定的类型,然后直接设置Enabled为true,代码如下所示:private void SetEnable(){Type type = ric.GetType(); //ric即RichEditControl实例PropertyInfo info = type.GetProperty("VerticalScrollBar", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);ScrollBarBase vs = (ScrollBarBase)info.GetValue(ric, null);vs.Enabled = true;info = type.GetProperty("HorizontalScrollBar", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);vs = (ScrollBarBase)info.GetValue(ric, null);vs.Enabled = true;}通过这段代码就可以解决RichEditControl控件的滚动条不可用的bug以上方法也可用于其它操作,比如要操作一个类的非public函数或者属性,甚至操作类中的非public组合类的函数或属性等,有些时候由于设计需要将某些函数属性设计为外部不可访问的,但有些情况又需要访问,即可通过反射来访问.。
delphi7 dbrichedit 用法
delphi7 dbrichedit 用法[Delphi 7 DBRichEdit 用法]Delphi 7是一种流行的编程语言,常用于开发Windows平台上的应用程序。
其中一个强大而有用的组件是DBRichEdit,它允许用户在应用程序中创建和编辑RTF(Rich Text Format)文本。
本文将一步一步介绍DBRichEdit的用法,并提供一些示例代码。
第一步:安装DBRichEdit组件在使用DBRichEdit之前,需要确保已经正确安装了Delphi 7。
接下来,我们需要安装DBRichEdit组件。
将其相关文件复制到Delphi的组件目录中,并在Delphi的组件菜单中添加DBRichEdit组件。
第二步:创建数据库表格DBRichEdit是用于处理数据库中存储的RTF文本的。
在继续之前,我们需要创建一个数据库表格,用于存储RTF文本。
可以使用Delphi提供的数据库管理工具,如BDE(Borland Database Engine)或ADO(ActiveX Data Objects),创建一个包含一个RTF字段的表格。
第三步:在Delphi中添加数据源组件要使用DBRichEdit,我们需要在Delphi中添加一个数据源组件。
打开Delphi 的“工具”菜单,选择“组件库”下的“数据源”选项,然后将数据源组件拖放到主窗口的设计视图中。
第四步:配置数据源组件右击刚刚添加的数据源组件,选择“属性”选项。
在属性窗口中,将“DataSet”属性设置为我们创建的数据库表格。
第五步:添加DBRichEdit组件在Delphi的组件菜单中,选择DBRichEdit组件,并在主窗口的设计视图中添加一个DBRichEdit组件。
然后,通过拖放方式将其与数据源组件关联。
第六步:配置DBRichEdit组件选中添加的DBRichEdit组件,在属性窗口中,将“DataField”属性设置为RTF 文本所在的数据库字段,并将“DataSource”属性设置为我们刚刚创建的数据源组件。
winform滚动条原理
winform滚动条原理Windows Forms(WinForms)是一种用于在Microsoft Windows操作系统上构建应用程序的框架。
在WinForms中,滚动条(ScrollBar)是用于在控件的边界内部滚动内容的常见控件。
滚动条的原理主要涉及以下几个方面:1.控件布局:在WinForms中,滚动条通常与一个包含可滚动内容的控件(如Panel、ListBox、DataGridView等)关联。
滚动条以一个矩形框(滑块)的形式呈现,用户可以通过拖动滑块来滚动内容。
滚动条通常位于可滚动内容的一侧,并与内容控件同时显示。
2.滑块位置计算:控件的滚动条通常包括滑块和两端的箭头按钮。
滑块的位置表示可视内容在可滚动内容中的位置。
根据可视内容和可滚动内容的比例,滑块的位置可以动态计算得出。
例如,如果可视内容占可滚动内容的一半,则滑块位于滚动条的中间位置。
3.滑块拖动行为:当用户拖动滑块时,滚动条会根据滑块的位置计算相应的滚动距离,并将可滚动内容相应地滚动到新位置。
滚动条还会引发滚动事件,以便应用程序可以响应滚动动作,并更新滚动条的显示。
4.滚动事件处理:滚动条的滚动事件通常与可滚动内容控件的滚动事件关联。
当用户使用滚动条滚动内容时,事件会被触发并传递给相应的控件,以便应用程序可以根据需求执行相应的操作。
例如,当滚动条滚动时,可以更新显示内容、加载更多数据等。
5.滚动条外观定制:WinForms提供了一些属性和方法,允许开发人员自定义滚动条的外观。
这些属性包括滑块颜色、滑块大小、箭头按钮图标等。
通过调整这些属性,可以改变滚动条的外观,以适应特定应用程序的需求。
总结起来,WinForms的滚动条原理主要涉及控件布局、滑块位置计算、滑块拖动行为、滚动事件处理和滚动条外观定制。
这些方面共同实现了滚动条的功能,使应用程序能够方便地滚动显示内容并进行相关操作。
通过了解滚动条的原理,开发人员可以更好地使用和定制滚动条,以提升应用程序的用户体验。
delphi trichedit用法
delphi trichedit用法Delphi Trichedit用法1. 什么是Delphi TricheditDelphi Trichedit是Delphi提供的一个组件,用于创建和编辑RTF格式的文本。
它支持丰富的文本格式设置和自定义功能,适用于开发各种文本编辑程序。
2. 创建Trichedit控件要使用Delphi Trichedit,首先需要在Delphi的窗体上创建一个Trichedit控件。
你可以在Delphi的组件面板上找到Trichedit控件,并将其拖放到窗体上。
3. 设置Trichedit的属性Trichedit控件具有许多属性,可以通过设置这些属性来控制文本的格式和行为。
以下是一些常用的属性及其说明:•Font:设置文本的字体、字号和样式。
•Color:设置文本的颜色。
•ReadOnly:设置是否只读,如果设置为True,则无法编辑文本。
•WordWrap:设置是否自动换行。
•ScrollBars:设置是否显示滚动条。
•PlainText:获取或设置文本的纯文本内容。
4. 设置文本格式通过Trichedit控件的属性和方法,可以对文本进行格式设置,例如:•SelAttributes:获取或设置当前选中文本的属性,例如字体、字号和颜色。
•Paragraph:设置段落的缩进、对齐方式和行距等属性。
•Lines:获取或设置文本的内容,可以通过添加、删除、插入和替换等方法来编辑文本。
5. 处理事件Trichedit控件还支持各种事件,可以在事件处理程序中编写代码来实现一些自定义功能。
以下是一些常用的事件:•OnChange:文本内容发生改变时触发的事件。
•OnKeyPress:按下键盘按键时触发的事件。
•OnSave:将文本保存到文件时触发的事件。
•OnLoad:从文件加载文本时触发的事件。
6. 导出和导入文本通过使用Trichedit控件的方法,可以将文本导出为RTF格式或纯文本格式,也可以从文件导入文本。
使用滚动条显示多屏内容
使用滚动条显示多屏内容
使用滚动条显示多屏内容-axure设计实例
说明:
通过拖动滚动条将面板中的内容显示。
这是我们常见到设计。
任何一个网页超过一屏时都需要滚动条进行拖动显示更多
的内容。
这个在axure中如何实现呢?其实很简单,只需要使用一个控件Inline Frame,不需要任何的动态面板。
实现使用到的action:
将一个内容页面“链接”到这个控件。
实现思路:
1、制作一个页面,将要显示的内容放在这个页面中。
2、拖动一个Inline Frame。
双击这个控件,设置“link to a page this design”到第1步制作的页面中。
这样就实现了这个功能。
为了美观你可以将控件的边框去掉,右击控件”edit inline frame->toggle border。
另外默认情况下是有横竖滚动条的,你可以设置根据内容显示滚动条,或从不显示滚动条。
因此,根据“内容显示滚动条”这一选项就可以任由你想实现的是横滚动还是竖滚动了。
右击控件“edit inline frame->show scrollbars as needed”.
要点:
1、想使用这个Inline Frame控件就需要再做另一个页面用来嵌套在这个控件中。
2、设置滚动条的状态。
axure 设计实例下载:
/Files/05341/axure案例/使用滚动条显示多屏内容.rar。
trichedit用法
trichedit用法
Trichedit是Delphi编程语言中常用的一个控件,用于在窗体中显示和编辑富文本内容。
它可以用于创建具有格式的文本,如粗体、斜体、下划线、不同字体和颜色等。
下面我将从几个方面来介绍Trichedit的用法。
首先,Trichedit的基本用法是在Delphi的窗体中放置一个Trichedit控件,然后通过编程来控制它的属性和方法。
你可以在设计模式下设置Trichedit的属性,比如默认字体、默认颜色、文本对齐方式等。
然后在运行时,你可以通过编程来改变Trichedit 中显示的文本内容,包括插入、删除文本,设置文本的格式等。
其次,Trichedit还可以用于处理用户输入的富文本内容。
用户可以在Trichedit中输入文本,并对文本进行格式化,比如设置部分文本为粗体、斜体或下划线。
此外,Trichedit还可以处理链接、图像等富文本内容。
另外,Trichedit还可以通过事件来响应用户的操作。
比如你可以通过Trichedit的事件来处理用户的文本选择、文本改变等操作,从而实现一些自定义的功能。
除此之外,Trichedit还可以与其他控件和组件进行交互。
比如你可以将Trichedit中的文本内容导出到其他控件中,或者将其他控件中的内容导入到Trichedit中进行编辑和显示。
总的来说,Trichedit是一个功能强大的控件,可以用于在Delphi应用程序中创建和编辑富文本内容。
通过掌握Trichedit的用法,你可以实现丰富多彩的文本编辑功能,为用户提供更好的使用体验。
希望这些信息能够帮助你更好地了解Trichedit的用法。
控件:Rich_Edit2.0使用方法
控件:Rich_Edit2.0使⽤⽅法资料:⼀:直接看Rich Edit 2.0的属性。
⼆:查看MSDN三:⽹络资料。
回答者VC_Edit_Control_VC中Edit Control控件的⽤法简介摘要:; } 1.设置edit只读属性⽅法⼀:m_edit1.SetReadOnly(TRUE); ⽅法⼆:::SendMessage(m _edit1.m_hWnd,EM_SETREADONLY, TRUE, 0); 2.判断edit中光标状态并得到选中内容(richedit同样适⽤); }1.设置[she zhi]edit只读[zhi du]属性[shu xing][zhi du shu xing]⽅法[fang fa]⼀:m_edit1.SetReadOnly(TRUE);⽅法[fang fa]⼆:::SendMessage(m_edit1.m_hWnd, EM_SETREADONLY, TRUE, 0);2.判断edit中光标[guang biao]状态[zhuang tai]并得到选中内容(richedit同样适⽤)int nStart, nEnd;CString strTemp;m_edit1.GetSel(nStart, nEnd);if(nStart == nEnd){strTemp.Format(_T(" 光标[guang biao]在%d" ), nStart);AfxMessageBox(strTemp);}else{//得到edit选中的内容m_edit1.GetWindowText(strTemp);strTemp = strTemp.Mid(nStart) - strTemp.Mid(nEnd);AfxMessageBox(strTemp);}注:GetSel后,如果nStart和nEnd,表明光标[guang biao]处于某个位置[wei zhi](直观来看就是光标[guang biao]在闪动);如果nStart和nEnd不相等,表明⽤户[yong hu]在edit中选中了⼀段内容。
delphi7 dbrichedit 用法
delphi7 dbrichedit 用法Delphi 7 是一款经典且功能强大的集成开发环境(IDE),其拥有丰富的组件库,可以用于开发各种类型的应用程序。
其中之一就是 DBRichEdit 控件,它是一个继承自 RichEdit 组件的数据驱动版本,可以在应用程序中对 RTF 格式的文本进行显示、编辑和存储。
在本文中,我将向您介绍如何使用 Delphi 7 中的 DBRichEdit控件,包括控件的基本属性设置、文本的显示和编辑、获取和设置文本内容、保存和读取 RTF 格式的文本等。
让我们一起开始吧!1. 首先,启动 Delphi 7,并创建一个新的 VCL 文件,其中包含一个DBRichEdit 控件。
可以在“工具箱”窗口中找到该控件,并将其拖放到窗体上。
2. 接下来,我们需要连接一个数据集(DataSet)到DBRichEdit 控件,以便加载和保存文本内容。
可以使用TTable、TQuery、TADOQuery 等组件作为数据集。
a. 在工具箱中找到适当的数据集组件,并将其拖放到窗体上。
b. 打开该数据集的属性编辑器,设置连接字符串、表名、查询语句等,以便与数据库建立连接。
c. 在 DBRichEdit 控件的属性编辑器中找到 DataField 属性,选择与文本内容对应的字段名。
3. 现在,我们已经完成了控件的基本设置,可以开始设置其他属性,如字体、颜色、对齐方式等。
a. 找到 Font 属性,可以设置字体名称、大小、样式等。
b. 找到 Color 属性,可以设置文本的颜色。
c. 找到 Alignment 属性,可以设置文本的对齐方式,如左对齐、居中对齐、右对齐等。
4. 接下来,让我们来学习如何显示和编辑文本内容。
a. 运行应用程序,您将看到 DBRichEdit 控件中显示了与字段中的文本内容相对应的文本。
b. 单击 DBRichEdit 控件,可以开始编辑文本。
您可以输入新的文本、选择、拖拽和格式化文本。
原生JS控制多个滚动条同步跟随滚动效果
原⽣JS控制多个滚动条同步跟随滚动效果在⼀些⽀持⽤markdown写⽂章的⽹站,后台写作页⾯,⼀般都是⽀持markdown即时预览的,也就是将整个页⾯分成两部分,左半部分是你输⼊的markdown⽂字,右半部分则即时输出对应的预览页⾯,例如下⾯就是 CSDN 后台写作页⾯的markdown即时预览效果:本⽂不是阐述如何从0实现这种效果的(后续很可能会单出⽂章,),抛开其他,单看页⾯主体中左右两个容器元素,即markdown输⼊框元素和预览显⽰框元素本⽂要探讨的是,当这两个容器元素的内容都超出了容器⾼度,即都出现了滚动框的时候,如何在其中⼀个容器元素滚动时,让另外⼀个元素也随之滚动。
DOM 结构既然是与滚动条有关,那么⾸先想到js中控制滚动条⾼度的⼀个属性:scrollTop,只要能控制这个属性的值,⾃然也就能控制滚动条的滚动了。
对于以下DOM结构:<div id="container"><div class="left"></div><div class="right"></div></div>其中,.left元素是左半部分输⼊框容器元素,.right元素是右半部分显⽰框容器元素,.container是它们共同的⽗元素。
由于需要溢出滚动,所以还需要设置⼀下对应的样式(只是关键样式,⾮全部):#container {display: flex;border: 1px solid #bbb;}.left, .right {flex: 1;height: 100%;word-wrap: break-word;overflow-y: scroll;}再向.left和.right元素中塞⼊⾜够的内容,让⼆者出现滚动条,就是下⾯这种效果:样式是出来个⼤概了,下⾯就可以在这些DOM上进⾏⼀系列的操作了。
Delphi 中RichEdit 的奥妙
De lphi中RichEdit的奥妙、如何得知当前行号用RichEdit(或者memo) 控件制作文本编辑器时,通过访问lines count属性可以得到总行数,但是若想知道光标当前所在行的行号就麻烦了,因为delphi没有提供这个属性。
要实现这个编辑器必备功能,就须调用em LineFromCha r。
请试试下面的程序。
先在窗口中布置个RichEdit或者memo(命名为edi tor),以及个button。
在button 的onclic k事件中写入下列代码。
var CurrentLine:lnteger; beginCurrentLine:二Editor Perform(em LineFromCha r,SFFFF,O);Application MessageBox(PChar(' 当前行号是,+IntToStr(CurrentLine)),'消息',mb iconinformation);end需要注意的是,第一行的行号为零。
二、如何撤消操作(undo)对于memo来说,实现undo是不需编梧的,只要让popupmen u属性为空,运行时就能用鼠标右键激活一个常用操作菜单,其中包括撤消、剪切、复制、粘贴、删除和全选六项。
但可惜的是,这一招对于功能强大的RichEdit控件居然行不通,害得我们还要自己设计一个popupmemuo当你用CutToClipBoard等语句轻松而顺利地完成了"剪切"等功能,接着便会无奈地发现,竟找不到undo或cancel之类的语句来执行"撤消"。
这时你需要这样处理:RichEditl Perform(EM UNDO,O,0); 另外还应检查是否允许撤消,从而开启或关闭弹出菜单中的"撤消"项: Undol Enabled:二RichEditPerform(EM C川UNDO,0,0)<>0; 以上程序在Delphi3中调试通过。
通过滚动条同步两个Richedit
end;
procedureTForm1.FormClose(Sender:TObject;varAction:TCloseAction);
begin
ifAssigned(PRichEdWndProc)then
begin
SetWindowLong(RichEdit1.Handle,GWL_WNDPROC,Integer(POldWndProc));
FreeObjectInstance(PRichEdWndProc);
end;
end;
procedureTForm1.RichEdWndProc(varMsg:TMessage);
begin
Msg.Result:=CallWindowProc(POldWndProc,RichEdit1.Handle,Msg.Msg,
private
PRichEdWndProc,POldWndProc:Pointer;
procedureRichEdWndProc(varMsg:TMessage);
public
{ Public declarations }
end;
var
Form1:TForm1;
implementation
{$R *.dfm}
SetScrollPos(RichEdit2.Handle,SB_VERT,HIWORD(Msg.wParam),True);
end;
end;
procedureTForm1.FormShow(Sender:TObject);
var
i:Integer;
begin
//初使化demo数据
fori:=0to20do
RichEdit的用法总结(转载)
RichEdit的⽤法总结(转载)richedit 常见使⽤问题⼀.常见问题a.可以编译,不能执⾏的在需要在相应的对话框中加上InitInstance(void)函数中添加AfxInitRichEdit();b.升级默认的Riched版本(默认的有⼀些bug),如可在InitInstance中添加LoadLibrary("RICHED20.DLL")最后注意 FreeLibrary如果是CRichEditView基类的可⽤BOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs){//装⼊rich edit version 2.0if (LoadLibraryA("RICHED20.DLL") == NULL){AfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);PostMessage(WM_QUIT,0,0);return FALSE;}m_strClass = RICHEDIT_CLASSA;//for 2.0 classreturn CRichEditView::PreCreateWindow(cs);}c.最后追加⾏richeditctrl.SetSel(-1, -1);richeditctrl.ReplaceSel( (LPCTSTR)str );d.字数限制CRichEditCtrl::LimitText(long nChars)e.换⾏切换CRichEditView的OnInitialUpdate()函数中加⼊下⾯两句:m_nWordWrap = WrapNone;WrapChanged();WrapChanged实际上也是调⽤ctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNonectrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow还有不常⽤的 m_nWordWrap == WrapToTargetDevicectrl.SetTargetDevice(m_dcTarget, GetPrintWidth());如果是在Dialog中,可使⽤SetTargetDevice,注意在属性⾥⾯加上want returnf.有时候不希望带格式的数据粘贴,可通过PasteSpecial选择性粘贴pmyRichEditCtrl->PasteSpecial(CF_TEXT);g.随着输⼊随着⾃动滚动条滚动到最后⼀⾏int nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();if (nFirstVisible > 0){pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);}或m_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);h.设置UNDO的次数(只能⽤在RICHED20以上,即默认不⽀持,必须升级)SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);TM_MULTILEVELUNDO ⽀持多取消(默认值).可通过EM_SETUNDOLIMIT设置最⼤次数SendMessage(EM_SETUNDOLIMIT,100,0);i.响应OnChangeEM_SETEVENTMASK 设置 ENM_CHANGElong lMask = GetEventMask();lMask |= ENM_CHANGE;lMask &= ~ENM_PROTECTED;SetEventMask(lMask);⼆.函数应⽤a.设置字体(主要是通过SetSelectionCharFormat)CHARFORMAT cf;rich.GetSelectionCharFormat(cf);cf.dwMask|=CFM_BOLD;cf.dwEffects|=CFE_BOLD;//设置粗体,取消⽤cf.dwEffects&=~CFE_BOLD;cf.dwMask|=CFM_ITALIC;cf.dwEffects|=CFE_ITALIC;//设置斜体,取消⽤cf.dwEffects&=~CFE_ITALIC;cf.dwMask|=CFM_UNDERLINE;cf.dwEffects|=CFE_UNDERLINE;//设置斜体,取消⽤cf.dwEffects&=~CFE_UNDERLINE; cf.dwMask|=CFM_COLOR;cf.crTextColor = RGB(255,0,0);//设置颜⾊cf.dwMask|=CFM_SIZE;cf.yHeight =200;//设置⾼度cf.dwMask|=CFM_FACE;strcpy(cf.szFaceName ,_T("⾪书"));//设置字体rich.SetSelectionCharFormat(cf);b.设置字体的⾏间距要⽤richedit2.0以上试试PARAFORMAT2 pf;pf.cbSize = sizeof(PARAFORMAT2);pf.dwMask = PFM_NUMBERING | PFM_OFFSET;pf.wNumbering = PFN_BULLET;//注意PFM_NUMBERINGpf.dxOffset = 10;VERIFY(SetParaFormat(pf));常⽤的dwMask有PFM_NUMBERING 成员 wNumbering 才起作⽤,项⽬符号,默认⽤PFN_BULLET2 使⽤阿拉伯数字 (1, 2, 3, ...).3 使⽤⼩写字母 (a, b, c, ...).4 使⽤⼤写字母 (A, B, C, ...).5 使⽤⼩写罗马数字 (i, ii, iii, ...).6 使⽤⼤写罗马数字 (I, II, III, ...).7 ⾃定义,字符见成员 wNumberingStart.PFM_OFFSET 成员 dxOffset 才起作⽤,缩进,单位twipsPFM_STARTINDENT 成员 dxStartIndent 才起作⽤,⾸⾏缩进PFM_SPACEAFTER 成员 dySpaceAfter 才起作⽤,段间距PFM_LINESPACING 成员 dyLineSpacing 才起作⽤,⾏间距c.设置CRichEditCtrl(2.0)背景透明long style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);style &= WS_EX_TRANSPARENT;::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);或 CreateEx,然后把WS_EX_TRANSPARENT样式加上e.得到内容有三种1)GetWindowText2)使⽤EM_GETTEXTEXGETTEXTEX gt;gt.cb = 200;gt.flags = GT_DEFAULT;gt.codepage = CP_ACP ;gt.lpDefaultChar = NULL;gt.lpUsedDefChar = NULL;SendMessage(EM_GETTEXTEX,(WPARAM)>,(LPARAM)text);3)StreamOut(主要⽤于RTF等格式输出)static DWORD CALLBACKMyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb){CFile* pFile = (CFile*) dwCookie;pFile->Write(pbBuff, cb);*pcb = cb;return 0;}CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);EDITSTREAM es;es.dwCookie = (DWORD) &cFile;//设置⽤例参数,以便回调函数调⽤es.pfnCallback = MyStreamOutCallback;pmyRichEditCtrl->StreamOut(SF_RTF, es);读⼊可以此类推,SetWindowText,EM_SETTEXTEX,StreamInf.查找字符串FINDTEXTEX ft;ft.chrg.cpMin = 0;ft.chrg.cpMax = -1;ft.lpstrText = "|";long lPos = FindText(0, &ft);如果要继续查找,修改cpMin,如int nCount = 0;do{long lPos = GetRichEditCtrl().FindText(0, &ft);if( -1 == lPos) break;ft.chrg.cpMin = lPos + strlen(ft.lpstrText);++nCount;}while(TRUE);g.以Html格式保存⽬前做法可先转为RTF格式,再通过RTF-to-HTML Converterh.重载OnProtected函数得到对应的消息,如粘贴等void CMYichEditorView::OnProtected(NMHDR* pNMHDR, LRESULT* pResult){ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;switch (pEP->msg) {case WM_KEYDOWN://按键,判断pEP->wParamcase WM_PASTE://粘贴case WM_CUT://剪切case EM_SETCHARFORMAT:default:break;};*pResult = FALSE;}三.聊天常⽤a.LINK 链接功能1. LoadLibrary(_T("Riched20.dll"));2. 创建RichEdit2.0控件CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP |ES_READONLY|ES_WANTRETURN|ES_MULTILINE,rect.left, rect.top, cx, cy,pParentWnd->m_hWnd, (HMENU)nID, NULL);3. 设定选中的⽂字为链接显⽰CHARFORMAT2 cf2;ZeroMemory(&cf2, sizeof(CHARFORMAT2));//cf2.cbSize = sizeof(CHARFORMAT2);cf2.dwMask = CFM_LINK;cf2.dwEffects |= CFE_LINK;m_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);4.⽀持链接的点击响应m_cRichEdit.SetEventMask(ENM_LINK);5.响应链接的点击EN_LINKBEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)ON_NOTIFY_REFLECT(EN_LINK,OnURL)END_MESSAGE_MAP()......void CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult){TCHAR LinkChar[512];ENLINK *pLink = (ENLINK *)pNmhdr;if (pLink->msg == WM_LBUTTONUP){SetSel(penLink->chrg);//这是链接的⽂字范围long Res = GetSelText((char *)LinkChar);//这是链接⽂字//后⾯是你的处理过程......}}不能显⽰图⽚等其他OLE对象MFC提供的CRichEditCtrl没有提供直接显⽰图⽚等OLE对象的属性或⽅法设置,但是提供了⼀个接⼝SetOLECallback( IRichEditOleCallback* pCallback );要让CRichEditCtrl显⽰图⽚,就得在IRichEditOleCallback上下功夫。
使用滚动条显示多屏内容
使用滚动条显示多屏内容在现代的网页设计中,我们经常会遇到需要显示长内容的情况,比如文章、评论和聊天记录等。
在这些情况下,使用滚动条来显示多屏内容是一种非常常见和有效的方式。
滚动条是指位于页面的边缘或中心,可以通过拖动或滚动滑轮来上下滚动页面内容的组件。
它可以帮助我们在有限的视窗空间内显示更多的内容,提高内容的可读性和用户体验。
那么如何使用滚动条来显示多屏内容呢?首先,我们需要将需要显示的内容放置在一个固定大小的容器中。
这个容器可以是一个 `<div>` 元素,也可以是一个可以滚动的 `<body>` 元素。
其次,我们需要设置容器的高度,以及设置 `overflow` 属性为`auto`。
这样,在容器高度固定的情况下,当容器内的内容超出容器高度时,会自动出现滚动条。
```css.containerheight: 400px;overflow: auto;```在设置了容器的高度和 `overflow` 属性之后,如果容器内的内容超出了容器的高度,就会自动出现滚动条,用户可以通过拖动滚动条或滚动滑轮来查看隐藏的内容。
在移动设备上,由于屏幕空间有限,常常会出现下拉刷新或上滑加载更多的需求。
这时候,我们还可以使用滚动条组件来实现这些功能。
在移动端,JS 库中有许多好用的滚动条插件,比如 IScroll.js、Better Scroll 和 Antd-mobile等。
使用这些插件,我们可以轻松地实现下拉刷新和上滑加载更多的功能。
总结来说,在现代网页设计中,使用滚动条来显示多屏内容是一种非常方便和有效的方式。
通过设置容器的固定高度和 `overflow` 属性,我们可以在有限的视窗空间内显示更多的内容,提高用户体验。
而在移动端,我们可以使用滚动条插件来实现更多功能,比如下拉刷新和上滑加载更多。
DXperience之RichEditControl控件Bug解决方法
由Devexpress公司开发的控件套装DXperience中有不少组件有Bug,如T abPage得多线程问题,这里要说的时RichEditControl控件的滚动条的问题。
Bug现象:代码:RichEditControl ric=new RichEditControl();ric.Enabled=false;……..ric.Enabled=true;设置RichEditControl控件Enabled属性为false,然后在重新设置为true之后RichEditControl控件的滚动条将处于禁用状态,用调试器查看滚动条的Enabled属性为false,所以确定在重新设置为true的时候滚动条并未被置为true,用Reflector查看相关代码为:protected override void OnEnabledChanged(EventArgs e){base.OnEnabledChanged(e);if (base.Enabled && this.Focused){this.DestroyCaretTimer();this.InitializeCaretTimer();this.ShowCaretCore();this.VerticalScrollBar.Enabled = true;this.HorizontalScrollBar.Enabled = true;}else{this.DestroyCaretTimer();this.HideCaretCore();this.VerticalScrollBar.Enabled = false;this.HorizontalScrollBar.Enabled = false;}this.OnUpdateUI();}问题出在base.Enabled && this.Focused上,this.Focused一直为false,因此if块代码并未被执行,所以滚动条的Enabled始终为falseBug解决办法:1. 使得Focused值为true2. 使得VerticalScrollBar和HorizontalScrollBar控件的Enabled为true这里采用第二种方式解决,由于RichEditControl控件并未暴露任何有关滚动条的属性或方法,且访问性为非protected,因此直接访问设置或者通过继承的方式是无法做到的,所以必须采用反射的方式才能达到这个目的,这里还必须使用二次反射,第一次反射查找到VerticalScrollBar和HorizontalScrollBar属性,然后在通过反射取得Enabled属性,这里也可以直接通过强制转换通过GetValue函数获取的对象为指定的类型,然后直接设置Enabled为true,代码如下所示:private void SetEnable(){Type type = ric.GetType(); //ric即RichEditControl实例PropertyInfo info = type.GetProperty("VerticalScrollBar", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);ScrollBarBase vs = (ScrollBarBase)info.GetValue(ric, null);vs.Enabled = true;info = type.GetProperty("HorizontalScrollBar", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);vs = (ScrollBarBase)info.GetValue(ric, null);vs.Enabled = true;}通过这段代码就可以解决RichEditControl控件的滚动条不可用的bug以上方法也可用于其它操作,比如要操作一个类的非public函数或者属性,甚至操作类中的非public组合类的函数或属性等,有些时候由于设计需要将某些函数属性设计为外部不可访问的,但有些情况又需要访问,即可通过反射来访问.。
【原创】【目录】实现richeditor(富文本编辑器)教程,深入理解selectiona。。。
【原创】【⽬录】实现richeditor(富⽂本编辑器)教程,深⼊理解selectiona。
⽇常⼯作中,接触富⽂本编辑的次数还是很多,特发此教程,希望可以改变富⽂本编辑的技术门槛较⾼的现状,解决这部分的坑。
1.2.3. 兼容的fontsize命令,⾃定义字体为px⽽⾮固定数值,⾃定义font-family⽽⾮font-face,其他兼容的range处理4. 统⼀strong、b、i标签,添加标签⿊名单功能5. 待续实现兼容的难点部分: 添加html代码:ie6-8系列使⽤range.insertHTML命令,ie9-11使⽤range.createContextualFragment(ie9 ie10,与标准⼀致),产⽣如下bug ie9 去除了pasteHTML,⼜没有添加range.createContextualFragment⽅法,只好使⽤createDocumentFragment,然后再range.insertNode,在第⼀篇中已解决 @2013-11-28 10:34:47 回车插⼊换⾏("<br/>"),当光标在末尾时,⽆法插⼊,修改为插⼊ "<br/> ",然后再选中此空格,将其删除,如何删除空格:1var rangeData = self.getRange();2var range = rangeData.range;3 range.setStart(range.startContainer, range.startOffset - 1);4var _selection = self.getRange().selection;5 _selection.removeAllRanges();6 _selection.addRange(range);7 document.execCommand("Delete", false, null);View Code 当光标改变时,时时返回样式给⼯具栏,ie以外浏览器不⽀持onbeforedeactivate事件,⽆法在blur之前获得range书签,focus之前恢复。