請問各位長官如何使 tMemo 透明,但要能顯示放在 tForm 上的 tImage |
答題得分者是:歸木淡
|
borland_delphi70
中階會員 發表:8 回覆:50 積分:51 註冊:2002-12-06 發送簡訊給我 |
|
歸木淡
中階會員 發表:1 回覆:49 積分:75 註冊:2005-09-07 發送簡訊給我 |
|
歸木淡
中階會員 發表:1 回覆:49 積分:75 註冊:2005-09-07 發送簡訊給我 |
最近看到一個有趣的方法
[code delphi] from the coolform guys www.lawrenz.com/coolform/ unit TrMemo; {$R-} interface uses Messages, Controls, StdCtrls,classes; Const TMWM__SpecialInvalidate=WM_USER 1111; type TTransparentMemo = class(TMemo) private procedure SpecialInvalidate(var Message:TMessage); message TMWM__SpecialInvalidate; procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL; procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL; procedure WMSetText(var Message:TWMSetText); message WM_SETTEXT; procedure CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT); message CN_CTLCOLOREDIT; procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN; procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; protected procedure CreateParams(var Params: TCreateParams); override; public constructor Create(AOwner: TComponent); override; end; implementation uses Windows; procedure TTransparentMemo.WMHScroll(var Message: TWMHScroll); begin inherited; PostMessage(Handle,TMWM__SpecialInvalidate,0,0); end; procedure TTransparentMemo.WMVScroll(var Message: TWMVScroll); begin SendMessage(Handle,TMWM__SpecialInvalidate,0,0); inherited; PostMessage(Handle,TMWM__SpecialInvalidate,0,0); end; procedure TTransparentMemo.CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT); begin with Message do begin SetBkMode(ChildDC,TRANSPARENT); Result:=GetStockObject(HOLLOW_BRUSH) end end; procedure TTransparentMemo.WMSetText(var Message:TWMSetText); begin inherited; if not (csDesigning in ComponentState) then PostMessage(Handle,TMWM__SpecialInvalidate,0,0) end; procedure TTransparentMemo.SpecialInvalidate(var Message:TMessage); var r:TRect; begin if Parent<>nil then begin r:=ClientRect; r.TopLeft:=Parent.ScreenToClient(ClientToScreen(r.TopLeft)); r.BottomRight:=Parent.ScreenToClient(ClientToScreen(r.BottomRight)); InvalidateRect(Parent.Handle,@r,true); RedrawWindow(Handle,nil,0,RDW_FRAME RDW_INVALIDATE) end; end; procedure TTransparentMemo.WMKeyDown(var Message: TWMKeyDown); begin SendMessage(Handle,TMWM__SpecialInvalidate,0,0); inherited; PostMessage(Handle,TMWM__SpecialInvalidate,0,0); end; procedure TTransparentMemo.WMEraseBkgnd(var Message: TWMEraseBkgnd); begin Message.Result:=1 end; constructor TTransparentMemo.Create(AOwner: TComponent); begin inherited; ControlStyle:=[csCaptureMouse, csDesignInteractive, csClickEvents, csSetCaption, csOpaque, csDoubleClicks, csReplicatable, csNoStdEvents]; end; procedure TTransparentMemo.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); with Params do begin ExStyle:=ExStyle or WS_EX_TRANSPARENT and not WS_EX_WINDOWEDGE and not WS_EX_STATICEDGE and not WS_EX_DLGMODALFRAME and not WS_EX_CLIENTEDGE; end; end; end. [/code] 它有兩個問題, 一是memo.readonly:=true之後便不透明, 二是選擇了一部分之後, 取消選擇,反白的部分不會變回來. 第一個問題處理CN_CTLCOLORSTATIC應該可以解決, 第二個問題就麻煩點, 處理 EM_SETSEL 或者可以. 如果不行的話, 當memo.focused時變回不透明可能方便點. parent.doublebuffered:=true;是必須的. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |