RichEdit控件自动换行

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

图一:comctl32.dll

图二:riched20.dll
 

第一份代码

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

你可能感兴趣的:(RichEdit控件自动换行)