none
自訂Button切換TabControl換頁的問題 RRS feed

  • 問題

  • 各位大大

    我用VB2005編輯程式
    想練習自己自訂一個按鈕,控制TabControl的換頁,因此利用繼承PictureBox的方法。
    由於按鈕中有字體需要置中,因此加入了Label,使Label可以在PictureBox設為透明
    程式如下

    Form1

    Public Class Form1
    	Dim Special_Button1_bool As Boolean = False
    
    	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    		Special_Button1.lab.Text = "Multi"
    		Special_Button1.lab.TextAlign = ContentAlignment.MiddleCenter
    		Special_Button1_bool = False
    	End Sub
    	Private Sub Special_Button1_MouseClick1(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Special_Button1.MouseClick
    		If Special_Button1_bool = True Then
    			Me.TabControl1.SelectedTab = Me.TabPage1
    			Special_Button1_bool = False
    		Else
    			Me.TabControl1.SelectedTab = Me.TabPage2
    			Special_Button1_bool = True
    		End If
    	End Sub
    End Class



    Special_Button

    Public Class Special_Button
    	Inherits PictureBox
    	Public WithEvents lab As New Label
    	Public Sub New()
    		Controls.Add(lab)
    		lab.Size = New Size((Width), (Height))
    		lab.AutoSize = False
    		lab.Text = " "
    		lab.TextAlign = ContentAlignment.MiddleCenter
    		lab.ForeColor = Color.Black
    		lab.BackColor = Color.Black
    		BackgroundImageLayout = ImageLayout.Stretch
    	End Sub
    	Private Sub Special_Button_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown, lab.MouseDown
    		BackColor = Color.FromArgb(192, 222, 247)
    		lab.ForeColor = Color.FromArgb(255, 255, 255)
    	End Sub
    
    	Private Sub Special_Button_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter, lab.MouseEnter
    		BackColor = Color.FromArgb(192, 222, 247)
    		lab.ForeColor = Color.FromArgb(255, 255, 255)
    	End Sub
    
    	Private Sub Special_Button_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave, lab.MouseLeave
    		BackColor = Color.FromArgb(230, 230, 230)
    		lab.ForeColor = Color.FromArgb(20, 20, 20)
    	End Sub
    
    	Private Sub Special_Button_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp, lab.MouseUp
    		BackColor = Color.FromArgb(230, 230, 230)
    		lab.ForeColor = Color.FromArgb(20, 20, 20)
    	End Sub
    
    End Class
    

    由於在測試發現TabControl沒辦法換頁,因此我將Special_Button類別中的Label元件背景設為黑色
    後來發現,如果我點在黑色區塊則沒辦法切換TabControl的頁面,而如果點在PictureBox的部分則可以切換TabControl的頁面
    因此想請教我如何在Form1中的Special_Button1_MouseClick1中,觸發Special_Button類別程式中label的MouseClick的事件?

    2012年3月12日 上午 01:20

解答

  • Public Class Form1
        Dim Special_Button1_bool As Boolean = False
    
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Special_Button1.lab.Text = "Multi"
            Special_Button1.lab.TextAlign = ContentAlignment.MiddleCenter
            Special_Button1_bool = False
            AddHandler Special_Button1.lab.Click, AddressOf lab_Click
        End Sub
    
        Private Sub lab_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            If Special_Button1_bool = True Then
                Me.TabControl1.SelectedTab = Me.TabPage1
                Special_Button1_bool = False
            Else
                Me.TabControl1.SelectedTab = Me.TabPage2
                Special_Button1_bool = True
            End If
        End Sub
    End Class
    

    2012年3月15日 上午 05:20

所有回覆

  • You may need to do "Delegate Events"

    http://msdn.microsoft.com/en-us/library/17sde2xt.aspx (Eng)

    http://msdn.microsoft.com/zh-tw/library/17sde2xt.aspx (T.Chi)


    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD

    2012年3月12日 上午 06:18
  • 應該是說我希望可以在From1中的Function裡

    使用Special_Button類別中,lab元件的事件


    2012年3月12日 上午 10:54
  • 我是這樣做,一個上一頁,一個下一頁,兩個按鈕,看不懂你的問題??
    Private Sub buttonNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonNext.Click
    	tab.SelectedIndex += 1
    End Sub
    
    Private Sub buttonPrevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonPrevious.Click
    	tab.SelectedIndex -= 1
    End Sub
    
    


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年3月12日 下午 12:13
  • Yes, I usually do the same code as 心冷熱情熄's


    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    MVP for VB.NET since 2003

    2012年3月13日 上午 08:59
  • 各位大大好

    心冷熱情熄大大的的確可行,我一開始也是這麼做。

    不過在我的例子卻會有問題

    因為Button內建的元件的確是可以順利切換但是我自製的元件

    必須使用特殊圖案的按鈕因此我加入了Label元件,並重疊在按鈕上

    但是在Form程式執行時,同樣的程式片段卻沒有沒有預期的效果

    自製按鈕的截圖如下,我預設為透明,為了分別按鈕與Label元件,我把Label背景變為黑色



    當我按在灰色區塊(原按鈕圖示)時,可以正常切換TabControl頁面

    但是當按在黑色區塊(加入的Label)時,卻無法切換TabControl頁面

    因此想請教如何在點擊在Label(黑色區塊),也能切換TabControl頁面

    看不到圖的補貼

    圖檔

    2012年3月14日 上午 06:46
  • 那只需要加入 Label.Click handler,可以用同一個Button.Click event handler,在後面加 ", label.click" 便行

    Private Sub buttonNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonNext.Click, labelNext.Click
    	tab.SelectedIndex += 1
    End Sub
    
    Private Sub buttonPrevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonPrevious.Click, labelPrevious.Click
    	tab.SelectedIndex -= 1
    End Sub
    


    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    MVP for VB.NET since 2003

    2012年3月14日 上午 07:49
  • 看不到圖,用 skydrive 的公用空間放圖吧~

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年3月14日 下午 04:47
  • 各位大大好

    圖檔補貼

    圖檔

    MS MVP KenLin for VB.NET大大提的方法是要兩個元件都是在class Form底下才能這樣使用

    可能是小弟沒表達清楚,我寫了一個類別,類別中繼承了PictureBox元件,並宣告一個lab為Label

    利用Controls.Add(lab)後,便加入了Label到PictureBox元件之上

    Special_Button

    Public Class Special_Button
    	Inherits PictureBox
    	Public WithEvents lab As New Label
    	Public Sub New()
    		Controls.Add(lab)
    		lab.Size = New Size((Width), (Height))
    		lab.AutoSize = False
    		lab.Text = " "
    		lab.TextAlign = ContentAlignment.MiddleCenter
    		lab.ForeColor = Color.Black
    		lab.BackColor = Color.Black
    		BackgroundImageLayout = ImageLayout.Stretch
    	End Sub
    	Private Sub Special_Button_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown, lab.MouseDown
    		BackColor = Color.FromArgb(192, 222, 247)
    		lab.ForeColor = Color.FromArgb(255, 255, 255)
    	End Sub
    
    	Private Sub Special_Button_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter, lab.MouseEnter
    		BackColor = Color.FromArgb(192, 222, 247)
    		lab.ForeColor = Color.FromArgb(255, 255, 255)
    	End Sub
    
    	Private Sub Special_Button_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave, lab.MouseLeave
    		BackColor = Color.FromArgb(230, 230, 230)
    		lab.ForeColor = Color.FromArgb(20, 20, 20)
    	End Sub
    
    	Private Sub Special_Button_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp, lab.MouseUp
    		BackColor = Color.FromArgb(230, 230, 230)
    		lab.ForeColor = Color.FromArgb(20, 20, 20)
    	End Sub
    
    End Class

    加入後在Form1底下可以拉近來Special_Button1上面是一個範例

    小弟遇到的問題是

    BackColor = Color.FromArgb(230, 230, 230) 都會被 lab.ForeColor = Color.FromArgb(20, 20, 20)檔到

    點擊檔到的部分(黑色區塊)無法切換TabControl頁面

    只有為檔到的區域(灰色區塊)可以正常切換TabControl頁面

    因此我想說是否可以在class Form1底下觸發Special_Button1中的lab事件,使其也可以正常的觸發讓頁面切換

    又或者有其他方法可行,請多指教。

    2012年3月15日 上午 01:48
  • Public Class Form1
        Dim Special_Button1_bool As Boolean = False
    
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Special_Button1.lab.Text = "Multi"
            Special_Button1.lab.TextAlign = ContentAlignment.MiddleCenter
            Special_Button1_bool = False
            AddHandler Special_Button1.lab.Click, AddressOf lab_Click
        End Sub
    
        Private Sub lab_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            If Special_Button1_bool = True Then
                Me.TabControl1.SelectedTab = Me.TabPage1
                Special_Button1_bool = False
            Else
                Me.TabControl1.SelectedTab = Me.TabPage2
                Special_Button1_bool = True
            End If
        End Sub
    End Class
    

    2012年3月15日 上午 05:20