2017-09-08 83 views
1

如果您將一個普通的TImage組件放置在窗體或面板上方,而不是其他組件,>>它在運行時不可見,只要不加載圖片即可。所以它下面的其他東西是可見的。德爾福TImage32 - 如何使組件不可見,如果沒有圖片加載?

但是TImage32默認情況下是繪製一個灰色框。

如何在離開設置時使其不可見:.Visible:= True;如果沒有圖片加載?
(我還需要事件的工作部件上,像的OnClick ...)

是的,這是一個重複的問題,但是從previous topicsolution-link已經死了。 :(

回答

1

雖然我仍然可以訪問新聞組的帖子,但我不知道主題ID與主題標題(這是我擁有的)有什麼關係。但是,根據新聞組中的搜索,我發現了幾個我猜這個組件(不是核心庫的一部分)是某種方式的解決方案的一部分

所以,雖然這個組件來自的擴展包不再維護,讓我們更深入地瞭解它的功能

首先,我必須說TImage32將總是將其緩衝區的內容繪製(複製)到顯示屏上,這意味着此組件後面的圖形將被d EFAULT。

TImage32Ex的技巧是獲取父母的內容並將其繪製到緩衝區中。

隨着adaptions的代碼看起來是這樣

var 
    P: TPoint; 
    SaveIndex: Integer; 
begin 
    SaveIndex := SaveDC(Buffer.Handle); 
    try 
    GetViewportOrgEx(Buffer.Handle, P); 
    SetViewportOrgEx(Buffer.Handle, P.X - Left, P.Y - Top, nil); 
    IntersectClipRect(Buffer.Handle, 0, 0, Parent.ClientWidth, Parent.ClientHeight); 
    Parent.Perform(WM_ERASEBKGND, Buffer.Handle, 0); 
    Parent.Perform(WM_PAINT, Buffer.Handle, 0); 
    finally 
    RestoreDC(Buffer.Handle, SaveIndex); 
    end; 
end; 

上述代碼繪製(WM_PAINT)父內容到緩衝器。

例如,如果你想叫PaintBox32的TPaintBox32實例是透明的只是將下面的代碼添加到「PaintBuffer」處理程序:

procedure TForm3.PaintBox32PaintBuffer(Sender: TObject); 
var 
    P: TPoint; 
    SaveIndex: Integer; 
begin 
    SaveIndex := SaveDC(PaintBox32.Buffer.Handle); 
    try 
    GetViewportOrgEx(PaintBox32.Buffer.Handle, P); 
    SetViewportOrgEx(PaintBox32.Buffer.Handle, P.X - PaintBox32.Left, P.Y - PaintBox32.Top, nil); 
    IntersectClipRect(PaintBox32.Buffer.Handle, 0, 0, PaintBox32.Parent.ClientWidth, PaintBox32.Parent.ClientHeight); 
    PaintBox32.Parent.Perform(WM_ERASEBKGND, PaintBox32.Buffer.Handle, 0); 
    PaintBox32.Parent.Perform(WM_PAINT, PaintBox32.Buffer.Handle, 0); 
    finally 
    RestoreDC(PaintBox32.Buffer.Handle, SaveIndex); 
    end; 
end; 

注意:當這個作品基本上,它可能沒有捕捉到父母的子控制適當。 TWinControl後代尤其如此。雖然也有解決這種情況的解決方案,但在每個細節中都要覆蓋這個問題要複雜得多(例如,底層TEdit實例的閃爍光標)

0

我使用timage來掩蓋進度條並給它一個形狀。

我所做的是加載一個PNG部分,然後將其放在我的進度條上。

我認爲這應該達到你的目標。在你的timage中放置一個透明PNG。

乾杯, E.