雖然我仍然可以訪問新聞組的帖子,但我不知道主題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實例的閃爍光標)