Windows繪畫模型可以很好地滿足您的要求。它從前景(OnPaint)分離繪製背景(OnPaintBackground)。然而,這並不意味着你只能畫一次背景並完成它。窗口表面失效會調用兩者。這首先需要使抗鋸齒效果正常工作,但它們只能在已知的背景色下看起來很好。
將其拖出並在OnPaintBackground()覆蓋中繪製圖像。您可以讓Control通過指定BackgroundImage屬性爲您自動執行此操作。您可能需要將DoubleBuffer屬性設置爲true,以避免您在繪製背景時看到的閃爍,並暫時清除前景像素。如果需要更新前景,請調用Invalidate()。
要完成,你的幻想其實是可能的。您需要使用頂層分層窗口覆蓋圖像。使用TransparencyKey屬性設置的表單很容易獲得。這裏是一個示例實現:
using System;
using System.Drawing;
using System.Windows.Forms;
class OverlayedPictureBox : PictureBox {
private Form mOverlay;
private bool mShown;
public event PaintEventHandler PaintOverlay;
public OverlayedPictureBox() {
mOverlay = new Form();
mOverlay.FormBorderStyle = FormBorderStyle.None;
mOverlay.TransparencyKey = mOverlay.BackColor = Color.Magenta;
mOverlay.ShowInTaskbar = false;
}
protected void OnPaintOverlay(PaintEventArgs e) {
// NOTE: override this or implement the PaintOverlay event
PaintEventHandler handler = PaintOverlay;
if (handler != null) handler(this, e);
}
public void RefreshOverlay() {
// NOTE: call this to force the overlay to be repainted
mOverlay.Invalidate();
}
protected override void Dispose(bool disposing) {
if (disposing) mOverlay.Dispose();
base.Dispose(disposing);
}
protected override void OnVisibleChanged(EventArgs e) {
if (!mShown && !this.DesignMode) {
Control parent = this.Parent;
while (!(parent is Form)) parent = parent.Parent;
parent.LocationChanged += new EventHandler(parent_LocationChanged);
mOverlay.Paint += new PaintEventHandler(mOverlay_Paint);
mOverlay.Show(parent);
mShown = true;
}
base.OnVisibleChanged(e);
}
protected override void OnLocationChanged(EventArgs e) {
mOverlay.Location = this.PointToScreen(Point.Empty);
base.OnLocationChanged(e);
}
protected override void OnSizeChanged(EventArgs e) {
mOverlay.Size = this.Size;
base.OnSizeChanged(e);
}
void parent_LocationChanged(object sender, EventArgs e) {
mOverlay.Location = this.PointToScreen(Point.Empty);
}
private void mOverlay_Paint(object sender, PaintEventArgs e) {
OnPaintOverlay(e);
}
}
一個有趣的工件:最小化窗體並重新恢復它看起來,呃,特殊。
這兩個答案都很棒。我必須選擇一個。 :-( – catfood 2010-01-05 15:29:36