html 控件自动换行,RichEdit控件自动换行

博客探讨了在编程RichEdit控件时遇到的问题,即如何实现根据文本宽度自动换行。作者发现简单修改窗口样式无法生效,因为RichEdit内部可能限制了样式修改。通过发送EM_SETTARGETDEVICE消息,可以成功控制RichEdit根据自身宽度自动换行。代码示例展示了启用和禁用自动换行的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于RichEdit自身的复杂性,对于一个SDK程序员来说,对它进行编程,着实非一件易事!从Microsoft没把它和公共控件放在一起(图一)而独立封装成一riched20.dll文件(图二),就知道它来头不小。个人感觉SysListView及SysTreeView还有Rebar和ToolBar那几个Windows控件,尤其是RichEdit/SysTreeView/SysListView,要掌握它们,简直就一“罗马”工程!不过大家不用担心,这个坚巨的任务就交给我了!:)我会一一将那几个控件的难点及重点把心得放上来给大家作个参考。而在本篇,我只着重讲如题是如何实施的。

图一:comctl32.dll

comctl32.jpg

图二:riched20.dll

riched20.jpg

第一份代码

回到主题。由于给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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值