2010-04-22 35 views
8

Tôi đang sử dụng SetWindowTheme và SendMessage để tạo danh sách .net giống như kiểu xem danh sách vista, nhưng điều khiển .net vẫn có đường viền chọn xung quanh mục đã chọn:Làm cách nào tôi có thể xóa đường viền lựa chọn trên ListViewItem

listview

Các mục đã chọn trong danh sách khám phá không có đường viền xung quanh. Làm thế nào tôi có thể loại bỏ nó?

Windows Explorer:

windows explorer

Edit: Giải pháp:

public static int MAKELONG(int wLow, int wHigh) 
{ 
    int low = (int)LOWORD(wLow); 
    short high = LOWORD(wHigh); 
    int product = 0x00010000 * (int)high; 
    int makeLong = (int)(low | product); 
    return makeLong; 
} 

SendMessage(olv.Handle, WM_CHANGEUISTATE, Program.MAKELONG(UIS_SET, UISF_HIDEFOCUS), 0); 

Trả lời

10

Giải pháp Telanors làm việc cho tôi. Đây là một phiên bản độc lập hơn một chút.

using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

public class MyListView : ListView 
{ 
    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); 

    private const int WM_CHANGEUISTATE = 0x127; 
    private const int UIS_SET = 1; 
    private const int UISF_HIDEFOCUS = 0x1; 

    public MyListView() 
    { 
     this.View = View.Details; 
     this.FullRowSelect = true; 

     // removes the ugly dotted line around focused item 
     SendMessage(this.Handle, WM_CHANGEUISTATE, MakeLong(UIS_SET, UISF_HIDEFOCUS), 0); 
    } 

    private int MakeLong(int wLow, int wHigh) 
    { 
     int low = (int)IntLoWord(wLow); 
     short high = IntLoWord(wHigh); 
     int product = 0x10000 * (int)high; 
     int mkLong = (int)(low | product); 
     return mkLong; 
    } 

    private short IntLoWord(int word) 
    { 
     return (short)(word & short.MaxValue); 
    } 
} 
2

Có thiết lập ListView.ShowFocusCues tài sản để giúp đỡ sai?

+0

Có vẻ như rằng thuộc tính này được thiết lập để sai theo mặc định. – Ucodia

+5

Trong khi bản thân ShowFocusCues không hoạt động, WM_CHANGEUISTATE được liệt kê trên trang MSDN đó dẫn tôi đến câu trả lời đúng. Bằng cách gửi một tin nhắn WM_CHANGEUISTATE với UISF_HIDEFOCUS tôi đã có thể thoát khỏi hình chữ nhật lấy nét. – Telanor

+0

@Telanor, Vui lòng cập nhật câu hỏi bằng mã lệnh giải pháp của bạn – Joe

1

Dường như không có cách nào đặc biệt để thay đổi kiểu ListViewItem bằng Windows Forms.

Đôi khi không có cách nào để thay đổi một số hành vi điều khiển Win32 bằng mã được quản lý. Cách duy nhất là làm một số P/Gọi để sửa đổi các hành vi cụ thể. Tôi thấy điều này thực sự phức tạp nhưng bạn không còn lựa chọn nào khác. Tôi thường phải đối mặt với tình huống này khi phát triển giao diện người dùng Windows Mobile (chỉ với ListView).

Vì vậy, tôi không có câu trả lời trực tiếp cho câu hỏi của bạn nhưng tôi khá chắc chắn rằng nếu nó không thể sử dụng Windows Forms, bạn chắc chắn có thể làm với P/Invoke. Các manh mối duy nhất tôi có thể cung cấp cho bạn:

2

Thiết lập thuộc tính HotTracking true ẩn hình chữ nhật tập trung. Điều này repro-ed phong cách Explorer trên máy Win7 của tôi:

using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

class MyListView : ListView { 
    public MyListView() { 
    this.HotTracking = true; 
    } 
    protected override void OnHandleCreated(EventArgs e) { 
    base.OnHandleCreated(e); 
    SetWindowTheme(this.Handle, "explorer", null); 
    } 
    [DllImport("uxtheme.dll", CharSet = CharSet.Auto)] 
    public extern static int SetWindowTheme(IntPtr hWnd, string appname, string subidlist); 
} 

Hãy coi chừng việc nhận được các mục được gạch dưới là một tác dụng phụ.

2

Việc làm này cách NON P/Invoke ...

Override điều khiển ListView của bạn và thêm những điều sau đây:

protected override void OnSelectedIndexChanged(EventArgs e) 
{ 
    base.OnSelectedIndexChanged(e); 
    Message m = Message.Create(this.Handle, 0x127, new IntPtr(0x10001), new IntPtr(0)); 
    this.WndProc(ref m); 
} 

protected override void OnEnter(EventArgs e) 
{ 
    base.OnEnter(e); 
    Message m = Message.Create(this.Handle, 0x127, new IntPtr(0x10001), new IntPtr(0)); 
    this.WndProc(ref m); 
} 
Các vấn đề liên quan