Combo Box用法:
combo box控件由兩部分組成:編輯框和選擇框(列表框)組成,對應的類是CComboBox
1、改變下拉框大小:先點向下的箭頭,就可以調整下拉框大小
2、如果 ComboBox 的 Sorted 屬性設置為 true,
則新添加項將按字母順序插入到列表中。
否則,在列表的結尾處插入項。
3、要立即響應選擇框的改變(即選擇框一改變選項,就立刻將結果傳遞進去)!
響應他的哪個消息比較好?
如果是只能選擇的響應ON_CBN_SELCHANGE
如果是可以編輯的,那么要立刻響應編輯就是ON_CBN_EDITCHANGE
4、CBN_SELENDOK是什么作用?
This notification message is sent when the user clicks a list item,
or selects an item and then closes the list.
It indicates the user's selection is to be processed
5、介紹一下列表框幾種常用的消息映射宏:
ON_CBN_DBLCLK 鼠標雙擊
ON_CBN_DROPDOWN 列表框被彈出
ON_CBN_KILLFOCUS / ON_CBN_SETFOCUS 在輸入框失去/得到輸入焦點時產生
ON_CBN_SELCHANGE 列表框中選擇的行發生改變
ON_CBN_EDITUPDATE 輸入框中內容被更新
使用以上幾種消息映射的方法為定義原型如:afx_msg void memberFxn( );的函數,
並且定義形式如ON_Notification( id, memberFxn )的消息映射。
如果在對話框中使用組合框,Class Wizard會自動列出相關的消息,並能自動產生消息映射代碼。
6、改變ComboBox的下拉列表框寬度
一般情況下,列表框的寬度和選擇框是一樣寬的,為了讓列表框變的更寬,可以用
m_Combobox.setdroppedwidth(int width); 來調整 他的寬度
7、如何使控鍵ComboBox不能輸入只能在下拉菜單中選擇?
VC6中style屬性設為csDropDownList //DropList?!
VC2005中Type屬性設為Drop List
8、設置當前項或得到當前是第幾項
m_ComboBox1.SetCurSel(N); //SetCurSel函數可改變標簽控件當前選定的項目
//這個N可以是-1,表示無選擇,0表示第一項,1表示第二項。。
m_ComboBox1.GetCurSel(); //得到當前是第幾項.0是第一項,1是第二項
List Control的用法:
List Control控件,是個列表,對應的類為CListCtrl。下面沒有說明的,默認風格都為report
1、風格
LVS_ICON: 為每個item顯示大圖標
LVS_SMALLICON: 為每個item顯示小圖標
LVS_LIST: 顯示一列帶有小圖標的item
LVS_REPORT: 顯示item詳細資料
直觀的理解:windows資源管理器,“查看”標簽下的“大圖標,小圖標,列表,詳細資料”
2、設置listctrl 風格及擴展風格
LONG lStyle;
lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//獲取當前窗口style
lStyle &= ~LVS_TYPEMASK; //清除顯示方式位
lStyle |= LVS_REPORT; //設置style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//設置style
DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//選中某行使整行高亮(只適用與report風格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//網格線(只適用與report風格的listctrl)
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_list.SetExtendedStyle(dwStyle); //設置擴展風格
3、插入數據
m_list.InsertColumn( 0, "姓名", LVCFMT_LEFT, 40 );//插入列
m_list.InsertColumn( 1, "部門", LVCFMT_LEFT, 50 );
int nRow = m_list.InsertItem(0, “”);//插入行
m_list.SetItemText(nRow, 0, “張三”);//設置數據,第1列
m_list.SetItemText(nRow, 1, “軟件部”);//設置數據,第2列
4、已知選中item
選中style中的Show selection always選項,設置為true,或者在上面第2點中設置LVS_SHOWSELALWAYS
設置為true后,當選中某一個item,這個item就會一直被選中,知道選中下一個或者都不選。
5、選中和取消選中一行
int nIndex = 0;
//選中
m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
//取消選中
m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);
6、得到listctrl中所有行的checkbox的狀態
m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);
CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))
{
str.Format(_T("第%d行的checkbox為選中狀態"), i);
AfxMessageBox(str);
}
}
7、得到listctrl中所有選中行的序號
方法一:
CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
{
str.Format(_T("選中了第%d行"), i);
AfxMessageBox(str);
}
}
方法二:
POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos == NULL)
TRACE0("No items were selected!\n");
else
{
while (pos)
{
int nItem = m_list.GetNextSelectedItem(pos);
TRACE1("Item %d was selected!\n", nItem);
// you could do your own processing on nItem here
}
}
8、得到item的信息
TCHAR szBuf[1024];
LVITEM lvi;
lvi.iItem = nItemIndex;
lvi.iSubItem = 0;
lvi.mask = LVIF_TEXT;
lvi.pszText = szBuf;
lvi.cchTextMax = 1024;
m_list.GetItem(&lvi);
9、得到listctrl的所有列的header字符串內容
LVCOLUMN lvcol;
char str[256];
int nColNum;
CString strColumnName[4];//假如有4列
nColNum = 0;
lvcol.mask = LVCF_TEXT;
lvcol.pszText = str;
lvcol.cchTextMax = 256;
while(m_list.GetColumn(nColNum, &lvcol))
{
strColumnName[nColNum] = lvcol.pszText;
nColNum++;
}
10、使listctrl中一項可見,即滾動滾動條
m_list.EnsureVisible(i, FALSE);
11、得到listctrl列數
int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();
12、刪除所有列
方法一:
while ( m_list.DeleteColumn (0))
因為刪除了第一列后,后面的列會依次向上移動。
方法二:
int nColumns = 4;
for (int i=nColumns-1; i>=0; i--)
m_list.DeleteColumn (i);
13、得到單擊的listctrl的行列號
添加listctrl控件的NM_CLICK消息相應函數
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// 方法一:
/*
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;
int nItem = m_list.SubItemHitTest(&lvinfo);
if(nItem != -1)
{
CString strtemp;
strtemp.Format("單擊的是第%d行第%d列", lvinfo.iItem, lvinfo.iSubItem);
AfxMessageBox(strtemp);
}
*/
// 方法二:
/*
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
CString strtemp;
strtemp.Format("單擊的是第%d行第%d列",
pNMListView->iItem, pNMListView->iSubItem);
AfxMessageBox(strtemp);
}
*/
*pResult = 0;
}
14、判斷是否點擊在listctrl的checkbox上
添加listctrl控件的NM_CLICK消息相應函數
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;
UINT nFlag;
int nItem = m_list.HitTest(point, &nFlag);
//判斷是否點在checkbox上
if(nFlag == LVHT_ONITEMSTATEICON)
{
AfxMessageBox("點在listctrl的checkbox上");
}
*pResult = 0;
}
15、右鍵點擊listctrl的item彈出菜單
添加listctrl控件的NM_RCLICK消息相應函數
void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
m_pRClickMenu = new CMenu();
ASSERT(m_pRClickMenu != NULL);
m_pRClickMenu->CreatePopupMenu();
m_pRClickMenu->AppendMenu(MF_STRING, IDC_BTN_SEND_EMAIL, "發送郵件");
m_pRClickMenu->AppendMenu(MF_STRING, IDC_BTN_COPY, "復制到剪切板");
// DWORD dwPos = GetMessagePos();
// CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
CPoint point;
GetCursorPos(&point);
m_pRClickMenu->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this, NULL);
}
*pResult = 0;
}
16、item切換焦點時(包括用鍵盤和鼠標切換item時),狀態的一些變化順序
添加listctrl控件的LVN_ITEMCHANGED消息相應函數
void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CString sTemp;
if((pNMListView->uOldState & LVIS_FOCUSED) == LVIS_FOCUSED &&
(pNMListView->uNewState & LVIS_FOCUSED) == 0)
{
sTemp.Format("%d losted focus",pNMListView->iItem);
}
else if((pNMListView->uOldState & LVIS_FOCUSED) == 0 &&
(pNMListView->uNewState & LVIS_FOCUSED) == LVIS_FOCUSED)
{
sTemp.Format("%d got focus",pNMListView->iItem);
}
if((pNMListView->uOldState & LVIS_SELECTED) == LVIS_SELECTED &&
(pNMListView->uNewState & LVIS_SELECTED) == 0)
{
sTemp.Format("%d losted selected",pNMListView->iItem);
}
else if((pNMListView->uOldState & LVIS_SELECTED) == 0 &&
(pNMListView->uNewState & LVIS_SELECTED) == LVIS_SELECTED)
{
sTemp.Format("%d got selected",pNMListView->iItem);
}
*pResult = 0;
}
17、listctrl內容進行大數據量更新時,避免閃爍。
m_list.SetRedraw(FALSE);
//更新內容
m_list.SetRedraw(TRUE);
// m_list.Invalidate();
// m_list.UpdateWindow();
18、listctrl第一列始終居左,解決辦法
把第一列當成虛列,然后插入第二列及數據,最后刪除第一列,以后列還是從0開始。
pListCtrl->InsertColumn(0, "", LVCFMT_CENTER, 0);
pListCtrl->InsertColumn(1, "姓名", LVCFMT_CENTER, 80);
pListCtrl->InsertColumn(2, "性別", LVCFMT_CENTER, 100);
pListCtrl->InsertColumn(3, "國籍", LVCFMT_CENTER, 100);
pListCtrl->DeleteColumn(0);
19、使listctrl可編輯
做法是:當單擊listctrl時使整行高亮顯示,雙擊listctrl時讓編輯框移動到你雙擊所在列的位置上,此時編輯框獲得焦點並且將listctrl的值更新到編輯框上,
此時可以修改內容,當鼠標點擊其他位置時,編輯框失去焦點,同時將編輯框的內容更新到listctrl中,從而完成對listctrl子項的修改。
1) 首先在對話框中添加一個CEdit控件,並定義CEdit變量m_edit。當對話框初始化函數中隱藏該控件。
m_edit.ShowWindow(SW_HIDE);
2) 然后對CListCtrl添加消息NM_DBLCLK(雙擊事件),在消息中添加代碼
NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;
CRect rc;
if(pNMListView->iItem!=-1)
{
m_row=pNMListView->iItem;//m_row為被選中行的行序號(int類型成員變量)
m_column=pNMListView->iSubItem;//m_column為被選中行的列序號(int類型成員變量)
m_list.GetSubItemRect(pNMListView->iItem, pNMListView->iSubItem,LVIR_LABEL,rc);//取得子項的矩形
rc.left+=3;
rc.top+=2;
rc.right+=3;
rc.bottom+=2;
char * ch=new char [128];
m_list.GetItemText(pNMListView->iItem, pNMListView->iSubItem,ch,128);//取得子項的內容
m_edit.SetWindowText(ch);//將子項的內容顯示到編輯框中
m_edit.ShowWindow(SW_SHOW);//顯示編輯框
m_edit.MoveWindow(&rc);//將編輯框移動到子項上面,覆蓋在子項上
m_edit.SetFocus();//使編輯框取得焦點
m_edit.CreateSolidCaret(1,rc.Height()-5);//創建一個光標
m_edit.ShowCaret();//顯示光標
m_edit.SetSel(-1);//使光標移到最后面
}
*pResult = 0;
3) 然后,添加CEdit失去焦點時的消息EN_KILLFOCUS。在該消息中添加代碼使編輯框中的內容更新到CListCtrl中。
CString str;
m_edit.GetWindowText(str);//取得編輯框的內容
m_list.SetItemText(m_row,m_column,str);//將該內容更新到CListCtrl中
m_edit.ShowWindow(SW_HIDE);//隱藏編輯框