Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ListView и выделение строки / 2 сообщений из 2, страница 1 из 1
26.11.2014, 23:59
    #38817893
Qwe.Qwe1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ListView и выделение строки
Есть ListView в режиме Details, я сам рисую Item'ы (фон выделенного элемента (строки)). Вопрос: как сделать, чтобы:
1) при клике мимо элемента в ListView - выделение оставалось (HideSelection = true не помогает);
2) при потере фокуса с ListView - выделение тоже оставалось;
3) при наведение мыши на Item менялся цвет.
C#, WinForms.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
this.listView1.OwnerDraw = true;
this.listView1.View = System.Windows.Forms.View.Details;
this.listView1.MultiSelect = false;

private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{            
    ListView lv = sender as ListView;
    if ((e.State & ListViewItemStates.Selected) != 0)
    {
        using (LinearGradientBrush brush = new LinearGradientBrush(e.Bounds, Color.FromArgb(255, 255, 228, 138), Color.FromArgb(255, 246, 200, 103), LinearGradientMode.BackwardDiagonal))
        {
            e.Graphics.FillRectangle(brush, e.Bounds);
        }
        e.Graphics.DrawRectangle(new Pen(Color.FromArgb(255, 194, 118, 43)), e.Bounds.X, e.Bounds.Y, e.Bounds.Width - 1, e.Bounds.Height - 1);
    }
    else
    {
        e.Graphics.FillRectangle(new SolidBrush(Color.White), new Rectangle(e.Bounds.Location, e.Bounds.Size));
    }
    e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
    e.Graphics.DrawImage(lv.SmallImageList.Images[e.ItemIndex], new Point(e.Bounds.Left + 2, e.Bounds.Top));
    e.Graphics.DrawString(e.Item.Text, e.Item.Font, new SolidBrush(Color.Black), new PointF(e.Bounds.Left + 37, e.Bounds.Top + 10));
}
...
Рейтинг: 0 / 0
27.11.2014, 11:39
    #38818212
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ListView и выделение строки
Qwe.Qwe11) при клике мимо элемента в ListView - выделение оставалось (HideSelection = true не помогает);
Правильное поведение - выделение снимается.
В VB6 я помнится боролся наоборот - чтоб снималось. Но в .Net как раз в этом смысле все корректно.
Qwe.Qwe12) при потере фокуса с ListView - выделение тоже оставалось;
А вот для этого как раз нужен HideSelection = false
Qwe.Qwe13) при наведение мыши на Item менялся цвет
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
  Private Sub ListView1_MouseMove(sender As Object, e As MouseEventArgs) Handles ListView1.MouseMove

    Dim lItemIndex As Integer
    Dim lSubItemIndex As Integer
    ListView_HitTest(ListView1, _
     CType(sender, ListView).PointToClient(Cursor.Position).X, CType(sender, ListView).PointToClient(Cursor.Position).Y, _
     lItemIndex, lSubItemIndex)

    If (m_lCurItemIndex <> lItemIndex) Or (m_lCurSubItemIndex <> lSubItemIndex) Then
      m_lCurItemIndex = lItemIndex
      m_lCurSubItemIndex = lSubItemIndex
      If (m_lCurItemIndex = -1) Or (m_lCurSubItemIndex = -1) Then 'no item(subitem) under the mouse pointer
        ..  
      Else
...
как раскрашивать пока не выяснял, но в .Net думаю можно обойтись без CustomDraw

  Private Sub ListView_MouseLeave(sender As Object, e As EventArgs) Handles ListView1.MouseLeave
    m_lCurItemIndex = -1
    m_lCurSubItemIndex = -1
  End Sub
============

  Public Sub ListView_HitTest(ByVal m_ListView As System.Windows.Forms.ListView, ByVal x As Integer, ByVal y As Integer, _
   ByRef m_Item As Integer, ByRef m_SubItem As Integer)
    Dim lvhti As LVHITTESTINFO
    lvhti.pt.x = x
    lvhti.pt.y = y
    Call SendMessage_LVHITTESTINFO(m_ListView.Handle, LVM_SUBITEMHITTEST, 0, lvhti)
    m_Item = lvhti.iItem
    m_SubItem = lvhti.iSubItem
  End Sub

  Public Const LVM_FIRST = &H1000
  Public Const LVM_SUBITEMHITTEST = LVM_FIRST + 57


  <StructLayout(LayoutKind.Sequential)>
  Public Structure LVHITTESTINFO
    Dim pt As POINTAPI
    Dim Flags As Integer
    Dim iItem As Integer
    Dim iSubItem As Integer
  End Structure

  Public Declare Unicode Function SendMessage_LVHITTESTINFO Lib "user32" Alias "SendMessageW" _
   (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByRef lParam As LVHITTESTINFO) As Integer



Можешь конечно для HitTest использовать "чистый .Net", но я отказался - чего-то там как обычно в .Net бывает подглючивало.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  Private Sub ListView1_MouseMove(ByVal sender As Object,
   ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseMove

     Dim info As ListViewHitTestInfo = _
     CType(sender, ListView).HitTest(CType(sender, ListView).PointToClient(Cursor.Position))
    Dim lItem As ListViewItem = info.Item
    Dim lSubItem As ListViewItem.ListViewSubItem = info.SubItem

    If ReferenceEquals(m_lCurItem, lItem) = False Or _
     ReferenceEquals(m_lCurSubItem, lSubItem) = False Then
      m_lCurItem = lItem
      m_lCurSubItem = lSubItem
      If IsNothing(lItem) Or IsNothing(lSubItem) Then 'no item(subitem) under the mouse pointer

  Private Sub ListView1_MouseLeave(ByVal sender As Object,
                                   ByVal e As System.EventArgs) Handles ListView1.MouseLeave

    m_lCurItem = Nothing
    m_lCurSubItem = Nothing
    ToolTip1.SetToolTip(CType(sender, Control), "")
  End Sub
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ListView и выделение строки / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]