ListView and TabControl Custom Drawing.
Windows Desktop контроли ListView та TabControl, виглядають не дуже приємно, але вони мають можливість поширення власними засобами малювання їх. Власні засоби включаються ось таким чином.
![](/ListView-TabControl-CustomDrawing/ListView-TabControl-CustomDrawing-1.gif)
Метою власного малювання TabControl'а є невеличке покращення його зовнішнього вигляду, например кольорове виділення поточної вкладки ось так.
![](/ListView-TabControl-CustomDrawing/TabControl-CustomDrawing-1.gif)
Код такого удосконалення дуже простий.
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 зберігся.
![](/ListView-TabControl-CustomDrawing/ListView-CustomDrawing-1.gif)
Це теж робиться неважко, але тут потрібно трохи більше, ніж просто обробити евент 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-єлементом саме такий, у якому буде означений текст.
![](/ListView-TabControl-CustomDrawing/Combobox-Extension-1.gif)
Але єкстеншени - це трохи інша тема, ось тут більше про них - Оновлення StatusLabel з потоку BackGroundWorker - приклад застосування Action, Delegate, Invoke, AddressOf, Extension, Expression, Мої поширення Linq-to-SQL..
![](http://forum.vb-net.com/GetTopicCount.png?id=65112AD9-DC61-4A9D-90E4-3801D208D274)
<SITEMAP> <MVC> <ASP> <NET> <DATA> <KIOSK> <FLEX> <SQL> <NOTES> <LINUX> <MONO> <FREEWARE> <DOCS> <ENG> <CHAT ME> <ABOUT ME> < THANKS ME> |