學習0

2. 關於list control 的高級應用--- 條目編輯

http://www.fa39.com/Article/c/200610/1952.html

論壇中搜索一下, 你會發現不少類似的提問: 我如何編輯list control 的條目? 如何直接編輯list control... 等等;list control 可用來做數據庫表的視圖, 十分有用.

但報表風格的list control 只能編輯第一列, 其餘的該死的微軟沒爲vc 做到. 它怕VB 賣不出. 於是C++ 程序員只好DIY. 主要思想是在list control 中動態創建一個控件, 動態移動該控件到相應位置. 這些方法早有人討論過了, 本文也是基於如上思想的, 但注重於可擴充性與使用的方便.

List control 這頭主要是重載OnLButtonDown 方法, 計算出被點中的條目. 這裏重要的函數是SubItemHitTestGetSubItemRect,msdn 上有相關說明. 用戶點中後, 就要負責顯示控件了: 如果之前選中了其他, 就要驗證之前的改動是否成功. 不成功就要回到原來的地方, 成功就應用修改並移到新位置. 看代碼:

static     const UINT IDCHAILD="3000";

void CValidateList::OnLButtonDown(UINT nFlags, CPoint point)

{

              CListCtrl::OnLButtonDown(nFlags, point);

       LVHITTESTINFO hi;

    hi.pt = point;

       if(SubItemHitTest(&hi) != -1 )// 沒有點中條目就不管

       {if(m_col==-1||//-1 還沒被選過

                     true==(m_col+m_validate)->Validate (m_row))

              {

m_row = hi.iItem, m_col= hi.iSubItem;//m_row,m_col

// 員分別跟蹤選中的行列

}

((m_col+m_validate))->Move (_GetRect(),m_row);

       }

}

 

WinBlast* CValidateList::SetValidate( WinBlast*in)// 設置驗證的

// 控件羣,in 對應第一列,in+1 第二列……

{

       WinBlast*ret=m_validate;

       m_validate=in;

       int counts="GetHeaderCtrl"()->GetItemCount();;

       RECT rect;

     memset(&rect,0,sizeof(rect));

       for(int i="0";i< span>

         (in+i)->Create (this,rect,IDCHAILD+i,i);

       m_col=-1;// 沒有被選中的

       return ret;

}

 

 

RECT CValidateList::_GetRect()// 內部使用, 得到相應顯示位置

{

       CRect ret;

GetSubItemRect(m_row,m_col,LVIR_BOUNDS,ret);

return ret;

}

 

void CValidateList::NoSelect()// 置未選中狀態

{

m_col=-1;// 沒有被選中的

}

看到了WinBlast*ret=m_validate.WinBlast 是用來修改和驗證數據的控件看它的實現:

class WinBlast 

{

       int m_col;// 跟蹤列, 爲什麼要這個? 因爲你可以讓一種控件對

// 不同列用不同的驗證策略

CWnd* m_win;// 你的控件窗口

       CListCtrl *m_parent;// 用它獲得文本

public:

       WinBlast(){m_win=NULL;}

       ~WinBlast(){m_win->DestroyWindow();delete m_win;}

 

virtual     bool Create( CWnd* pParentWnd,

              const RECT& rect, UINT nID,

              int col)

       {

              m_col=col;m_parent=(CListCtrl *)pParentWnd;

              m_win=new CEdit;

                    return  ((CEdit*)m_win)->

                     Create(ES_NOHIDESEL,rect,pParentWnd,nID);

              }

       void Move(const RECT &rect,int row)// 最重要的函數但前面

// 兩個動作是必作的,SetText 爲虛, 你在那做你喜歡的

; {

              m_win->ShowWindow(SW_SHOW);

              m_win->MoveWindow(&rect);

              SetText(row);

       }

       virtual bool Validate(int row)// 驗證, 虛函數. 這裏永遠返回true

       {

              m_win->ShowWindow(SW_HIDE);

              CString set;

              m_win->GetWindowText(set);

              m_parent->SetItemText(row,m_col,set);

              return true;

       }

       virtual void SetText(int row)

       {

              m_win->SetWindowText(m_parent->GetItemText(row,m_col));

              ((CEdit*)m_win)->SetSel (0,-1);

              }

      

       };

實際使用通常是這樣的:

       WinBlast*p=new WinBlast[sizeof(col)/sizeof(col[0])];//col

         // 列名字符數組,sizeof(col)/sizeof(col[0]) 計算列數

       m_test.SetValidate (p);//m_test CValidateList

你可以繼承WinBlast, 重載Create 建立一個下拉框, 加入你喜愛的驗證方法.

注意我的設計漏洞:CValidateList 應接收WinBlast**, 而不是WinBlast*----- 不理解這個漏洞其實也不要緊: 但要記住, 不改正的話你的WinBlast 後繼類就不能加數據成員了.

 

3. 如何在 VC MFC List Control 中實現拷貝功能?

Reference: http://zhidao.baidu.com/question/13639294.html

我在單文檔視圖中加入一個 List Control 控件 (Report 形式 ) ,並關聯類 CListCtrl 的一個對象,往裏面寫數據什麼的都行,但在界面上無法實現對報表數據的拷貝(快捷或右鍵都不行),想請教如何實現拷貝該報表顯示的數據?

1 CListCtrl 創建 click 事件,記錄 item

2 在視圖所在的類創建虛函數 PreTranslateMessage

加入代碼

if(pMsg->message == WM_KEYDOWN)

{

if(pMsg->wParam==13)// 這裏 13 是表示回車鍵盤,你也可以改成其他的

{

copy();

}

}

3. 編寫 copy 函數,取得 item 處的文本,保存只剪切板

 

4. 更改列表控件樣式

創建列表控件 (List Control) (CListCtrl) 後,可以在任何時間更改它的窗口樣式。通過更改窗口樣式來更改控件使用的視圖類型。例如,爲了模擬“資源管理器”,您可以提供菜單項或工具欄按鈕以在不同的視圖(圖標視圖、列表視圖等)之間切換控件。

例如,用戶選擇您的菜單項後,您可以調用 GetWindowLong 來檢索控件的當前樣式,然後調用 SetWindowLong 來重置樣式。有關更多信息,請參見 Platform SDK 中的使用列表視圖 (ListView) 控件。

可用樣式在 Create 中列出。樣式 LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT 指定四種列表控件 (List Control) 視圖。

擴展樣式

除了列表控件 (List Control) 的標準樣式之外,還有另一個稱爲擴展樣式的樣式集。Platform SDK 中的擴展列表視圖樣式討論了這些樣式,這些樣式可提供自定義列表控件 (List Control) 行爲的各種有用功能。若要實現某個樣式的行爲(如隨意選擇),請調用 CListCtrl::SetExtendedStyle 傳遞所需的樣式。下面的示例說明該函數調用:

m_myListCtrl.SetExtendedStyle(LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE);

注意     要使隨意選擇起作用,還必須打開 LVS_EX_ONECLICKACTIVATE LVS_EX_TWOCLICKACTIVATE

 

5. 在列表控件( List Control )中實現工作區

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_changing_list_control_styles.asp

默認情況下,列表控件 (List Control) 按標準網格格式排列所有項。但也支持另一種方法:工作區。工作區將列表項排列到矩形組中。有關實現工作區的列表控件 (List Control) 的圖像,請參見 Platform SDK 中的“使用列表- 視圖控件”。

注意     工作區只有當列表控件 (List Control) 處於圖標或小圖標模式時纔可見。但是,如果視圖切換到報表或列表模式,將維持任何當前工作區。

工作區可用來顯示空邊框(在項的左側、頂部和/ 或 右側),或在通常不會有水平滾動條的時候顯示水平滾動條。另一個普通用法是創建多個工作區,可以將項移動或放置到這些工作區。使用該方法可以在單一視圖中 創建具有不同意義的區域。然後用戶可以將項放置到不同的區域以對它們分類。此類示例可以是一個文件系統的視圖,它包含一個讀/ 寫文件區,一個只讀文件區。如果將文件項移動到只讀區,它將自動變爲只讀。將文件從只讀區移動到讀/ 寫區會使文件成爲可讀/ 寫的。

CListCtrl 爲創建和管理列表控件 (List Control) 工作區提供幾個成員函數。GetWorkAreas SetWorkAreas 檢索並設置 CRect 對象(或 RECT 結構)數組,該數組存儲當前實現的列表控件 (List Control) 工作區。另外,GetNumberOfWorkAreas 檢索列表控件 (List Control) 的當前工作區數目(默認值爲零)。

項和工作區

工作區創建後,工作區中的項成爲其成員。同樣,如果將一個項移動到某個工作區,則該項成爲它所移動到的工作區的成員。如果某個項不在任何工作區中,則它自動成爲第一個工作區(索引 0 )的成員。如果想創建項並將其放置到一個特定的工作區,則需要創建該項,然後調用 SetItemPosition 將項移動到所需工作區。下面的第二個示例說明該技術。

下面的示例在列表控件 (List Control) ( m_listctrl ) 中實現四個大小相等的工作區 ( rcWorkAreas ) ,每個工作區都有 10 像素寬的邊框。

CRect curRect;

CSize size;

 

size= m_listctrl.ApproximateViewRect();

size.cx+= 100;

size.cy+= 100;

 

CRect rcWorkAreas[4];

 

rcWorkAreas[0].SetRect(0, 0, (size.cx / 2) - 5, (size.cy / 2) - 5);

rcWorkAreas[1].SetRect((size.cx / 2) + 5, 0, size.cx, (size.cy / 2) - 5);

rcWorkAreas[2].SetRect(0, (size.cy / 2) + 5, (size.cx / 2) - 5, size.cy);

rcWorkAreas[3].SetRect((size.cx / 2) + 5, (size.cy / 2) + 5, size.cx, size.cy);

 

//set work areas

m_listctrl.SetWorkAreas(4, rcWorkAreas);

調用 ApproximateViewRect 來獲取在一個區域顯示所有項所需要的總區域大小的估計值。之後,該估計值被分成四個區域並用 5 像素寬的邊框填充。

下一個示例將現有列表項分配給每一組 ( rcWorkAreas ) 並刷新控件視圖 ( m_listctrl ) 以實現此效果。

// set insertion points for each work area

CPoint     rgptWork[4];

for (int i = 0; i < 4; i++)

{

     rgptWork[i].x = rcWorkAreas[i].left + 10;

     rgptWork[i].y = rcWorkAreas[i].top + 10;

}

// now move all the items to the different quadrants

for (i = 0; i < 20; i++)

     m_listctrl.SetItemPosition(i, rgptWork[i % 4]);

 

// force the control to rearrange the shuffled items

m_listctrl.Arrange(LVA_DEFAULT);

 

6. 處理列表控件( List Control )中的通知消息

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_changing_list_control_styles.asp

用戶單擊列標題、拖動圖標、編輯標籤等時,列表控件 (List Control) (CListCtrl) 將通知消息發送給它的父窗口。如果要進行某種響應,請處理這些消息。例如,用戶單擊列標題後,可能想基於單擊的列的內容對項排序,如在 Microsoft Outlook 中所做的那樣。

在視圖或對話框類中處理列表控件 (List Control) WM_NOTIFY 消息。基於正在處理的通知消息,用“屬性”窗口創建帶 switch 語句的 OnChildNotify 處理函數。

有關列表控件 (List Control) 可以發送到其父窗口的通知的列表,請參見 Platform SDK 中的列表視圖 (ListView) 控件參考。

 

7. 虛擬列表控件

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_changing_list_control_styles.asp

虛擬列表控件指具有 LVS_OWNERDATA 樣式的列表視圖 (ListView) 控件。該樣式啓用控件來支持項數達到 DWORD (默認的項數只擴展到 int )。然而,該樣式的最大便利是可以使內存中一次只有一個數據項子集。這使虛擬列表視圖 (ListView) 控件可以將自己借給大型信息數據庫使用,而在這類數據庫中已存在特定的數據訪問方法。

注意    MFC 除了在 CListCtrl 中提供虛擬列表功能外,還在 CListView 類中提供相同的功能。

在開發虛擬列表控件時應注意一些兼容性問題。有關更多信息,請參見 Platform SDK 列表 - 視圖控件 主題的 兼容性問題 一節。

處理 LVN_GETDISPINFO 通知

虛擬列表控件維護非常少的項信息。除了項選擇和焦點信息,所有項信息都由控件的所有者管理。框架通過 LVN_GETDISPINFO 通知消息來請求信息。若要提供請求的信息,虛擬列表控件的所有者(或控件本身)必須處理該通知。使用 屬性 窗口可以很容易地完成此操作(請參見 將消息映射到函數 )。所得到的代碼應類似於下面的示例(其中 CMyListCtrl 是虛擬列表控件對象,控件正在處理通知)。

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)

   ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo)

END_MESSAGE_MAP()

LVN_GETDISPINFO 通知消息的處理程序中,必須檢查正在請求的信息的類型。可能值是:

·                  LVIF_TEXT     必須填寫 pszText 成員。

·                  LVIF_IMAGE     必須填寫 iImage 成員。

·                  LVIF_INDENT     必須填寫 iIndent 成員。

·                  LVIF_PARAM     必須填寫 lParam 成員。

·                  LVIF_STATE     必須填寫 state 成員。

然後應將所有請求的信息提供給框架。

下面的示例摘自列表控件 (List Control) 對象的通知處理程序體,它通過爲文本緩衝區和項的圖像提供信息來說明一種可能的方法:

LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;

LV_ITEM* pItem= &(pDispInfo)->item;

 

int iItemIndx= pItem->iItem;

 

if (pItem->mask & LVIF_TEXT) //valid text buffer?

{

    switch(pItem->iSubItem){

        case 0: //fill in main text

            lstrcpy(pItem->pszText,

                m_Items[iItemIndx].m_strItemText);

            break;

        case 1: //fill in sub item 1 text

            lstrcpy(pItem->pszText,

                m_Items[iItemIndx].m_strSubItem1Text);

            break;

        case 2: //fill in sub item 2 text

            lstrcpy(pItem->pszText,

                m_Items[iItemIndx].m_strSubItem2Text);

            break;

    }

}

 

if pItem->mask & LVIF_IMAGE) //valid image?

        pItem->iImage=

            m_Items[iItemIndx].m_iImageIndex;

緩存和虛擬列表控件

由於這種類型的列表控件 (List Control) 是提供給大的數據集的,因此建議您緩存請求的項數據以提高檢索性能。框架提供緩存提示機制,通過發送 LVN_ODCACHEHINT 通知消息來幫助優化緩存。但是,您必須使用一種稍有不同的方法來處理該通知。使用 屬性 窗口,重寫列表控件 (List Control) 對象的 OnChildNotify 函數。在該示例的情況下爲 CMyListCtrl

在處理程序體中檢查 LVN_ODCACHEHINT 消息,如果找到,則準備緩存。

下面的示例(摘自 OnChildNotify 函數體)執行此檢查並調用 CMyListCtrl 類的 PrepCache 成員函數。

NMLVCACHEHINT* pcachehint="NULL";

 

if (message == WM_NOTIFY)

    {

        NMHDR* phdr = (NMHDR*)lParam;

 

        switch(phdr->code)

        {

        case LVN_ODCACHEHINT:

            pcachehint= (NMLVCACHEHINT*) phdr;

// Load the cache with the recommended range.

            PrepCache(pcachehint->iFrom, pcachehint->iTo);

            break;

        default:

            return CListCtrl::OnChildNotify(message, wParam, lParam, pLResult);

        }

        return FALSE;

    }

    else

        return CListCtrl::OnChildNotify(message, wParam, lParam, pLResult);

注意,如果消息類型不是 LVN_ODCACHEHINT ,則通知將傳遞給基類 (CListCtrl ) 。有關準備和維護緩存的更多信息,請參見 Platform SDK 中的 列表 - 視圖控件 主題的 緩存管理 一節。

查找特定的項

當需要查找特定的列表控件項時,虛擬列表控件發送 LVN_ODFINDITEM 通知消息。列表視圖 (ListView) 控件接收快捷鍵訪問或接收 LVM_FINDITEM 消息時發送該通知消息。搜索信息以 LVFINDINFO 結構的格式發送,該結構是 NMLVFINDITEM 結構的成員。通過重寫列表控件 (List Control) 對象的 OnChildNotify 函數來處理該消息,並在處理程序體中檢查 LVN_ODFINDITEM 消息。如果找到此消息,則執行相應的操作。

您應該準備好搜索與列表視圖 (ListView) 控件給定的信息匹配的項。如果成功,則應返回項的索引;如果沒有找到匹配項,則返回 -1

8. 銷燬列表控件

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_changing_list_control_styles.asp

如果嵌入 CListCtrl 對象作爲視圖或對話框類的數據成員,則當銷燬其所有者時該對象也被銷燬。如果使用 CListView ,則框架在銷燬視圖時銷燬控件。

如果安排將一些列表數據存儲在應用程序而不是列表控件 (List Control) 中,將需要安排對列表數據的解除分配。有關更多信息,請參見 Platform SDK 中的回調項和回調屏蔽。

另外,您要負責將您所創建的與此列表控件 (List Control) 對象關聯的所有圖像列表解除分配。

9. 列表控件( List Control )和列表視圖

爲方便起見, MFC 以兩種方法封裝列表控件 (List Control) 。可以按下列兩種方式使用列表控件 (List Control)

·                  通過在對話框類中嵌入 CListCtrl 對象來直接使用。

·                  通過使用類 CListView 來間接使用。

CListView 使得在 MFC 文檔 / 視圖結構中集成列表控件 (List Control) 變得容易,封裝此控件與 CEditView 封裝編輯控件 (Edit Control) 基本相同:控件填充 MFC 視圖的整個表面區。(視圖 轉換爲 CListView 的控件。)

CListView 對象從 CCtrlView 及其基類繼承並添加一個檢索基礎列表控件 (List Control) 的成員函數。像視圖一樣使用視圖成員處理視圖。使用 GetListCtrl 成員函數獲得對列表控件 (List Control) 的成員函數的訪問權限。使用這些成員可以:

·                  添加、刪除或操作列表中的“項”。

·                  設置或獲取列表控件 (List Control) 屬性。

若要獲得對作爲 CListView 基礎的 CListCtrl 的引用,請從列表視圖類調用 GetListCtrl

CListCtrl& ctlList = GetListCtrl();

該主題描述了使用列表控件 (List Control) 的兩種方法。

10. 列表項和圖象列表

列表控件 (List Control) (CListCtrl) 中的 由圖標、標籤和可能的其他信息(在 子項 中)組成。

列表控件項的圖標包含在圖像列表中。一個圖像列表包含圖標視圖中使用的標準尺寸的圖標。第二個可選圖像列表包含控件的其他視圖中所使用的相同圖標的較小版本。第三個可選列表包含 狀態 圖像(如複選框),用於在某些視圖的小圖標前面顯示。第四個可選列表包含在列表控件 (List Control) 的單個標頭項中顯示的圖像。

注意     如果列表視圖 (ListView) 控件是用 LVS_SHAREIMAGELISTS 樣式創建的,則在圖像列表不再使用時您要負責銷燬這些圖像列表。如果您將相同的圖像列表分配給多個列表視圖 (ListView) 控件,請指定該樣式;否則,一個以上的控件可能會嘗試銷燬同一個圖像列表。

有關列表項的更多信息,請參見 Platform SDK 中的列表視圖圖像列表和項和子項。另請參見 MFC 參考 中的 CImageList 類和該文章族中的 使用 CImageList

若要創建列表控件 (List Control) ,需要在將新項插入到列表中時提供將要使用的圖像列表。下面的示例將說明此過程,其中 m_pImagelist CImageList 類型的指針, m_listctrl 是一個 CListCtrl 數據成員。

// create, initialize, and hook up image list

m_pImageList = new CImageList();

ASSERT(m_pImageList != NULL);    // serious allocation failure checking

m_pImageList->Create(32, 32, TRUE,   4, 4);

m_pImageList->Add(pApp->LoadIcon(IDI_ICONLIST1));

m_pImageList->Add(pApp->LoadIcon(IDI_ICONLIST2));

m_listctrl.SetImageList(m_pImageList, LVSIL_NORMAL);

但是,如果不打算在列表視圖或列表控件 (List Control) 中顯示圖標,則不需要圖像列表。請參見 DAOVIEW 示例應用程序獲取有關不帶圖標的列表視圖的說明。

11. 回調項和回調屏蔽

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_List_Control_and_List_View.asp

對於列表視圖 (ListView) 控件的每一項,列表視圖 (ListView) 控件通常存儲標籤文本、項的圖標的圖像列表索引和用於項狀態的一組位標誌。可以將單個項定義爲回調項,這在應用程序已經存儲某個項的一些信息時很有用。

可以通過爲 LV_ITEM 結構(請參見 CListCtrl::GetItem )的 pszText iImage 成員指定適當值來將一個項定義爲回調項。如果應用程序維護項或子項的文本,則爲 pszText 成員指定 LPSTR_TEXTCALLBACK 值。如果應用程序跟蹤項的圖標,則爲 iImage 成員指定 I_IMAGECALLBACK 值。

除了定義回調項之外,還可以修改控件的回調屏蔽。該屏蔽是一組指定項狀態的位標 志,爲這些項狀態存儲當前數據的是應用程序而不是控件。回調屏蔽適用於控件的所有項,這和回調項指定不同,後者適用於特定的項。默認情況下,回調屏蔽爲 零,意思是控件跟蹤所有項狀態。若要更改此默認行爲,請將屏蔽初始化爲下列值的任意組合:

·                  LVIS_CUT     項被標記爲進行剪貼操作。

·                  LVIS_DROPHILITED     項突出顯示爲拖放目標。

·                  LVIS_FOCUSED     項有焦點。

·                  LVIS_SELECTED     項被選定。

·                  LVIS_OVERLAYMASK     應用程序存儲每一個項的當前覆蓋圖像的圖像列表索引。

·                  LVIS_STATEIMAGEMASK     應用程序存儲每一個項的當前狀態圖像的圖像列表索引。

有關檢索和設置該屏蔽的進一步信息,請參見 CListCtrl::GetCallbackMask CListCtrl::SetCallbackMask

12. 創建列表控件

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_List_Control_and_List_View.asp

創建列表控件 (List Control) (CListCtrl) 的方式取決於是直接使用此控件還是代之以使用類 CListView 。如果使用 CListView ,框架將視圖構造成其文檔 / 視圖創建序列的一部分。創建列表視圖也就創建了列表控件 (List Control) (二者相同)。控件在視圖的 OnCreate 處理函數中創建。在這種情況下,通過調用 GetListCtrl 準備在控件中添加項。

在對話框中直接使用 CListCtrl

1.             在對話框編輯器中,向對話框模板資源添加“ List Control ”控件。指定其控件 ID

2.             使用 添加成員變量嚮導 添加帶 Control 屬性的 CListCtrl 類型的成員變量。可以使用該成員來調用 CListCtrl 成員函數。

3.             對於需要處理的任何列表控件 (List Control) 通知消息,使用“屬性”窗口來映射對話框類中的處理函數,請參見 將消息映射到函數

4.             OnInitDialog 中,設置 CListCtrl 的樣式。請參見 更改列表控件 (List Control) 樣式 。雖然以後可以更改視圖,但該操作可確定在控件中獲得的“視圖”類型。

在非對話框窗口中使用 CListCtrl

1.             在視圖或窗口類中定義此控件。

2.                調用控件的 Create 成員函數,可能在 OnInitialUpdate 中,也可能與父窗口的 OnCreate 處理函數一樣早(如果創建此控件的子類)。設置此控件的樣式。

13. 創建圖象列表

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_List_Control_and_List_View.asp

不論使用 CListView 還是使用 CListCtrl ,創建圖像列表是一樣的。

注意     只有在列表控件 (List Control) 包括 LVS_ICON 樣式時才需要圖像列表。

使用 CImageList 類創建一個或多個圖像列表(對於標準尺寸的圖標、小圖標和狀態)。請參見 Platform SDK 中的 CImageList 以及列表視圖圖像列表。

爲每一個圖像列表調用 CListCtrl::SetImageList ;將指針傳遞給合適的 CImageList 對象。

 

14. 向控件添加列

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_List_Control_and_List_View.asp

注意     下列過程適用於 CListView CListCtrl 對象。

列表控件 (List Control) 在報表視圖中時顯示列,提供一種組織每一列表控件項的各種子項的方法。這種組織是通過列表控件 (List Control) 中的列和列表控件項的相關子項之間的一一對應來實現的。有關子項的更多信息,請參見 向控件添加項 Windows 95 Windows 98 資源管理器中的 詳細信息 視圖提供了報表視圖中列表控件 (List Control) 的示例。第一列列出文件夾、文件圖標和標籤。其他列列出文件大小、文件類型、上次修改日期等。

雖然可以在任何時間向列表控件 (List Control) 添加列,但只有控件的 LVS_REPORT 樣式位打開時列纔可見。

每一列有一個關聯的標頭項(請參見 CHeaderCtrl )對象,該對象標記列並允許用戶調整列的大小。有關代碼示例的信息,請參見 DAOVIEW 示例應用程序。

如果列表控件 (List Control) 支持報表視圖,則需要爲列表控件項中每一個可能的子項添加一列。要添加列,先準備 LV_COLUMN 結構,然後調用 InsertColumn 。添加必要的列(有時稱標頭項)後,可以使用屬於嵌入式標頭控件的成員函數和樣式來對它們重新排序。有關更多信息,請參見 排序標頭控件中的項

注意     如果用 LVS_NOCOLUMNHEADER 樣式創建列表控件 (List Control) ,則將忽略任何插入列的嘗試。

 

15. 向控件添加項

Reference: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_List_Control_and_List_View.asp

若要向列表控件 (List Control) (CListCtrl) 添加項,請根據您所擁有的信息調用 InsertItem 成員函數的幾種版本中的一種。一種版本採用您準備的 LV_ITEM 結構。因爲 LV_ITEM 結構包含大量成員,因此您對列表控件項的屬性具有更強大的控制能力。

LV_ITEM 結構的兩個重要成員(相對於報表視圖)是 iItem iSubItem 成員。 iItem 成員是該結構正在引用的項的從零開始的索引, iSubItem 成員是子項的從一開始的索引(如果該結構包含有關某項的信息則從零開始)。用這兩個成員確定每項的子項信息的類型和值,此信息在列表控件 (List Control) 位於報表視圖中時顯示。有關更多信息,請參見 CListCtrl::SetItem

其他成員指定項的文本、圖標、狀態和項數據。 項數據 是與列表視圖項關聯的應用程序定義值。有關 LV_ITEM 結構的更多信息,請參見 CListCtrl::GetItem

其他版本的 InsertItem 採用一個或多個與 LV_ITEM 結構中的成員相對應的獨立值,使您得以只初始化想要支持的成員。通常情況下,列表控件 (List Control) 管理列表項的存儲,但使用 回調項 可以將一些信息存儲在應用程序中。有關更多信息,請參見本主題中的 回調項和回調屏蔽 Platform SDK 中的回調項和回調屏蔽。

有關更多信息,請參見項和子項

16. List Control 添加列利用 Cstring 的例子

//

       // create Columns ...

       //

       for( i="0" ; i

       {

              // create columns

              str.Format(IDS_COLUMN, i+1);

              colId = refCtrl.InsertColumn(nCol, str, LVCFMT_LEFT, 100);

              nCol++;

 

       }

關於str.Format:

例: CString str = "Some Data";

str.Format("%s%d", str, 123);   // Attention: str is also used in the parameter list.

IDS_COLUMN :字符串ID ,內容爲Column %d

 

17. CListCtrl::SetItemText

BOOL SetItemText( int nItem , int nSubItem , LPTSTR lpszText );

Return Value

Nonzero if successful; otherwise zero.

Parameters

nItem

Index of the item whose text is to be set.

nSubItem

Index of the subitem, or zero to set the item label.

lpszText

Pointer to a string that contains the new item text.

Remarks

Changes the text of a list view item or subitem.

 

18. CListCtrl::InsertItem

int InsertItem( const LVITEM* pItem );

int InsertItem( int nItem , LPCTSTR lpszItem );

int InsertItem( int nItem , LPCTSTR lpszItem , int nImage );

int InsertItem( UINT nMask , int nItem , LPCTSTR lpszItem , UINT nState , UINT nStateMask , int nImage , LPARAM lParam );

Return Value

The index of the new item if successful or -1 otherwise.

Parameters

pItem

Pointer to an LVITEM structure that specifies the item’s attributes, as described in the Platform SDK .

nItem

Index of the item to be inserted.

lpszItem

 Address of a string containing the item’s label, or LPSTR_TEXTCALLBACK if the item is a callback item. For information on callback items, see CListCtrl::GetCallbackMask .

nImage

Index of the item’s image, or I_IMAGECALLBACK if the item is a callback item. For information on callback items, see CListCtrl::GetCallbackMask .

nMask

The nMask parameter specifies which item attributes passed as parameters are valid. It can be one or more of the mask values described in LVITEM structure in the Platform SDK . The valid values can be combined with the bitwise OR operator.

nState

Indicates the item's state, state image, and overlay image. See the Platform SDK topics LVITEM for more information and List View Item States for a list of valid flags.

nStateMask

Indicates which bits of the state member will be retrieved or modified. See LVITEM in the Platform SDK for more information.

nImage

Index of the item’s image within the image list.

lParam

A 32-bit application-specific value associated with the item. If this parameter is specified, you must set the nMask attribute LVIF_PARAM .

Remarks

Inserts an item into the list view control.

 

19. 引用 &

程序參考:E:/ 唐進/ 工作/ 項目/VC2005 項目/testing/MFC/0328MauCtni/ 資源例程/ ××Print ListCtrl on multiple pages/listPrint_demo/listPrintView.cpp(111): CListCtrl &refCtrl = GetListCtrl();

 

void CListPrintView::OnFill()

{

       CWaitCursor wait;

       CListCtrl       &refCtrl = GetListCtrl();// 此處爲引用

       int                  i,

                            j,

                            nCol=0,

                            colId,

                            iActualItem;

       CString          str;

 

       if( m_bFilled )

       {

              AfxMessageBox(IDS_STUPID);

              return;

       }

對於

CListView::GetListCtrl

CListCtrl& GetListCtrl( ) const;

Return Value

A reference to the list control associated with the view.

Remarks

Call this member function to get a reference to the list control associated with the view.

經典例子:

void CListPrintView::OnFill()

{

       CWaitCursor wait;

       CListCtrl       &refCtrl = GetListCtrl();// 此處猶爲重要

       int                  i,

                            j,

                            nCol=0,

                            colId,

                            iActualItem;

       CString          str;

 

       if( m_bFilled )

       {

              AfxMessageBox(IDS_STUPID);

              return;

       }

 

       m_bFilled      = TRUE;

 

       // speed up !

       SetRedraw(FALSE);

 

       //

       // create Columns ...

       //

       for( i="0" ; i

       {

              // create columns

              str.Format(IDS_COLUMN, i+1);

              colId = refCtrl.InsertColumn(nCol, str, LVCFMT_LEFT, 100);

              nCol++;

 

       }

       m_ColSortOrder.SetSize(nCol);

 

       // ... and fill in text

       for( j="0"; j

       {

              str.Format(IDS_CELL, i+1, j+1);

              iActualItem = refCtrl.InsertItem(j, str);

             

              for( i="0" ; i

              {

                     str.Format(IDS_CELL, i+1, j+1);

                     refCtrl.SetItemText(iActualItem, i, str);

              }

       }

 

 

       DWORD dwStyle = refCtrl.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE);

       dwStyle |= LVS_EX_HEADERDRAGDROP| LVS_EX_GRIDLINES;

       dwStyle |= LVS_EX_FULLROWSELECT;

 

       refCtrl.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)dwStyle);

 

       SetRedraw(TRUE);

}

 

 

20. 請教關於 c++ combo box 的用法

Reference: http://zhidao.baidu.com/question/3937015.html

我在對話框中添加了一個 combo box ,請問如何在程序裏動態增加,刪除列表( item ),以及如何獲取用戶當前選擇的是哪個列表,請說明的詳細一點,請用非 MFC 的方法。
謝謝!!

 

可以調用 SendMessage 函數來實現這些功能

增加一個列表項 CB_ADDSTRING

lResult = SendMessage( // returns LRESULT in lResult

(HWND) hWndControl, // handle to destination control

(UINT) CB_ADDSTRING, // message ID

(WPARAM) wParam, // = 0; not used, must be zero

(LPARAM) lParam // = (LPARAM) (LPCTSTR) lParam;

);

lParam 指向一個以 null 結束的字符串,將被加入的列表項

 

刪除一個列表項 CB_DELETESTRING

lResult = SendMessage( // returns LRESULT in lResult

(HWND) hWndControl, // handle to destination control

(UINT) CB_DELETESTRING, // message ID

(WPARAM) wParam, // = (WPARAM) () wParam;

(LPARAM) lParam // = 0; not used, must be zero

);

wParam 指定將被刪除列表項的下標 ( 0 開始 )

 

取得選定的項 CB_GETCURSEL

lResult = SendMessage( // returns LRESULT in lResult

(HWND) hWndControl, // handle to destination control

(UINT) CB_GETCURSEL, // message ID

(WPARAM) wParam, // = 0; not used, must be zero

(LPARAM) lParam // = 0; not used, must be zero

);

返回值了 lResult 包含了當前被選擇的列表項的下標 ( 0 開始 )

參考資料: microsoft msdn

 

  1. Reference: http://blog.csdn.net/zhoyan/archive/2002/09/25/13239.aspx

1.     你在編輯狀態下點那個控件的向下的三角形,就出冒出來一個可以調高度的東東。將高度調高,否則在執行時會不能顯示下拉選項。

2.       2. combo box 添加選項,在編輯狀態下選 combo box 控件的屬性,選 Data 標籤,在編輯框中添加選項,按 Ctrl-Enter 來添加下一個選項。

3.       3. combo box 添加變量
  combo box
有兩個變量, CComboBox 類變量和 CString 變量。
  CComboBox
變量用來設置 combo box 的屬性,一般在 cdialog 類中的 oninitdialog() 函數中使用。添加方法是在 classwizard 中添加變量,添加時 Category 中選 Control 。例如: CComboBox.SetCurSel(0) 用來設置下拉菜單初始值,具體看 MSDN    
  CString
變量用來存儲下拉菜單所選的選項值。同樣,當選項發生變化時要使用 UpdateData(TRUE) 函數更新該變量的值。

 

21. 指針類型轉換

我們已經知道,指針的值就是指針指向的地址,在 32 位程序中,指針的值其  
實是一個 32 位整數。那可不可以把一個整數當作指針的值直接賦給指針呢?就象  
下面的語句:  
unsigned int a; 
TYPE *ptr;//TYPE
int char 或結構類型等等類型。  
... 
... 
a=20345686; 
ptr=20345686;//
我們的目的是要使指針 ptr 指向地址 20345686 (十進制  
 
ptr=a;//
我們的目的是要使指針 ptr 指向地址 20345686 (十進制)  
編譯一下吧。結果發現後面兩條語句全是錯的。那麼我們的目的就不能達到  
了嗎?不,還有辦法:  
unsigned int a; 
TYPE *ptr;//TYPE
int char 或結構類型等等類型。  
... 
... 
a=
某個數,這個數必須代表一個合法的地址;  
ptr=(TYPE*)a
// 呵呵,這就可以了。  
嚴格說來這裏的 (TYPE*) 和指針類型轉換中的 (TYPE*) 還不一樣。這裏的 (TYP 
E*)
的意思是把無符號整數 a 的值當作一個地址來看待。  
上面強調了 a 的值必須代表一個合法的地址,否則的話,在你使用 ptr 的時候  
,就會出現非法操作錯誤。  

想想能不能反過來,把指針指向的地址即指針的值當作一個整數取出來。完  
全可以。下面的例子演示了把一個指針的值當作一個整數取出來,然後再把這個  
整數當作一個地址賦給一個指針:  
例十六:  
int a=123,b; 
int *ptr=&a; 
char *str; 
b=(int)ptr;//
把指針 ptr 的值當作一個整數取出來。  
str=(char*)b;//
把這個整數的值當作一個地址賦給指針 str  

好了,現在我們已經知道了,可以把指針的值當作一個整數取出來,也可以  
把一個整數值當作地址賦給一個指針。  

 

22.DATA TYPE

  • LONG    A 32-bit signed integer.
  • LPARAM    A 32-bit value passed as a parameter to a window procedure or callback function.
  • LPCSTR    A 32-bit pointer to a constant character string.
  • LPSTR    A 32-bit pointer to a character string.
  • LPCTSTR    A 32-bit pointer to a constant character string that is portable for Unicode and DBCS.
  • LPTSTR    A 32-bit pointer to a character string that is portable for Unicode and DBCS.
  • LPVOID    A 32-bit pointer to an unspecified type.
  • LRESULT    A 32-bit value returned from a window procedure or callback function.
  • UINT    A 16-bit unsigned integer on Windows versions 3.0 and 3.1; a 32-bit unsigned integer on Win32.
  • WNDPROC    A 32-bit pointer to a window procedure.
  • WORD    A 16-bit unsigned integer.
  • WPARAM    A value passed as a parameter to a window procedure or callback function: 16 bits on Windows versions 3.0 and 3.1; 32 bits on Win32.

Data types unique to the Microsoft Foundation Class Library include the following:

  • POSITION    A value used to denote the position of an element in a collection; used by MFC collection classes.
  • LPCRECT    A 32-bit pointer to a constant (nonmodifiable) RECT structure.

 

23.STRING TO BYTE

CString   str="uhsajflkj";  
  BYTE   king[20];  
  king   =   (BYTE   )str.GetBuffer(Str.GetLength());  

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