给激活了WS_HSCROLL,WS_VSCROLL的RichEdit增加自动换行的控制(转)

谁应该读这篇文章?

    正如你所想,需要急切了解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。
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页