给激活了WS_HSCROLL,WS_VSCROLL的RichEdit增加自动换行的控制
来源:互联网 发布:mac用户根目录 编辑:程序博客网 时间:2024/06/10 05:45
谁应该读这篇文章?
正如你所想,需要急切了解Windows控件的、正在用VC++开发软件并涉及到RichEdit控件的、或是正巧也遇到本文标题的朋友们,这篇文章应该能让你获取关于Windows控件的一些经验,那怕是一丁点经验,只要能让你走更少的弯路来达到目的,我也就欣慰了。^_^
序
由于RichEdit自身的复杂性,对于一个SDK程序员来说,对它进行编程,着实非一件易事!从Microsoft没把它和公共控件放在一起(图一)而独立封装成一riched20.dll文件(图二),就知道它来头不小。个人感觉SysListView及SysTreeView还有Rebar和ToolBar那几个Windows控件,尤其是RichEdit/SysTreeView/SysListView,要掌握它们,简直就一“罗马”工程!不过大家不用担心,这个坚巨的任务就交给我了!:)我会一一将那几个控件的难点及重点把心得放上来给大家作个参考。而在本篇,我只着重讲如题是如何实施的。
图一:comctl32.dll
图二:riched20.dll
在写Win32SDK作品《GlobalStrings》时,就是采用RichEdit控件(由于Edit的自限性,所以采用强大的RichEdit。它不但能支持大文件,还能支持颜色高亮等达到几乎和WORD一样的强大的文本能力)。提到《GlobalStrings》,就顺便讲一下我这个软件有什么功能及特色吧!:)大家看它的名称就可估到它有什么实质的功能了吧?对!就是一文本编辑处理机。它能处理如下问题(都是所见即所得):BIG5和GB2312的互换、简繁体互换、支持所有的文本编码(GB系列、BIG5、UTF8、UTF16、UNICODE LE16、UNICODE BE16、UNICODE LE32、UNICODE BE32)编辑及转换到保存。另一特色就是我在2005时,答应大家要写的一套Windows控件的事了,目前在此软件中,大家都能看到Button/RadioBox/CheckBox了,接一下我会慢慢地完善它们。
图三:
第一份代码
回到主题。由于给RichEdit加了如下窗口样式:WS_HSCROLL、WS_VSCROLL、WS_DISABLENOSCROLL,所以有时候在我们打开一个超宽的文本时,阅读会非常不方便,总是要用鼠标控制它的水平滚动条(痛苦)。所以我就突发奇想要给它加上一个如题的功能。一开始我是按照以往的做法:简单的处理窗口样式(Window Style)。如下代码:
LONG lStyle = GetWindowLong( g_hwndRich, GWL_STYLE );
if ( CHK_GetValue ( hwndCtrl ) )
lStyle |= WS_HSCROLL;
else
lStyle &= ~WS_HSCROLL;
SetWindowLong( g_hwndRich, GWL_STYLE, lStyle );
SetWindowPos( g_hwndRich, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE );
这份代码若是用在公共控件上,原则上来讲,应该能达到功效。可惜的是,我忽略了,它是一个RichEdit。根本就没用!我猜测可能在RichEdit的Window Procedure中,它内部对Window Style进行了封装和限制。所以无论我们如何在外边给它发送消息及用一般的窗口方法都无效。接下来,我们看看第二份代码。
第二份代码
在第二份代码中,正如您所想,很幸运地,我们达到本文主题的要求。:)它运行的很好。而在我的《GlobalStrings》中,我是用一个CheckBox(我自己编写的控件,风格是采用Vista)控件来控制这个功能的。如下代码:
void SetCarryLine( HWND hwndRich, BOOL fbEnable )
{
if ( fbEnable )
{
HDC hdc = GetDC( hwndRich );
SendMsg( hwndRich, EM_SETTARGETDEVICE, hdc, 0 );
ReleaseDC( hwndRich, hdc );
}
else
{
SendMsg( hwndRich, EM_SETTARGETDEVICE, 0, 1 );
}
}
看过代码之后,我想大家都知道了,我是利用EM_SETTARGETDEVICE消息来达到这个目的的。
嗯,函数的代码已经说了一切!给RichEdit发送一个附带WPARAM为自身的HDC以及LPARAM参数为0的消息,就让RichEdit根据自身的宽度来自动换行了。若是不想要自动换行,发送WPARAM为0及LPARAM参数为1就OK了!更多的关于EM_SETTARGETDEVICE的用法,请大家参考MSDN。
文笔走到这里,应该要说再见了。^_^ 记得联系我:dreamerate@gmail.com , 和您一起研究Win32SDK。
- 给激活了WS_HSCROLL,WS_VSCROLL的RichEdit增加自动换行的控制
- 给激活了WS_HSCROLL,WS_VSCROLL的RichEdit增加自动换行的控制
- 给激活了WS_HSCROLL,WS_VSCROLL的RichEdit增加自动换行的控制(转)
- richEdit自动换行
- mfc richedit 自动换行
- RichEdit中显示的控制
- 控制table的td自动换行
- [b/s]对于RTF域赋值给另外一个域后自动增加回车换行的处理
- 两个控制显示格式的函数:自动换行、自动省略
- 个控制显示格式的函数:自动换行、自动省略
- RichEdit 的ScrollBar自动向下滚动
- 随着文字内容增加,div的高度也跟着增加,并且文字自动换行
- js 控制英文自动换行 不截断单词的方法
- HTML+CSS中控制长字符串的自动换行问题
- duilib 给List表头增加百分比控制宽度的功能
- 给nvidia显卡增加风扇速度控制的选项
- RichEdit 为插入的图片增加鼠标事件
- DuiDesigner修改:增加对RichEdit控件属性的保存
- 通用Access字段数据获取模块
- 在B/S开发中经常用到的javaScript技术
- Web安全技术与防火墙
- 存储过程入门
- javascript40种网页常用小技巧
- 给激活了WS_HSCROLL,WS_VSCROLL的RichEdit增加自动换行的控制
- js中去掉字符串两边的空格
- GridView绑定的表的主键是组合主键
- CSDN观察之女程序员
- 函数
- MS Sql 命令行及常用函数
- 2007-04-03
- 通信行业名词解释ID、MD、HW、SW
- java成功之路