2013-06-13 26 views
0

我知道有ListView的Properties可以改變常見的風格,但我只是想測試這個。例如,View = View.LargeIconLVS_ICON = 0樣式應用於ListViewGridLines = true將樣式LVS_EX_GRIDLINES = 1應用於ListView。我想用CreateParams進行測試。我覺得使用GetWindowLongSetWindowLong Win32的功能應該沒問題,但爲了方便起見,據我所知,CreateParams可以改變控件的樣式。但這次用ListView,我不能使它工作,它根本沒有任何作用,不知是否ListView是一個特例?這裏是我的代碼:覆蓋自定義ListView中的CreateParams沒有效果?

public class CustomListView : ListView {   
    protected override CreateParams CreateParams { 
     get { 
     CreateParams cp = base.CreateParams; 
     cp.Style |= 3; //Apply LVS_LIST (View as List) 
     return cp; 
     } 
    } 
} 

只有LVS_EX_GRIDLINES = 1使得一些效果,但效果並不Grid lines are drawn on the ListViewBorder becomes thicker and looks like 3D-border。這很奇怪,其他大部分應用根本沒有效果。

你能解釋一下嗎,或者至少給我舉個例子,再次請不要給我任何解決方案或代碼,它使用GetWindowLongSetWindowLong,只需使用CreateParams

謝謝!

+0

'LVS_EX_GRIDLINES'是擴展的* *列表視圖風格,而不是那種可以用'GetWindowLong'訪問正常的窗口樣式之一。而是在使用'LVM_SETEXTENDEDLISTVIEWSTYLE'創建控件之後設置這些樣式,並使用'LVM_GETEXTENDEDLISTVIEWSTYLE'檢索它們。 –

回答

0

如果有助於解釋這是如何工作的,則由ListView.UpdateExtendedStyles函數內部處理,該函數在設置與擴展樣式有關的某個屬性時被調用。

從相關部分報價在MSDN上

msdn

反射器拆卸功能如下

protected void UpdateExtendedStyles() 
{ 
    if (base.IsHandleCreated) 
    { 
     int lparam = 0; 
     int wparam = 0x10cfd; 
     switch (this.activation) 
     { 
      case ItemActivation.OneClick: 
       lparam |= 0x40; 
       break; 

      case ItemActivation.TwoClick: 
       lparam |= 0x80; 
       break; 
     } 
     if (this.AllowColumnReorder) 
     { 
      lparam |= 0x10; 
     } 
     if (this.CheckBoxes) 
     { 
      lparam |= 4; 
     } 
     if (this.DoubleBuffered) 
     { 
      lparam |= 0x10000; 
     } 
     if (this.FullRowSelect) 
     { 
      lparam |= 0x20; 
     } 
     if (this.GridLines) 
     { 
      lparam |= 1; 
     } 
     if (this.HoverSelection) 
     { 
      lparam |= 8; 
     } 
     if (this.HotTracking) 
     { 
      lparam |= 0x800; 
     } 
     if (this.ShowItemToolTips) 
     { 
      lparam |= 0x400; 
     } 
     base.SendMessage(0x1036, wparam, lparam); 
     base.Invalidate(); 
    } 
} 

編輯

不能使用CreateParams的原因是因爲這與無關see MSDN here - 摘錄如下複製

msdn

+0

使用'SendMessage'工作正常,我知道。但我可以看到很顯然'CreateParams'不起作用。 'CreateParams'也有它的'ExStyle'。我用'Style'(GWL_STYLE)和'Extended style'(GWL_EXSTYLE)'GetWindongLong'和'SetWindowLong'嘗試過,但它們不起作用。它看起來像只有'SendMessage'工程。 –

+0

@KingKing關於'CreateParams'正確 - 請參閱上面的編輯。 –

+1

謝謝,雖然我訪問了該文檔頁面(我只是在示例部分查看),但我沒有注意到該信息。 –