2016-06-13 104 views
0

我試圖將此C++ MFC應用程序移植到C#WinForm中。這是一項正在進行的工作。基本上,我想要做一些拉伸成組框區域:在組框中使用WinForm Paint事件

Dialog design

我加了油漆處理程序的形式做我的工作:

private void FullColourPaletteForm_Paint(object sender, PaintEventArgs e) 
{ 
    // Do painting with e.Graphics 
} 

我很驚訝地看到,它沒有不顯示我的渲染。但是,然後我意識到,在Winform中,它不稱爲groupbox,而是container。所以,我設置的容器是不可見的,可以理解我的渲染(儘管並不完全正確)現在visble:

Dialog results

我怎麼到容器的區域內做我的畫嗎?

這是爲什麼呢?我所做的只是補充:

private void groupBox1_Paint(object sender, PaintEventArgs e) 
{ 
    base.OnPaint(e); 
} 

現在我的表格畫是可見的。

+0

改爲使用GroupBox的Paint事件。 –

+0

謝謝。請看我更新的問題。 –

+0

每個控件都有自己的繪畫事件。當繪製表單時(當可見性改變時),每個控件的'OnPaint'方法被調用(在繪畫結束時調用'Paint'事件)。你正在做的是創建一個自定義控件來繪製調色板。它不一定是'GroupBox',你可以使用'Control'來代替。如果你想保留那個'GroupBox'邊框,那麼你可以重寫'Paint'方法並首先調用'base.OnPaint',然後在其上繪製。不確定是否是這種情況,但有時候自己繪製一切都是值得的(你可以使用ControlPaint.DrawBorder來繪製邊框)。 – Sinatr

回答

1

每個窗口(控件,窗體等)都有自己的繪畫,通常從該繪畫中裁剪(排除)兒童。

如果您想在GroupBox(或任何控件)中畫圖,您應該在相應的控件(您的案例中的GroupBoxPaint事件中處理該事件,而不是形式一。

private void groupBox_Paint(object sender, PaintEventArgs e) 
{ 
    var area = groupBox.DisplayRectangle; 
    // Draw inside the area 
    e.Graphics.FillRectangle(Brushes.Green, area); 
} 
+0

我最終在其中放置了一個'PictureBox'盒子,並使用了'Paint'事件,因爲它原生支持'DoubleBuffering'。 –