給激活了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。

    文筆走到這裏,應該要說再見了。^_^  記得聯繫我:[email protected] , 和您一起研究Win32SDK。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章