我第一次有一個TMemo,當我抓住滾動條的大拇指時,Memo內容逐行滾動,這意味着不是逐像素平滑。TRichEdit沒有逐行滾動
然後我轉而使用TRichEdit控件。但現在它逐個像素地平滑滾動。
有沒有辦法配置TRichEdit控件的行爲更像TMemo控件,一次滾動整行?
我意識到TRichEdit可以根據選定的樣式具有不同的線高度。但是,如果頂線總是對齊(不顯示一半),這應該不成問題。
如果沒有簡單的方法,我可以調整在WM_VSCROLL消息的位置...
我第一次有一個TMemo,當我抓住滾動條的大拇指時,Memo內容逐行滾動,這意味着不是逐像素平滑。TRichEdit沒有逐行滾動
然後我轉而使用TRichEdit控件。但現在它逐個像素地平滑滾動。
有沒有辦法配置TRichEdit控件的行爲更像TMemo控件,一次滾動整行?
我意識到TRichEdit可以根據選定的樣式具有不同的線高度。但是,如果頂線總是對齊(不顯示一半),這應該不成問題。
如果沒有簡單的方法,我可以調整在WM_VSCROLL消息的位置...
好了,所以我看着辦吧。
我的解決方案是讀取滾動條位置並從中計算行數。然後計算從當前行位置滾動的增量行數。
我捕獲到WM_MOUSEWHEEL
和WM_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
)的頂行索引。
我希望這是有幫助的,如果別人有同樣的問題。
這是比較容易捕捉WM_VSCROLL消息,然後此消息內確定線高度(通過EM_POSFROMCHAR,它和EM_LINEINDEX),然後更新thumbposition使得其行高的整數倍: POS =地板(POS/lineHeight)* lineHeight
我有同樣的問題...這是一個恥辱,只有火箭筒解決方案這樣一個小問題。我的意思是我永遠不會把這個放在我的代碼中,更好地保持這個問題。這太誇張了...不批評你,但C++ builder。 – 2014-02-21 11:12:50