MFC List Control的用法總結

2021-08-20 21:50:03 字數 2984 閱讀 3012

list control是mfc中經常用到的控制項,但是可惜該控制項並不支援鍵盤輸入、新增各種控制項(button、combobox...)等功能,說白了基本功能就是乙個用於顯示資料的**性質控制項。那麼,對於鍵盤輸入的支援以及控制項的新增等功能具體如何實現,在下文中一一詳述。

一、基本的使用

1.初始化風格

對於style的(報表風格、單選模式等)設定;對於extendedstyle(網格新增、item前新增check box等)的設定;例:

對於乙個關聯變數為m_errorlist的list control初始化:

long lstyle;

lstyle = getwindowlong(m_errorlist.m_hwnd, gwl_style);//獲取當前視窗style

lstyle &= ~lvs_typemask; //清除顯示方式位

lstyle |= lvs_report; //設定style

lstyle |= lvs_singlesel;//單選模式

setwindowlong(m_errorlist.m_hwnd, gwl_style, lstyle);//設定style

dword dwstyle = m_errorlist.getextendedstyle();

dwstyle |= lvs_ex_fullrowselect;//選中某行使整行高亮(只適用與report風格的listctrl)

dwstyle |= lvs_ex_gridlines;//網格線(只適用與report風格的listctrl)

dwstyle |= lvs_ex_checkboxes;//item前生成checkbox控制項

m_errorlist.setextendedstyle(dwstyle); //設定擴充套件風格

2.插入列、行

插入列:引數分別為(列位置0、列標題為amp enable、位置居中、列寬度、列索引號0)

m_errorlist.insertcolumn(0, "amp enable", lvcfmt_center, enablelistctrlrect.width() * 1 / 1, 0);
插入行:引數分別為(行索引0、行標題)

m_errorlist.insertitem(0, "caption");
3.插入子項:引數分別為(行索引號、列索引號、子項內容)

m_listctr.setitemtext(0,1,"content");
以上,基本功能結束。

二、edit control的新增(鍵盤輸入的支援)

1.在list control所在對話方塊內新增乙個編輯框控制項,並設為不可見;

2.對list control新增控制項的雙擊事件nm_dblclk,在觸發函式內寫:

void caboutlistcontroldlg::onnmdblclklist1(nmhdr *pnmhdr, lresult *presult)

*presult = 0;

}

3.給edit control新增killfocus事件,並在觸發函式內寫:

void caboutlistcontroldlg::onenkillfocusedit1()

以上,list control的可編輯功能完成!

三、list control對於任意控制項新增的支援(重點來了!)

以cbutton類控制項的新增為例!

基本思路:1.生成控制項(靜態/動態)2.將控制項貼到list control的指定位置 3.如有滾動條,跟隨滾動條實現位置更新,且不屏閃(很重要)

2.貼控制項到指定位置處:(兩種方式)

第一種:(只針對動態生成)生成時,將父視窗指標定義為listcontrol且rect為目標處的位置;

cbutton *btn = new cbutton();

btn->create(str, bn_dwstyle, rect, getdlgitem(idc_list1), idc_dynamic_button0 + buttonnum);

第二種:(動態/靜態都可)控制項生成後,這裡

rect1同上;

btn->setparent(&m_listctr);//將button設為list ctr的子視窗,即轉換為list ctr的座標!

btn->movewindow(rect1);//將button移動到對應位置處

3.list control存在滾動條情況下,保證貼上去的控制項位置跟隨滾動條重新整理,且防止屏閃

位置重新整理:試了很多方法,但其實最簡單實用的就是開乙個timer,在ontimer()中對所貼上去的所有控制項,呼叫 movewindow()+invalidate()函式即可實時重繪/更新視窗;

防屏閃:為了防止重繪一直在進行,導致螢幕的閃爍,最好的辦法就是在合適的條件下開啟和關閉位置重新整理的timer;

展開來說就是:對listcontrol新增觸發函式(lvn_beginscroll),在函式體內set上述的位置重新整理timer;也即只有在拖動滾動條時才會觸發位置重新整理,這是在合適的時候開啟timer;

再開乙個一直在工作的timer,在此timer內不停獲取滾動條(水平/垂直)的位置,並不斷判斷本次觸發與上次觸發時滾動條位置的變化;如果沒有產生變化,則意味著滾動條的拖動停止,此時kill位置重新整理的timer即可,這是在合適的時間關閉timer。

附上獲取滾動條位置的函式:

m_listctr.getscrollpos(sb_horz)//水平滾動條
m_listctr.getscrollpos(sb_vert)//垂直滾動條

以上。

MFC List Control控制項

list control 控制項一共有四種呈現的方式 大圖示 小圖示 列表和報表形式 列表沒有表頭,報表形式有表頭 protected cimagelist m imagelist 新增變數可顯示 初始化m list.insertcolumn 0,l 第一列 lvcfmt left,100 m li...

MFC list Control 控制項設定

m listprocess m listmodule是相應的控制項變數,首先列表屬性要選擇report crect rect1,rect2 獲取程式語言列表檢視控制項的位置和大小 m listprocess.getclientrect rect1 m listmodule.getclientrect...

MF CListControl 簡單功能使用

可檢視 todo 在此新增額外的初始化 ananlydata.modifystyle 0,lvs showselalways lvs ex gridlines lvs ex twoclickactivate ananlydata.setextendedstyle lvs ex flatsb 扁平風格...