(NET) NET (2015 год)

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..





Comments ( )
<00>  <01>  <02>  <03>  <04>  <05>  <06>  <07>  <08>  <09>  <10>  <11>  <12>  <13>  <14>  <15>  <16>  <17>  <18>  <19
Link to this page: http://www.vb-net.com/ListView-TabControl-CustomDrawing/index.htm
<SITEMAP>  <MVC>  <ASP>  <NET>  <DATA>  <KIOSK>  <FLEX>  <SQL>  <NOTES>  <LINUX>  <MONO>  <FREEWARE>  <DOCS>  <ENG>  <MAIL ME>  <ABOUT ME>  < THANKS ME>