CListCtrl控件樣式設置時出現的小插曲!

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

最近在寫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);


總結

①想成爲好程序員,英語很重要。

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章