CListCtrl控制元件樣式設定時出現的小插曲!

allinallinallin發表於2017-03-04

----------------------------------------------------------------------------------------------------------------------------------------

最近在寫MFC,用到了列表控制元件CListCtrl,由於要依據專案需求對列表控制元件設定樣式Style。

很多人都知道可以在CListCtrl的Create()函式中設定列表控制元件的基本樣式;同時一些擴充套件樣式可以通過CListCtrl的SetExtendedStyle()函式進行設定。

但是上面的兩種方式有什麼區別呢?樣式的巨集可以隨意選上面兩個函式中的一個進行設定嗎?

答:①有區別;②不可以

----------------------------------------------------------------------------------------------------------------------------------------


例如下面的這段程式碼,設定了一些樣式,執行也正常

	mDataList.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT,Rect,this,IDC_JM_DATALISTCTRL);
	//設定擴充風格,①顯示錶格網格線;②選中整行資料
	mDataList.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);

接下來我想設定列表控制元件使其只支援每次只能選中一行:預設情況CListCtrl支援多選,LVS_SINGLESEL屬性可以使其支援單行選取

與時我想當然的在SetExtendedStyle()函式中增加了巨集LVS_SINGLESEL,然而奇怪的事情發生了!居然效果是這樣的:


不但沒有出現我想要的只支援單行選取的效果,反而增加我不想要的樣式(最左邊“任務名稱”那列中出現了核取方塊)!很鬱悶!


問題解析:

我們知道這些樣式的巨集定義只是一個十六進位制的數值而已,要是想看這些巨集的具體數值,可選中巨集,右鍵【轉到定義】即可檢視。

LVS_****開頭的巨集定義截圖如下:



LVS_EX_****開頭的巨集定義截圖如下:



聰明的你可能已經發現貓膩了:LVS_SINGLESEL居然和LVS_EX_CHECKBOXES的十六進位制的值一樣,都是4

這就是bug所在,雖然都是用來設定CListCtrl控制元件的巨集,LVS_*****開頭和LVS_EX_****開頭是不一樣的,不能混用。

區別如下

LVS_是ListViewStyle的縮寫;LVS_EX_是ListViewStyle_Extended的縮寫

使用地方不同:LVS_****只能用在建立列表控制元件時使用,即在Create()函式中使用;而LVS_EX_****只能在設定列表擴充套件樣式時使用,即在SetExtendedStyle()函式中使用。


因此要想實現列表控制元件只支援單行選取,正確的修改上述程式碼的方式如下:

    //預設情況CListCtrl支援多選,LVS_SINGLESEL屬性可以使其支援單選  
    mDataList.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_SINGLESEL,Rect,this,IDC_JM_DATALISTCTRL);  
    //設定擴充風格,①顯示錶格網格線;②選中整行資料  
    mDataList.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);


總結

①想成為好程式設計師,英語很重要。

②細心!細心!再細心!要充分理解英語縮寫的完整意思,不能模稜兩可。




相關文章