有關RichEdit上的文字問題 |
尚未結案
|
jason8668
一般會員 發表:17 回覆:31 積分:9 註冊:2003-11-01 發送簡訊給我 |
|
chris_shieh
高階會員 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); begin SendMessage(RichEdit1.Handle, WM_HSCROLL, scrollPos, 0); end; procedure TForm1.ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); begin SendMessage(RichEdit1.Handle, WM_VSCROLL, scrollPos, 0); end; |
jason8668
一般會員 發表:17 回覆:31 積分:9 註冊:2003-11-01 發送簡訊給我 |
|
chris_shieh
高階會員 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
//參考 http://delphi.ktop.com.tw/topic.php?topic_id=27548 改寫
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) RichEdit1: TRichEdit; ScrollBar1: TScrollBar; ScrollBar2: TScrollBar; Label1: TLabel; Label2: TLabel; procedure ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); procedure ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); procedure FormCreate(Sender: TObject); private procedure NewWinProc(var Message: TMessage); { Private declarations } public OldWinProc:TWndMethod; { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin OldWinProc:=RichEdit1.WindowProc; RichEdit1.WindowProc:=NewWinProc; RichEdit1.ScrollBars:=ssBoth;//藉以顯示同步效果 end; procedure TForm1.NewWinProc(var Message: TMessage); var min, max:integer; begin OldWinProc(Message); case (Message.Msg) of WM_VSCROLL: begin ScrollBar2.Position := GetScrollPos(RichEdit1.Handle, SB_VERT); GetScrollRange(RichEdit1.Handle, SB_VERT, min, max); ScrollBar2.Min := min; ScrollBar2.Max := max; end; WM_HSCROLL: begin ScrollBar1.Position := GetScrollPos(RichEdit1.Handle, SB_HORZ); GetScrollRange(RichEdit1.Handle, SB_HORZ, min, max); ScrollBar1.Min := min; ScrollBar1.Max := max; end; end; end; procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); var wParam:integer; begin wParam := ScrollPos shl 16; wParam := wParam LOWORD(ScrollCode); SendMessage(Richedit1.Handle, WM_HSCROLL, wParam, 0); end; procedure TForm1.ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); var wParam:integer; begin wParam := ScrollPos shl 16; wParam := wParam LOWORD(ScrollCode); SendMessage(Richedit1.Handle, WM_VSCROLL, wParam, 0); end; end.發表人 - chris_shieh 於 2004/12/24 16:47:53 |
jason8668
一般會員 發表:17 回覆:31 積分:9 註冊:2003-11-01 發送簡訊給我 |
|
chris_shieh
高階會員 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
我想應該是跟ssBoth 或 ssNone 無關
應該是跟ScrollRange 有關
我試結果OK
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) RichEdit1: TRichEdit; ScrollBar1: TScrollBar; ScrollBar2: TScrollBar; Label1: TLabel; Label2: TLabel; procedure ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); procedure ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); procedure FormCreate(Sender: TObject); private procedure NewWinProc(var Message: TMessage); procedure UpdateScrollRange; { Private declarations } public ssStyle:TScrollStyle; // OldWinProc:TWndMethod; { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin // OldWinProc:=RichEdit1.WindowProc; // RichEdit1.WindowProc:=NewWinProc; RichEdit1.ScrollBars:=ssNone; UpdateScrollRange; end; //每次RichEdit1 內容有更動時都要呼叫一次 以更新 ScrollBar1,2 的Range procedure TForm1.UpdateScrollRange; var min, max:integer; pt:TPoint; begin ssStyle:=RichEdit1.ScrollBars; RichEdit1.ScrollBars:=ssBoth;//藉以取得Scroll Range效果 GetScrollRange(RichEdit1.Handle, SB_VERT, min, max); ScrollBar2.Min := min; ScrollBar2.Max := max; GetScrollRange(RichEdit1.Handle, SB_HORZ, min, max); ScrollBar1.Min := min; ScrollBar1.Max := max; RichEdit1.ScrollBars:=ssStyle;//回復原來狀態 end; procedure TForm1.NewWinProc(var Message: TMessage); var min, max:integer; APoint:TPoint; begin OldWinProc(Message); case (Message.Msg) of //這些內容如果沒有Scrollbar存在就抓不到了 //必須另外處理移動游標,(經由Keyboard或Mouse) 所產生的訊息, 才能讓ScrollBar跟RichEdit同步 WM_VSCROLL: begin ScrollBar2.Position := GetScrollPos(RichEdit1.Handle, SB_VERT); GetScrollRange(RichEdit1.Handle, SB_VERT, min, max); ScrollBar2.Min := min; ScrollBar2.Max := max; end; //這些內容如果沒有Scrollbar存在就抓不到了 //必須另外處理移動游標,(經由Keyboard或Mouse) 所產生的訊息, 才能讓ScrollBar跟RichEdit同步 WM_HSCROLL: //這些內容如果沒有Scrollbar存在就抓不到了 begin ScrollBar1.Position := GetScrollPos(RichEdit1.Handle, SB_HORZ); GetScrollRange(RichEdit1.Handle, SB_HORZ, min, max); ScrollBar1.Min := min; ScrollBar1.Max := max; end; end; end; procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); var wParam:integer; begin wParam := ScrollPos shl 16; wParam := wParam LOWORD(ScrollCode); SendMessage(Richedit1.Handle, WM_HSCROLL, wParam, 0); //這樣就可以讓RichEdit跟ScrollBar 同步 end; procedure TForm1.ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); var wParam:integer; begin wParam := ScrollPos shl 16; wParam := wParam LOWORD(ScrollCode); SendMessage(Richedit1.Handle, WM_VSCROLL, wParam, 0); //這樣就可以讓RichEdit跟ScrollBar 同步 end; end. |
jason8668
一般會員 發表:17 回覆:31 積分:9 註冊:2003-11-01 發送簡訊給我 |
|
chris_shieh
高階會員 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
|
jason8668
一般會員 發表:17 回覆:31 積分:9 註冊:2003-11-01 發送簡訊給我 |
//--------------------------------------------------------------------------- #include
|
chris_shieh
高階會員 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |