線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2355
推到 Plurk!
推到 Facebook!

請問各位長官如何使 tMemo 透明,但要能顯示放在 tForm 上的 tImage

答題得分者是:歸木淡
borland_delphi70
中階會員


發表:8
回覆:50
積分:51
註冊:2002-12-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-12-13 00:03:53 IP:220.132.xxx.xxx 訂閱
各位長官:

我在 tForm 上放了一個 tImage 又放了一個 tMemo, 我用 procedure CreateParams(var Params: TCreateParams); override; 將 tMemo 變為透明,但 tMemo 會透過 tImage,而顯示 Windows 桌面的圖形,但是我希望 tMemo 顯示的是 tImage 上的畫面,請問各位長官是否能給我一些題示,謝謝!
歸木淡
中階會員


發表:1
回覆:49
積分:75
註冊:2005-09-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-12-30 03:14:17 IP:71.235.xxx.xxx 訂閱
可以把代碼貼出來嗎? 
我也想把memo變透明, 但是並沒有現成的vcl, 自己寫又太煩, 所以我用的是折衷的方法, 用label和scrollbar把memo的內容顯示出來, 用戶修改memo時才顯示memo, 效果還不錯.

下圖中間的說明是memo, 在寫作模式下可以變回memo


不太難寫, 大概300行左右.
要自己寫的話, Windows Graphics Programming - Win32 GDI and DirectDraw 是一本應該有的書.
歸木淡
中階會員


發表:1
回覆:49
積分:75
註冊:2005-09-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-02-16 14:41:25 IP:71.235.xxx.xxx 訂閱
最近看到一個有趣的方法
[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;是必須的.
系統時間:2024-05-17 18:11:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!