2011-06-17 69 views
2

因此,我在.NET 2.0中創建了一個自定義用戶控件,並且此用戶控件基本上是一個組合的用戶控件(它帶有一個帶有標籤的圖片)。它的功能是基本表現得像一個按鈕,就可以點擊等在按鈕上調用_Paint點擊

現在我的問題是,無論出於何種原因邊框樣式不支持3D邊框...

所以當按鈕是unclicked它應該有Border3dStyle.Raised外觀。然後當它被按下時,它應該有Border3dStyle.Sunken外觀。

我通過覆蓋OnPaint方法獲得了Border3dStyle.Raised。是這樣的...

protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     ControlPaint.DrawBorder3D(e.Graphics, this.ClientRectangle, Border3DStyle.Raised); 
    } 

我有我想按鈕本身被點擊,這是我的想法可能會奏效時調用其他方法。

 private void UserInkControl_Paint(object sender, PaintEventArgs e) 
    { 
     Rectangle borderRectangle = this.ClientRectangle; 
     ControlPaint.DrawBorder3D(e.Graphics, borderRectangle, Border3DStyle.Sunken); 
    } 

我註冊它在加載事件

 private void UserInkControl_Load(object sender, EventArgs e) 
    { 
     this.Paint += new System.Windows.Forms.PaintEventHandler(this.UserInkControl_Paint); 
    } 

我如何可以調用UserInkControl_Paint當點擊事件被觸發?

回答

0
public void UserInkControl_Click(object sender, EventArgs ea) 
{ 
    UserInkControl.Refresh(); // Causes repainting immediately 
    // or 
    UserInkControl.Invalidate(); // Invalidates the whole painting surface, 
    //so when the message loop catches up, it gets repainted. 
    // There is also an overload of Invalidate that 
    // lets you invalidate a particular part of the button, 
    // So only this area is redrawn. This can reduce flicker. 
} 
+0

只有這個區域重新繪製,假設他只在他的「繪製」方法內繪製所需的區域。 – Vercas

0

你可以調用「myControl.Refresh()」。它會重新繪製整個控件。

1

Click事件不會爲你想要做什麼工作,因爲鼠標按鈕被按下,然後被釋放後特定事件時纔會調用。您應該使用MouseDown事件將布爾屬性(例如_isDown)設置爲true,然後再調用.Refresh();使用MouseUp事件來設置_isDown = false;,然後也只需撥打.Refresh()

Paint事件中,檢查_isDown屬性並使用適當的參數調用DrawBorder3D方法。