我寫博客從一開始還是日經一文,到後來是周經一文,現在都直接變成月經一文了。。
閒話少說,最近的一個需求是把一些文字跟下拉框集合、對應在一起,如果就那樣堆幾個static、comboBox平鋪在對話框上,不免顯得有些單調,而且文字對齊啥的也麻煩,還要排版。找來找去發現了CMFCPropertyGridCtrl這個控件。找了點教程,發現這個控件使用起來還是蠻簡單的,關鍵一點就是要搞清楚層次關系,才不至於混亂,誰是誰的子項,誰是誰的組員等等。
老慣例,上例子。
用vs2010建立一個基於對話框的MFC工程,拖一個CMFCPropertyGridCtrl進去,大小調整好。注:首先采用的是靜態創建的辦法,大部分需要的屬性在對話框編輯界面就可以編輯。)然後為該控件更改ID為IDC_MFCPROPERTYGRID_TEST,並且使用ClassWizard為控件添加一個變量m_propertyGrid。
接下來更改控件的一些屬性。
其實這不就是個CMFCPropertyGridCtrl控件麼。Border神馬的基礎東西就不說了。
"Description Rows Count"指的是下面的描述部分有幾行。
"Enable Description Area"表示是否啟動下面的描述功能
"Enable Header"表示是否啟動表頭
"Mark Modified Properties"表示是否著重顯示更改項
可以按照需求來進行設置。這裡先使用默認的設置。先編譯運行一下,比較簡陋。
好,接下來該添加東西進去了。
在OnInitDialog中添加如下代碼,我會一行一行解釋。
- CMFCPropertyGridProperty * pProp1 = new CMFCPropertyGridProperty(
- _T("天朝適合生存嗎?"),
- _T("BKJIA不談政治"),
- _T("這是描述部分"));
- m_propertyGrid.AddProperty(pProp1);
第一行是建立一個新的項目,也是最普通的項目,CMFCPropertyGridProperty。與這種項目同級的還有CMFCPropertyGridColorProperty、CMFCPropertyGridFontProperty以及CMFCPropertyGridFileProperty,等會都可以試一下。調用構造函數時傳入的三個參數分別是條目名稱、默認選項及描述文字。運行一下就知分曉。
餓滴神啊,腫麼這個樣子。不過該有的全有,只需要設置一下就行。這裡得提一筆,微軟似乎非常喜歡把第一列的寬度設置為“只能容得下一個普通的5號小宋體的寬度”,不光是CMFCPropertyGrid,連CListCtrl也是如此,需要動點特殊的手段才能調整過來。在這段代碼的前面加這麼幾句:
- HDITEM item;
- item.cxy=120;
- item.mask=HDI_WIDTH;
- m_propertyGrid.GetHeaderCtrl().SetItem(0, new HDITEM(item));
如此再運行,就會比較好看了。
好,接下來我們看一下右邊的value部分還能換成神馬東西。
如同vs2010裡提供的“屬性”欄一樣,這CMFCPropertyGridCtrl應該也支持下拉菜單,好,就來添加下拉菜單看看。修改剛才的代碼:
- CMFCPropertyGridProperty* pProp2 = new CMFCPropertyGridProperty(
- _T("我是不是帥哥?"),
- _T("看選項"),
- _T(""));
- pProp2->AddOption(_T("是"));
- pProp2->AddOption(_T("肯定是"));
- pProp2->AddOption(_T("絕對是"));
- pProp2->AllowEdit(FALSE); //不允許對選項進行編輯
- m_propertyGrid.AddProperty(pProp2);
然後運行,就會如願以償地出現下拉框了。
接下來是另外三個同級的項目:
- CMFCPropertyGridColorProperty * pProp3 = new CMFCPropertyGridColorProperty(
- _T("顏色"), RGB(0, 111, 200));
- m_propertyGrid.AddProperty(pProp3);
- CMFCPropertyGridFileProperty * pProp4 = new CMFCPropertyGridFileProperty(
- _T("打開文件"), TRUE, _T("D:\\test.txt"));
- m_propertyGrid.AddProperty(pProp4);
- LOGFONT font = {NULL};
- CMFCPropertyGridFontProperty * pProp5 = new CMFCPropertyGridFontProperty(
- _T("選擇字體"), font);
- m_propertyGrid.AddProperty(pProp5);
注:每一種類型的項目都有2個或3個重載函數,可以自己根據需求慢慢挖掘,在這裡就不贅述了。
運行效果如下:
這麼些不同種類的東西亂七八糟堆在一起,是不是有點不科學?那麼就引入下一個概念:分組。回到第一張圖,vs2010的“屬性”欄分了三個組,分別是Apperance、Behavior和Misc,看起來就清晰多了,我們也可以。
好,來重新構建一下我們的代碼:
- CMFCPropertyGridProperty * group1 = new CMFCPropertyGridProperty(_T("分組1"));
- CMFCPropertyGridProperty * group2 = new CMFCPropertyGridProperty(_T("分組2"));
- group1->AddSubItem(pProp1);
- group1->AddSubItem(pProp2);
- group2->AddSubItem(pProp3);
- group2->AddSubItem(pProp4);
- group2->AddSubItem(pProp5);
- m_propertyGrid.AddProperty(group1);
- m_propertyGrid.AddProperty(group2);
編譯運行效果如下:
至此,靜態創建CMFCPropertyGridCtrl的方法就結束了。
還有一種方法是動態創建,與CStatic、CEdit等控件無二,在創建之後也可以利用自帶的函數修改控件的屬性,如:
- CMFCPropertyGridCtrl * propertyGrid = new CMFCPropertyGridCtrl;
- propertyGrid->Create(WS_CHILD | WS_BORDER | WS_VISIBLE, CRect(400, 100, 600, 200), this, WM_USER + 100);
- propertyGrid->EnableHeaderCtrl(TRUE); //使用表頭
- propertyGrid->SetVSDotNetLook(); //使用樣式
- propertyGrid->MarkModifiedProperties(); //著重顯示更改過的部分
更多屬性留待各位發掘一下啦。
本文出自 “正面旺得福反面泰瑞寶” 博客,請務必保留此出處http://serious.blog.51cto.com/242085/956984