我們經常會使用到組合框,而組合框是是有2種功能的--下拉和列表。一般情況下,列表框的寬度和選擇框是一樣寬的,但是我們有些時候確實很需要把列表框的寬度變大,一便讓我們能更好的看我們要選的東西。
為了能有這個功能,我寫了下面的這個函數。首先得在你的對話框中添加一個的WM_CTLCOLOR的消息句柄,或者使用CComboBox的繼承類,而且在其中添加下面的代碼:
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
{
HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
switch (nctlcolor) {
case ctlcolor_edit:
break;
case ctlcolor_listbox:
if (listwidth > 0) {
// new width of a listbox is defined
CRect rect;
pwnd->GetWindowRect(&rect);
if (rect.Width() != listwidth) {
rect.right = rect.left + listwidth;
pwnd->MoveWindow(&rect);
}
}
break;
}
// todo: return a different brush if the default is not desired
return hbr;
}
這樣之後還沒有完全好,你還得刷新一下列表框,那樣才能隨時根據列表框中的文本的長度,而改變列表框的寬度,要想這樣的話,你還得這樣,你必須掃描列表框中的條目,還得計算其中文本的長度(通過pdc),這樣你如果再刷新列表框的話,才能一條目中比較長的來顯示。
上面的方法是通過WM_CTLCOLOR消息來實現的,後來才知道在MFC的CComboBox類中有一個函數也可以實現同樣的功能,就是:
CComboBox::SetDroppedWidth(int width);
通過這個函數,你可以把寬度設成你自己喜歡的值,而它的實際的寬度是下面2個值中的最大值:
1.你所設置的值(就是通過上面的函數所設置的值)
2.列表框的值