C++ MFC combo box和list control控件的使用

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);//隱藏編輯框

轉自:http://www.cnblogs.com/crearo-ssy/archive/2012/11/05/2754641.html

發佈了4 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章