青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

幽幽
 
posts - 51,  comments - 28,  trackbacks - 0

1。先來介紹REPORT類型的CListCtrl:
首先使用下面的語句設置CListCtrl的style:
 DWORD SetExtendedStyle( DWORD dwNewStyle );
其中
 LVS_EX_CHECKBOXES 表示添加CheckBox
 LVS_EX_FULLROWSELECT 表示選擇整行
 LVS_EX_GRIDLINES 表示添加表格線

如果設置了LVS_EX_CHECKBOXES屬性,則可以用
 BOOL GetCheck( int nItem ) const;
來得到某一行是否Checked。

可以先用下面的語句來刪除以前的東西:
 for(int k=2;k>=0;k--) //注意要從后往前刪,否則出錯
  m_ListCtrl.DeleteColumn(k);
 m_ListCtrl.DeleteAllItems();

用下面的語句新建列:
 m_ListCtrl.InsertColumn(0,_T("文件名"),LVCFMT_IMAGE|LVCFMT_LEFT);
 m_ListCtrl.InsertColumn(1,_T("儀器類別"));
 m_ListCtrl.InsertColumn(2,_T("項目類別"));
 
其中LVCFMT_IMAGE表示可以在第一列加入圖標。如果不要圖標可以刪去。

然后設置列寬:
 for(j=0;j<3;j++)
  m_ListCtrl.SetColumnWidth(j ,100);
 
以下為列表加入圖標,如果不需要圖標,可以跳過這一步。注意只在第一次加入,如果多次加入會出錯!
先在頭文件中加入聲明:
 CImageList m_ImageList;
這是必要的,如果在cpp的某個函數中加入由于生命期結束,CImageList自動釋放,則效果是列表中看不到圖標,只看到一個白方塊。
下面生成CImageList,并將其綁定到CListCtrl中,這是CImageList中還沒有圖標,只是一個容器:
 static int flag=2;
 if(flag==2){//只調用一次SetImageList,否則出錯
  m_ImageList.Create(128, 128, ILC_COLORDDB|ILC_MASK, 20, 1); 
  m_ListCtrl.SetImageList(&m_ImageList,LVSIL_SMALL);
 }
 flag=(flag+1)%2;
如果CListCtrl已經用過,曾經加過圖標進去,這時就要刪除上次放進m_ImageList中的Image
 for(int kk=0;kk<m_ImageList.GetImageCount();kk++)
  m_ImageList.Remove(k);
 
下面介紹如何向CListCtrl里面加入行,并同時為每一行動態加入圖標:
假設m_listRowCount為要加入的行數。
 CBitmap* bitmap;
 bitmap=new CBitmap[m_list1rowCount];
 HBITMAP hbitmap; 
 
 for(int i = 0; i < m_listRowCount; i++)
 {
  //為每一行插入相應的縮略圖
  CFile f;
  CFileException e;  
  if( !f.Open(m_FileName, CFile::modeRead, &e )){ //m_FileName為bmp文件名,由你來定
   hbitmap = (HBITMAP)LoadImage(NULL,path+"blank.bmp",IMAGE_BITMAP,0,0,
    LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
  }else{
   f.Close();
   hbitmap = (HBITMAP)LoadImage(NULL,bmpFile,IMAGE_BITMAP,0,0,
    LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
  }
  bitmap[i].Attach(hbitmap);
  m_ImageList.Add(&bitmap[i], RGB(0, 128, 128));
  
  //插入行
  m_ListCtrl.InsertItem(i,m_FileName,i);
  m_ListCtrl.SetItemText(i,1,type);
  m_ListCtrl.SetItemText(i,2,m_Path);
 }
  
 //記得刪除已經沒用的臨時文件
 if(m_list1rowCount!=0)
  delete[] bitmap;

2。如果是ICON類型的CListCtrl,則要做一點點改動:
把綁定圖標集的代碼由
 SetImageList(&m_ImageList,LVSIL_SMALL);
改為
 SetImageList(&m_ImageList,LVSIL_NORMAL);

插入行時只用
 InsertItem(i,mainSet.m_FileName,i);
不用
 SetItemText(i,1,type);
之類的代碼。

設置報表的樣式
選中一整行:
m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_FULLROWSELECT); 
繪制表格:
m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_GRIDLINES);
帶復選框:
m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_CHECKBOXES);
自動切換:
m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_TRACKSELECT);
選定一行:
設置CListCtrl的Show selection always選項
SetItemState (iIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED)
 
選中一個或多個項目時,會發送LVN_ITEMCHANGED消息,可以使用
GetSelectedCount()方法得到被選定的項的數目。
點擊列頭的消息響應:
ON_NOTIFY(HDN_ITEMCLICKW, 0, ResponseFunc)
消息,需要自己添加
或者:
ON_NOTIFY(LVN_COLUMNCLICK, ID_yourCtrl,  ResponseFunc)//向導添加
前者后響應,后者先響應
響應函數:
ResponseFunc(NMHDR *pNMHDR, LRESULT *pResult)
雙擊CListCtrl中的ITEM的消息是及消息函數:
ON_NOTIFY(NM_DBLCLK, ID_yourCtrl, ResponseFunc)
單擊ITEM的消息響應:
ON_NOTIFY(NM_CLICK, ID_yourCtrl, ResponseFunc)
ResponseFunc(NMHDR *pNMHDR, LRESULT *pResult)
HDN_ITEMCLICK    就是Header control Notify message for mouse left click on the Header control!
而HDN_ITEMCLICK是當List View中存在一個Header Contrl時,Header Ctrl通知父窗口List View的!
CListCtrl中的Item被選中觸發LBN_SELCHANGE(通過WM_COMMAND)消息!
刪除CListCtrl中選定的項:
POSITION pos;
int nIndex;
for(; pos= GetFirstSelectedItemPosition();)
{
nIndex = GetNextSelectedItem(pos);
DeleteItem(nIndex);
}
在ListCtrl中進行排序
列表控件(CListCtrl)的頂部有一排按鈕,用戶可以通過選擇不同的列來對記錄進行排序。但是 CListCtrl并沒有自動排序的功能,我們需要自己添加一個用于排序的回調函數來比較兩個數據的大小,此外還需要響應排序按鈕被點擊的消息。下面講述一下具體的做法。
CListCtrl提供了用于排序的函數,函數原型為:BOOL CListCtrl::SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData )。其中第一個參數為全局排序函數的地址,第二個參數為用戶數據,你可以根據你的需要傳遞一個數據或是指針。該函數返回-1代表第一項排應在第二項前面,返回1代表第一項排應在第二項后面,返回0代表兩項相等。
用于排序的函數原形為:int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort),其中第三個參數為調用者傳遞的數據(即調用SortItems時的第二個參數dwData)。第一和第二個參數為用于比較的兩項的ItemData,你可以通過DWORD CListCtrl::GetItemData( int nItem )/BOOL CListCtrl::SetItemData( int nItem, DWORD dwData )來對每一項的ItemData進行存取。在添加項時選用特定的CListCtrl::InsertItem也可以設置該值。由于你在排序時只能通過該值來確定項的位置所以你應該比較明確的確定該值的含義。
最后一點,我們需要知道什么時候需要排序,實現這點可以在父窗口中對LVN_COLUMNCLICK消息進行處理來實現。
下面我們看一個例子,這個例子是一個派生類,并支持順序/倒序兩種方式排序。為了簡單我對全局數據進行排序,而在實際應用中會有多組需要排序的數據,所以需要通過傳遞參數的方式來告訴派序函數需要對什么數據進行排序。
//全局數據
struct DEMO_DATA
{
 char szName[20];
 int iAge;
}strAllData[5]={{"王某",30},{"張某",40},{"武某",32},{"陳某",20},{"李某",36}};
//CListCtrl派生類定義
class CSortList : public CListCtrl
{
// Construction
public:
 CSortList();
 BOOL m_fAsc;//是否順序排序
 int m_nSortedCol;//當前排序的列
protected:
 //{{AFX_MSG(CSortList)
 //}}AFX_MSG
...
};
//父窗口中包含該CListCtrl派生類對象
class CSort_in_list_ctrlDlg : public CDialog
{
// Construction
public:
 CSort_in_list_ctrlDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
 //{{AFX_DATA(CSort_in_list_ctrlDlg)
 enum { IDD = IDD_SORT_IN_LIST_CTRL_DIALOG };
 CSortList m_listTest;
 //}}AFX_DATA
}
//在父窗口中定義LVN_COLUMNCLICK消息映射
BEGIN_MESSAGE_MAP(CSort_in_list_ctrlDlg, CDialog)
 //{{AFX_MSG_MAP(CSort_in_list_ctrlDlg)
 ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, OnColumnclickList1)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()
//初始化數據
BOOL CSort_in_list_ctrlDlg::OnInitDialog()
{
 CDialog::OnInitDialog();
 //初始化ListCtrl中數據列表
 m_listTest.InsertColumn(0,"姓名");
 m_listTest.InsertColumn(1,"年齡");
 m_listTest.SetColumnWidth(0,80);
 m_listTest.SetColumnWidth(1,80);
 for(int i=0;i<5;i++)
 {
  m_listTest.InsertItem(i,strAllData[i].szName);
  char szAge[10];
  sprintf(szAge,"%d",strAllData[i].iAge);
  m_listTest.SetItemText(i,1,szAge);
  //設置每項的ItemData為數組中數據的索引
  //在排序函數中通過該ItemData來確定數據
  m_listTest.SetItemData(i,i);
 }
 return TRUE;  // return TRUE  unless you set the focus to a control
}
//處理消息
void CSort_in_list_ctrlDlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
 //設置排序方式
 if( pNMListView->iSubItem == m_listTest.m_nSortedCol )
  m_listTest.m_fAsc = !m_listTest.m_fAsc;
 else
 {
  m_listTest.m_fAsc = TRUE;
  m_listTest.m_nSortedCol = pNMListView->iSubItem;
 }
 //調用排序函數
 m_listTest.SortItems( ListCompare, (DWORD)&m_listTest );       
 *pResult = 0;
}
//排序函數實現
int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
 //通過傳遞的參數來得到CSortList對象指針,從而得到排序方式
 CSortList* pV=(CSortList*)lParamSort;
 
 //通過ItemData來確定數據
 DEMO_DATA* pInfo1=strAllData+lParam1;
 DEMO_DATA* pInfo2=strAllData+lParam2;
 CString szComp1,szComp2;
 int iCompRes;
 switch(pV->m_nSortedCol)
 {
 case(0):
  //以第一列為根據排序
  szComp1=pInfo1->szName;
  szComp2=pInfo2->szName;
  iCompRes=szComp1.Compare(szComp2);
  break;
 case(1):
  //以第二列為根據排序
  if(pInfo1->iAge == pInfo2->iAge)
   iCompRes = 0;
  else
   iCompRes=(pInfo1->iAge < pInfo2->iAge)?-1:1;
  break;
 default:
  ASSERT(0);
  break;
 }
 //根據當前的排序方式進行調整
 if(pV->m_fAsc)
  return iCompRes;
 else
  return iCompRes*-1;
}
排序最快:
CListCtrl::SortItems
Example
// Sort the item in reverse alphabetical order.
static int CALLBACK
MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
  // lParamSort contains a pointer to the list view control.
  // The lParam of an item is just its index.
  CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
  CString    strItem1 = pListCtrl->GetItemText(lParam1, 0);
  CString    strItem2 = pListCtrl->GetItemText(lParam2, 0);
  return strcmp(strItem2, strItem1);
}
void snip_CListCtrl_SortItems()
{
  // The pointer to my list view control.
  extern CListCtrl* pmyListCtrl;
  // Sort the list view items using my callback procedure.
  pmyListCtrl->SortItems(MyCompareProc, (LPARAM) pmyListCtrl);
}
If you don’t want to allow the users to sort the list by clicking on the header, you can use the style LVS_NOSORTHEADER. However, if you do want to allow sorting, you do not specify the LVS_NOSORTHEADER. The control, though, does not sort the items. You have to handle the HDN_ITEMCLICK notification from the header control and process it appropriately. In the code below, we have used the sorting function SortTextItems() developed in a previous section. You may choose to sort the items in a different manner.
Step 1: Add two member variables
Add two member variables to the CListCtrl. The first variable to track which column has been sorted on, if any. The second variable to track if the sort is ascending or descending.
        int nSortedCol;
        BOOL bSortAscending;
 
Step 2: Initialize them in the constructor.
Initialize nSortedCol to -1 to indicate that no column has been sorted on. If the list is initially sorted, then this variable should reflect that.
 
        nSortedCol = -1;
        bSortAscending = TRUE;
 
Step 3: Add entry in message map to handle HDN_ITEMCLICK
Actually you need to add two entries. For HDN_ITEMCLICKA and HDN_ITEMCLICKW. Do not use the class wizard to add the entry. For one, you need to add two entries whereas the class wizard will allow you only one. Secondly, the class wizard uses the wrong macro in the entry. It uses ON_NOTIFY_REFLECT() instead of ON_NOTIFY(). Since the HDN_ITEMCLICK is a notification from the header control to the list view control, it is a direct notification and not a reflected one.
ON_NOTIFY(HDN_ITEMCLICKA, 0, OnHeaderClicked)
ON_NOTIFY(HDN_ITEMCLICKW, 0, OnHeaderClicked)
 Note that we specify the same function for both the notification. Actually the program will receive one or the other and not both. What notification it receives will depend on the OS. The list view control on Windows 95 will send the ANSI version and the control on NT will send the UNICODE version.
Also, note that the second argument is zero. This value filters for the id of the control and we know that header control id is zero.
Step 4: Write the OnHeaderClicked() function
Here’s where you decide what to do when the user clicks on a column header. The expected behaviour is to sort the list based on the values of the items in that column. In this function we have used the SortTextItems() function developed in a previous section. If any of the columns displays numeric or date values, then you would have to provide custom sorting for them.
 
void CMyListCtrl::OnHeaderClicked(NMHDR* pNMHDR, LRESULT* pResult)
{
        HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
        if( phdn->iButton == 0 )
        {
                // User clicked on header using left mouse button
                if( phdn->iItem == nSortedCol )
                        bSortAscending = !bSortAscending;
                else
                        bSortAscending = TRUE;
                nSortedCol = phdn->iItem;
                SortTextItems( nSortedCol, bSortAscending );
        }
        *pResult = 0;
}
讓CListCtrl的SubItem也具有編輯功能:
要重載一個文本框,然后在LVN_BEGINLABELEDIT時改變文本框位置。
CInEdit m_InEdit;
    if( ( GetStyle() & LVS_TYPEMASK ) == LVS_REPORT && ( m_nEditSubItem != 0 ) )
    {
        HWND    hwndEdit;
        CRect    rtBound;
        CString strText;
        hwndEdit = (HWND)SendMessage( LVM_GETEDITCONTROL );
        GetSubItemRect( pDispInfo->item.iItem, m_nEditSubItem, LVIR_LABEL, rtBound );
        m_InEdit.SubclassWindow( hwndEdit );
        m_InEdit.m_left = rtBound.left;
        strText = GetItemText( pDispInfo->item.iItem, m_nEditSubItem );
        m_InEdit.SetWindowText( strText );
    }
void CInEdit::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
    CRect rtClient;
    lpwndpos->x = m_left;  // m_left在LVN_BEGINLABELEDIT中設置
    CEdit::OnWindowPosChanging(lpwndpos);
   
    // TODO: Add your message handler code here
}


posted on 2008-06-14 02:48 幽幽 閱讀(6592) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用鏈接

留言簿(6)

隨筆分類(35)

隨筆檔案(51)

文章分類(3)

文章檔案(3)

相冊

我的鏈接

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久成人精品视频| 国产精品久久久久毛片大屁完整版 | 亚洲一区二区三区乱码aⅴ| 一区二区三区精品视频| 在线一区观看| 午夜视频在线观看一区| 久久午夜色播影院免费高清| 欧美大色视频| 国产精品外国| 精品999成人| 亚洲国产中文字幕在线观看| 亚洲视频1区2区| 久久精品亚洲一区二区| 欧美高清成人| 亚洲私人影院| 性亚洲最疯狂xxxx高清| 日韩视频在线观看国产| 亚洲欧美中文字幕| 欧美jizz19性欧美| 国产精自产拍久久久久久| 亚洲电影免费在线| 亚洲欧美自拍偷拍| 亚洲成人在线网站| 在线亚洲高清视频| 免费日韩视频| 国产亚洲成精品久久| 亚洲另类在线视频| 久久久久99| 在线中文字幕不卡| 免费在线看成人av| 国产主播在线一区| 亚洲一区国产视频| 亚洲国产老妈| 久久久人成影片一区二区三区观看 | 一区二区三区四区五区精品| 久久九九99| 国产精品久久激情| 99在线热播精品免费99热| 久久精品视频亚洲| 妖精成人www高清在线观看| 欧美mv日韩mv国产网站| 狠狠色综合日日| 欧美一区二区在线免费播放| 亚洲理伦在线| 欧美成人激情在线| 狠狠色狠狠色综合| 久久成人在线| 亚洲一区二区视频在线| 欧美色区777第一页| 日韩午夜免费| 亚洲国产精品123| 久久久久久一区二区| 国产一区二区按摩在线观看| 亚洲自拍偷拍一区| 91久久精品久久国产性色也91| 久久久亚洲国产美女国产盗摄| 国产视频一区二区在线观看| 午夜精品久久久久久久99樱桃 | 久久国产精品久久国产精品| 国产精品午夜av在线| 亚洲欧美影院| 亚洲永久精品国产| 国产伦精品一区二区三区四区免费| 亚洲一区久久久| 亚洲视频二区| 国产欧美日韩在线观看| 久久久久久久激情视频| 久久久久久久久久久一区| 亚洲高清不卡在线观看| 亚洲国产1区| 国产综合亚洲精品一区二| 欧美一区二区三区视频在线 | 久久久亚洲综合| 亚洲二区三区四区| 亚洲人成绝费网站色www| 欧美日韩国产综合网| 亚洲一区免费网站| 亚洲欧美另类在线| 国模私拍一区二区三区| 欧美国产乱视频| 欧美国产日产韩国视频| 在线综合亚洲| 久久精品系列| 久久综合久久久| 亚洲精品一区二区三区av| 日韩一区二区免费看| 国产精品影视天天线| 你懂的国产精品永久在线| 欧美精品激情在线| 欧美一区二区三区四区高清| 久久精品免费电影| 日韩亚洲欧美在线观看| 在线天堂一区av电影| 国产在线拍揄自揄视频不卡99| 亚洲电影毛片| 国产区二精品视| 亚洲国产精品ⅴa在线观看| 国产精品伦子伦免费视频| 欧美高清在线一区二区| 国产精品少妇自拍| 亚洲黄页视频免费观看| 国内精品久久久久久久果冻传媒| 日韩视频精品在线| 亚洲激情视频网站| 欧美在线不卡视频| 亚洲制服丝袜在线| 欧美激情bt| 老司机一区二区三区| 国产精品网站一区| 在线中文字幕不卡| 9色国产精品| 欧美精品www| 欧美电影在线观看完整版| 国产麻豆精品久久一二三| 亚洲精品社区| 亚洲日韩中文字幕在线播放| 久久精品官网| 久久久亚洲一区| 国产精品一区二区你懂的| 99国产一区| 一区二区免费在线观看| 欧美福利视频| 欧美大片91| 亚洲第一网站| 久久伊伊香蕉| 麻豆精品精华液| 精品成人国产| 久久久久在线观看| 久久夜精品va视频免费观看| 国产一区二区三区精品久久久| 亚洲资源在线观看| 欧美一区免费| 欧美一区二区高清| 欧美三级中文字幕在线观看| 亚洲精品免费一区二区三区| 亚洲每日在线| 欧美福利在线观看| 欧美黄色一区| 日韩视频精品在线观看| 欧美日韩国产丝袜另类| 99精品国产99久久久久久福利| av成人免费在线| 欧美三级电影大全| 亚洲图片欧美一区| 久久精品三级| 亚洲成人在线网| 欧美高清成人| 亚洲免费高清| 欧美一区不卡| 娇妻被交换粗又大又硬视频欧美| 久久精品系列| 91久久精品www人人做人人爽| 亚洲天堂av图片| 国产日韩一区二区三区| 久久噜噜噜精品国产亚洲综合| 欧美福利在线观看| 中文成人激情娱乐网| 国产日产精品一区二区三区四区的观看方式| 亚洲伊人一本大道中文字幕| 久久欧美中文字幕| 日韩视频免费在线| 国产精品伊人日日| 美女图片一区二区| 亚洲视频免费在线| 欧美成人蜜桃| 校园激情久久| 亚洲日本欧美日韩高观看| 国产精品美女午夜av| 久久中文字幕导航| 日韩亚洲一区二区| 老司机免费视频久久| 亚洲欧美成人一区二区在线电影| 韩国av一区| 国产精品每日更新| 欧美高清在线视频观看不卡| 午夜精品亚洲一区二区三区嫩草| 亚洲高清资源综合久久精品| 欧美一区影院| 亚洲神马久久| 亚洲精品免费观看| 精品动漫3d一区二区三区免费| 欧美午夜精品久久久久免费视| 另类图片国产| 久久www免费人成看片高清| 一本色道久久88综合日韩精品| 欧美成人综合网站| 久久久五月天| 欧美一区二视频在线免费观看| 99在线精品观看| 亚洲精品乱码| 亚洲黄色在线| 在线精品亚洲| 国产女人水真多18毛片18精品视频| 欧美风情在线观看| 久久久青草青青国产亚洲免观| 亚洲欧美中文在线视频| 中国成人黄色视屏| 亚洲精品色婷婷福利天堂| 欧美风情在线| 欧美大片在线观看一区二区|