ListView and TabControl Custom Drawing.
Windows Desktop контроли ListView та TabControl, виглядають не дуже приємно, але вони мають можливість поширення власними засобами малювання їх. Власні засоби включаються ось таким чином.
Метою власного малювання TabControl'а є невеличке покращення його зовнішнього вигляду, например кольорове виділення поточної вкладки ось так.
Код такого удосконалення дуже простий.
91: Dim CurrenPageIndex As Integer
92: Private Overloads Sub tabControl1_DrawItem(ByVal sender As Object, ByVal e As DrawItemEventArgs) Handles TabControl1.DrawItem
93: Try
94: Dim br As Brush = New SolidBrush(System.Drawing.SystemColors.Highlight)
95: 'Debug.Print("e.Index=" & e.Index & ";")
96: Dim sz As SizeF
97: If e.Index = CurrenPageIndex Then
98: sz = e.Graphics.MeasureString(TabControl1.TabPages(e.Index).Text, e.Font)
99: e.Graphics.DrawString(TabControl1.TabPages(e.Index).Text, e.Font, br, e.Bounds.Left + (e.Bounds.Width - sz.Width) / 2, e.Bounds.Top + (e.Bounds.Height - sz.Height) / 2 + 1)
100: Else
101: sz = e.Graphics.MeasureString(TabControl1.TabPages(e.Index).Text, e.Font)
102: e.Graphics.DrawString(TabControl1.TabPages(e.Index).Text, e.Font, Brushes.Black, e.Bounds.Left + (e.Bounds.Width - sz.Width) / 2, e.Bounds.Top + (e.Bounds.Height - sz.Height) / 2 + 1)
103: End If
104: Catch ex As Exception
105:
106: End Try
107: End Sub
Мета кастомного малювання ListView зазвичай інша - зберегти виділення на ListView, після того, як фокус ввода був перенесений у іншу частину форми. Тобто я щось вибрав у ListView, після цього пішов далі по формі, а вибір у ListView зберігся.
Це теж робиться неважко, але тут потрібно трохи більше, ніж просто обробити евент DrawItem. Нище повний код цього фрагмента форми.
582: Private Sub RefreshWaslawFileListViewButton_Click(sender As Object, e As EventArgs) Handles RefreshWaslawFileListViewButton.Click
583: FillWestlawTFileListView()
584: End Sub
585:
586: Sub FillWestlawTFileListView()
587: If SelectedTempPath = "" Then
588: MsgBox("Please firstly Select temporary folder to read email")
589: TabControl1.SelectedTab = MailBoxTab
590: Exit Sub
591: End If
592: WestlawFileListView.Items.Clear()
593: Dim Files As ReadOnlyCollection(Of String) = My.Computer.FileSystem.GetFiles(SelectedTempPath, FileIO.SearchOption.SearchTopLevelOnly, "Westlaw.*")
594: For Each One In Files
595: Dim FileName As String = IO.Path.GetFileName(One)
596: WestlawFileListView.Items.Add(FileName)
597: Next
598: WestlawFileListView.Refresh()
599: End Sub
600:
601:
602:
603: Dim WestlawSelectedListViewFileName As String
604: Private Sub WestlawFileListView_SelectedIndexChanged(sender As Object, e As EventArgs) Handles WestlawFileListView.SelectedIndexChanged
605: If FileCombineLocation = "" Then
606: MsgBox("Please firstly Set Location of FileCombine tool")
607: Else
608: If WestlawFileListView.SelectedItems.Count > 0 Then
609: WestlawSelectedListViewFileName = WestlawFileListView.SelectedItems(0).Text
610: UpdateLabel(Microsoft.VisualBasic.Left(WestlawSelectedListViewFileName, 55))
611: For Each OneRow As ListViewItem In WestlawFileListView.Items
612: If OneRow.Text = WestlawSelectedListViewFileName Then
613: OneRow.BackColor = Color.LightBlue
614: OneRow.Selected = True
615: Else
616: OneRow.BackColor = Color.White
617: OneRow.Selected = False
618: End If
619: Next
620: End If
621: End If
622: If WestlawSelectedListViewFileName <> "" And FileCombineLocation <> "" Then
623: AwsDownloadButton.Enabled = True
624: End If
625: End Sub
626:
627: Dim WestlawListView1LostFocusItem As Integer = -1
628: Private Sub WestlawFileListView_Leave(sender As Object, e As EventArgs) Handles WestlawFileListView.Leave
629: WestlawListView1LostFocusItem = WestlawFileListView.FocusedItem.Index
630: End Sub
631:
632: Private Sub WestlawFileListView_DrawItem(sender As Object, e As DrawListViewItemEventArgs) Handles WestlawFileListView.DrawItem
633: If e.Item.Selected Then
634: If WestlawListView1LostFocusItem = e.Item.Index Then
635: e.Item.ForeColor = Color.Black
636: e.Item.BackColor = Color.LightBlue
637: WestlawListView1LostFocusItem = -1
638: ElseIf WestlawFileListView.Focused Then
639: e.Item.ForeColor = SystemColors.HighlightText
640: e.Item.BackColor = SystemColors.Highlight
641: End If
642: Else
643: e.Item.ForeColor = WestlawFileListView.ForeColor
644: e.Item.BackColor = WestlawFileListView.BackColor
645: End If
646: e.DrawBackground()
647: e.DrawText()
648: End Sub
Це невеличкі базові навички будування десктопних програм. Без них зазвичай не працює ніяка десктопна прога. Таких хитрощів, багато, наприклад у мене є сотні ось таких невеличких поширень стандартних мікрософтовських контролів, ну наприклад цей Extension дозволяє у комбобоксі виіставити selected-єлементом саме такий, у якому буде означений текст.
Але єкстеншени - це трохи інша тема, ось тут більше про них - Оновлення StatusLabel з потоку BackGroundWorker - приклад застосування Action, Delegate, Invoke, AddressOf, Extension, Expression, Мої поширення Linq-to-SQL..
<SITEMAP> <MVC> <ASP> <NET> <DATA> <KIOSK> <FLEX> <SQL> <NOTES> <LINUX> <MONO> <FREEWARE> <DOCS> <ENG> <CHAT ME> <ABOUT ME> < THANKS ME> |