自製元件無法觸發 OnMouseDown 事件 |
答題得分者是:Justmade
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
小弟做了一個簡單的元件, 目的是可以在一個 TEdit 內可以顯示不同顏色的字元
於是把一個 TImage 元件放進 TEdit 內,
當用滑鼠 Click 在 TImage 上時, 便 SetFocus 到 TEdit 上
使用時利用該 TImage.Canvas.TextOut 的方式來畫出不同顏色的字元
(以 FColorCode 來記錄字元的顏色)
可是出現了一個問題,
假設已經在 TEdit 內輸入了一些字
此時欲用滑鼠點選該 TEdit 元件來改變 TEdit.SelStart 值
發現它是沒有作用的, 一定要用鍵盤的上/下/Home/End等鍵才有用
請問一下大家, 小弟該怎麼解決這個問題?
unit MyEdit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TMyEdit = class(TEdit) private FImg: TImage; FLogFont: TLogFont; FColorCode: string; procedure SetColorCode(Value: string); protected procedure ImgClick(Sender: TObject); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; property Img: TImage read FImg; property ColorCode: string read FColorCode write SetColorCode; published end; procedure Register; implementation procedure Register; begin RegisterComponents('My', [TMyEdit]); end; { TMyEdit } constructor TMyEdit.Create(AOwner: TComponent); begin inherited; Font.Name := 'Courier New'; Font.Size := 12; Font.Height := 24; GetObject(Font.Handle, SizeOf(TLogFont), @FLogFont); FlogFont.lfWidth := 8; Font.Handle := CreateFontIndirect(FLogFont); FImg := TImage.Create(Self); FImg.Parent := Self; FImg.Width := Width + 900; FImg.Align := alClient; FImg.Canvas.Brush.Color := clBlack; FImg.Canvas.FillRect(Rect(0, 0, Width, Height)); FImg.Refresh; FImg.Canvas.Font.Assign(Font); FImg.Canvas.Font.Color := clRed; FImg.OnClick := ImgClick; FColorCode := ''; end; destructor TMyEdit.Destroy; begin if Assigned(FImg) then FImg.Free; inherited; end; procedure TMyEdit.ImgClick(Sender: TObject); begin Self.SetFocus; end; procedure TMyEdit.SetColorCode(Value: string); begin if FColorCode <> Value then FColorCode := Value; end; end.--- 每個人都是一本書 |
Rain
資深會員 發表:31 回覆:236 積分:268 註冊:2003-02-17 發送簡訊給我 |
我覺得你可以直接創建一個Canvas物件而無須借助使用Image的這個屬性 type
TMyEdit = class(TEdit)
private
FDC: HDC;
FCanvas: TCanvas;
protected
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
end; { TMyEdit } constructor TMyEdit.Create(AOwner: TComponent);
begin
inherited;
FDC := GetDC(Handle);
FCanvas := TCanvas.Create;
FCanvas.Handle := FDC;
end; destructor TMyEdit.Destroy;
begin
FCanvas.Free;
ReleaseDC(Handle, FDC);
inherited;
end;
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
感謝 Rain 兄的解答. :)
小弟斗膽再請教, 直接用 TCanvas 而不用 TImage
小弟就不知怎麼將字顯示在 TMyEdit.Canvas 上了
小弟用了如下的程式, 但 MyEdit1 內無法顯示紅色的字
懇請指正, 小弟哪裏做錯了. 謝謝.
var TmpRect: TmpRect; begin MyEdit1.Canvas.Handle := GetDC(MyEdit1.Handle); TmpRect := MyEdit1.ClientRect; MyEdit1.Canvas.Rectangle(TmpRect.Left, TmpRect.Top, TmpRect.Right, TmpRect.Bottom); MyEdit1.Canvas.Brush.Color := clBlack; MyEdit1.Canvas.FillRect(TmpRect); MyEdit1.Canvas.Font.Color := clRed; MyEdit1.Canvas.TextOut(0, 0, 'TEST'); end;--- 每個人都是一本書 發表人 - hagar 於 2003/05/27 18:35:33 |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
hagar 兄, 我也同意直接使用 TCanvas 這是把你們的碼合在一起 :
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMyEdit = class(TEdit) private FDC: HDC; FCanvas: TCanvas; procedure WMPaint(var Message: TWMPaint); message WM_PAINT; protected public constructor Create(AOwner: TComponent); override; destructor Destroy; override; property Canvas : TCanvas read FCanvas write FCanvas; published end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public MyEdit, MyEdit2 : TMyEdit; { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} constructor TMyEdit.Create(AOwner: TComponent); begin inherited; Parent := TWinControl(AOwner); FDC := GetDC(Handle); FCanvas := TCanvas.Create; FCanvas.Handle := FDC; FCanvas.Rectangle(ClientRect.Left, ClientRect.Top, ClientRect.Right, ClientRect.Bottom); end; destructor TMyEdit.Destroy; begin FCanvas.Free; ReleaseDC(Handle, FDC); inherited; end; procedure TMyEdit.WMPaint(var Message: TWMPaint); begin inherited; FCanvas.Brush.Color := clBlack; FCanvas.FillRect(ClientRect); FCanvas.Font.Color := clRed; FCanvas.TextOut(0, 0, Text); end; procedure TForm1.FormCreate(Sender: TObject); begin MyEdit := TMyEdit.Create(self); MyEdit.Text := 'MyTest1'; MyEdit2 := TMyEdit.Create(self); MyEdit2.Top := 30; MyEdit2.Text := 'MyTest2'; end; procedure TForm1.FormDestroy(Sender: TObject); begin MyEdit.Free; MyEdit2.Free; end; end.不用放任何元件, copy to unit1 執行即可 這還有很多問題,只是初按照你倆的構思的初步架構。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |