有辦法可以得知目前畫面上Memo的容納的行數嗎... |
答題得分者是:g6101
|
ychch0819
一般會員 發表:25 回覆:29 積分:15 註冊:2006-08-09 發送簡訊給我 |
Memo的大小會隨著Form Size而改變...
請問有辦法得知目前畫面上Memo的大小 所能容納的行數… 也就是沒有Scroll的行數…而不是要Memo內的總行數… 感謝… 本來的目的是Memo在Search時,若下一個目標字串需要scroll 畫面,則Memo會自動把畫面scroll到 目標字串 顯示在 最後一行… 但我想在這個情況發生時,自動把 目標字串的那一行往上移,不要在最後一行… 就如同 TextPad一樣,有試過 "MemoScroll"這個 Event... 但好像有一些問題…有時會觸發,有時不會… |
g6101
高階會員 發表:22 回覆:129 積分:110 註冊:2002-06-15 發送簡訊給我 |
|
ychch0819
一般會員 發表:25 回覆:29 積分:15 註冊:2006-08-09 發送簡訊給我 |
感謝 你的回答…
但我用 int lineno=0; SendMessage(DCMemo->Handle,EM_GETFIRSTVISIBLELINE,0,0); 測試的結果… 回傳值一直是 0; 後來不管lineno的 initial值為多少,回傳值就是多少,感覺是 SendMessage失敗了… 不知道是不是DCMemo沒有辦法收到這個 Message.... 不知道還有沒有其他辦法.... thk... ===================引 用 g6101 文 章=================== 站上就有您想要的答案,請搜尋 EM_GETRECT、EM_GETFIRSTVISIBLELINE 這兩個關鍵字,祝順心! |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
偷雞..
[code delphi] procedure TfrmMain.Button1Click(Sender: TObject); var n: Integer; begin Memo1.Font.Name := 'MS Sans Serif'; // Memo1.Font.Name := '新細明體'; n := 0; if Memo1.Font.Name='MS Sans Serif' then n := 2 else if Memo1.Font.Name='新細明體' then n := 0; n := ABS(Memo1.Font.Height) n; n := Memo1.ClientHeight div n; ShowMessage(Format('VisibleLines=%d',[n])); end; [/code] |
g6101
高階會員 發表:22 回覆:129 積分:110 註冊:2002-06-15 發送簡訊給我 |
提供您一些代碼,供參考!
[code cpp] //取得可視文件頭行 //0為行號1;1為行號2,依此類推 int lineno = SendMessage(Memo1->Handle,EM_GETFIRSTVISIBLELINE,0,0); //取得字體高;(註:取得字體高度有多種方法,自行查閱) int hold = Canvas->Font->Size; Canvas->Font->Size = Memo1->Font->Size; int FontHeight = Canvas->TextHeight("字"); Canvas->Font->Size = hold; //計算可視文件行數 TRect rect; SendMessage(Memo1->Handle,EM_GETRECT,0,(long)&rect); int vLines = (rect.Bottom - rect.Top)/FontHeight; //如何控制 Memo 滾動條到底部及最右邊. int min,max; //垂直滾動條 GetScrollRange(Memo1->Handle,SB_VERT,&min,&max); SetScrollPos(Memo1->Handle,SB_VERT,max,true); PostMessage(Memo1->Handle,WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0); //水平滾動條 GetScrollRange(Memo1->Handle,SB_HORZ,&min,&max); SetScrollPos(Memo1->Handle,SB_HORZ,max,true); for (int i=0;i } //其他的參數可以自己 try 不一樣的位置 //SB_LINEUP,SB_PAGEUP,VK_NEXT,SB_PAGEDOWN,SB_LINEDOWN,SB_TOP,SB_BOTTOM [/code] |
ychch0819
一般會員 發表:25 回覆:29 積分:15 註冊:2006-08-09 發送簡訊給我 |
謝謝 g6101的回答…
目前已經測試出來了… 但是計算出來的vLines會有一些誤差…我猜可以跟字型有關… 非常感謝… 也謝謝 jow 的回覆… ===================引 用 g6101 文 章=================== 提供您一些代碼,供參考! [code cpp] //取得可視文件頭行 //0為行號1;1為行號2,依此類推 int lineno = SendMessage(Memo1->Handle,EM_GETFIRSTVISIBLELINE,0,0); //取得字體高;(註:取得字體高度有多種方法,自行查閱) int hold = Canvas->Font->Size; Canvas->Font->Size = Memo1->Font->Size; int FontHeight = Canvas->TextHeight("字"); Canvas->Font->Size = hold; //計算可視文件行數 TRect rect; SendMessage(Memo1->Handle,EM_GETRECT,0,(long)&rect); int vLines = (rect.Bottom - rect.Top)/FontHeight; //如何控制 Memo 滾動條到底部及最右邊. int min,max; //垂直滾動條 GetScrollRange(Memo1->Handle,SB_VERT,&min,&max); SetScrollPos(Memo1->Handle,SB_VERT,max,true); PostMessage(Memo1->Handle,WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0); //水平滾動條 GetScrollRange(Memo1->Handle,SB_HORZ,&min,&max); SetScrollPos(Memo1->Handle,SB_HORZ,max,true); for (int i=0;i //其他的參數可以自己 try 不一樣的位置 //SB_LINEUP,SB_PAGEUP,VK_NEXT,SB_PAGEDOWN,SB_LINEDOWN,SB_TOP,SB_BOTTOM [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |