2014-01-13 59 views
1

我第一次有一個TMemo,當我抓住滾動條的大拇指時,Memo內容逐行滾動,這意味着不是逐像素平滑。TRichEdit沒有逐行滾動

然後我轉而使用TRichEdit控件。但現在它逐個像素地平滑滾動。

有沒有辦法配置TRichEdit控件的行爲更像TMemo控件,一次滾動整行?

我意識到TRichEdit可以根據選定的樣式具有不同的線高度。但是,如果頂線總是對齊(不顯示一半),這應該不成問題。

如果沒有簡單的方法,我可以調整在WM_VSCROLL消息的位置...

回答

0

好了,所以我看着辦吧。

我的解決方案是讀取滾動條位置並從中計算行數。然後計算從當前行位置滾動的增量行數。

我捕獲到WM_MOUSEWHEELWM_VSCROLL,並將它們轉換爲EM_LINESCROLL消息。

// Translate Mouswheel 
case WM_MOUSEWHEEL: 
    Message.Msg = EM_LINESCROLL; 
    Message.LParam = (long)Message.WParamHi == 120 ? -3 : 3; 
    Message.WParam = 0; 
    PrevWndProc(Message); 
    break; 

// Handle thumbscroll 
case WM_VSCROLL: { 
    if (Message.WParamLo == SB_THUMBTRACK || Message.WParamLo == SB_THUMBPOSITION) { 
    SCROLLINFO scrInfo = { sizeof(SCROLLINFO), SIF_ALL }; 
    int ratio,delta; 

    // Get scrollbar position 
    GetScrollInfo(Script_Edit->Handle,SB_VERT,&scrInfo); 

    // Calculate line number 
    ratio = (scrInfo.nMax/Script_Edit->Lines->Count); 
    delta = (Message.WParamHi/ratio)-GetlineNumber(); 

    // Don't update if delta is 0 
    if (delta == 0) 
     break; 

    // Change to EM_LINESCROLL message 
    Message.Msg = EM_LINESCROLL; 
    Message.WParam = 0; 
    Message.LParam = delta; 
    } 
    PrevWndProc(Message); 
} break; 

PrevWndProc()是原始WindowProc()功能和GetLineNumber()返回RichEdit控件(EM_GETFIRSTVISIBLELINE)的頂行索引。

我希望這是有幫助的,如果別人有同樣的問題。

+0

我有同樣的問題...這是一個恥辱,只有火箭筒解決方案這樣一個小問題。我的意思是我永遠不會把這個放在我的代碼中,更好地保持這個問題。這太誇張了...不批評你,但C++ builder。 – 2014-02-21 11:12:50

0

這是比較容易捕捉WM_VSCROLL消息,然後此消息內確定線高度(通過EM_POSFROMCHAR,它和EM_LINEINDEX),然後更新thumbposition使得其行高的整數倍: POS =地板(POS/lineHeight)* lineHeight