TEdit、TMemo..等元件,如何改變游標樣式 |
答題得分者是:hagar
|
shinjie
資深會員 發表:12 回覆:275 積分:287 註冊:2003-03-19 發送簡訊給我 |
|
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
|
shinjie
資深會員 發表:12 回覆:275 積分:287 註冊:2003-03-19 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
事實上,就是透過這些 API 處理。
CreateCaret
DestroyCaret
HideCaret
ShowCaret hagar兄
所提供的 TCaretEdit。
有一個小問題,就是當 TabOrder 次序為0。游標就不會顯現出來。
主要漏了處理 WM_KEYDOWN,WM_LBUTTONDOWN 訊息。加進去處理,就可以了。 以下使用沒有繼承元件的作法。參考
type TForm1 = class(TForm) Edit1: TEdit; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private public end; var Form1: TForm1; implementation {$R *.DFM} var CaretBmp : TBitmap; OldEditWndProc : Pointer; function NewEditWndProc(hWindow: HWnd; Msg ,WParam,LParam: Longint): Longint;stdcall; begin Result := CallWindowProc(OldEditWndProc,hWindow, Msg, WParam, LParam); Case Msg of WM_KEYDOWN,WM_LBUTTONDOWN,WM_SETFOCUS : begin CreateCaret(hWindow, CaretBmp.Handle, 0, 0); ShowCaret(hWindow); end; end; end; procedure TForm1.FormCreate(Sender: TObject); Const CaretW = 3; {游標寬} CaretH = 12; {游標長} CaretColor = clBlue; {顏色為反相後顏色} begin CaretBmp := TBitmap.Create; With CaretBmp do begin Width := CaretW; Height := CaretH; Canvas.Brush.Color := CaretColor; Canvas.FillRect(Canvas.ClipRect); end; OldEditWndProc := Pointer(SetWindowLong(Edit1.Handle,GWL_WNDPROC ,LongInt(@NewEditWndProc))); end; procedure TForm1.FormDestroy(Sender: TObject); begin SetWindowLong(Edit1.Handle,GWL_WNDPROC, LongInt(OldEditWndProc)); CaretBmp.Free; end;~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~ |
shinjie
資深會員 發表:12 回覆:275 積分:287 註冊:2003-03-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |