當前位置:首頁 » 編程軟體 » mfc編譯新控制項樣式

mfc編譯新控制項樣式

發布時間: 2023-05-30 17:52:06

1. VC的MFC的控制項

先來介紹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);
之類的代碼。
1. ListCtrl 風格
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, 'ID', LVCFMT_LEFT, 40 );//插入列
m_list.InsertColumn( 1, 'NAME', LVCFMT_LEFT, 50 );
int nRow = m_list.InsertItem(0, 「11」);//插入行
m_list.SetItemText(nRow, 1, 「jacky」);//設置數據

--------------------------------------------------------------------------------
4. 一直選中item
選中style中的Show selection always,或者在上面第2點中設置LVS_SHOWSELALWAYS
--------------------------------------------------------------------------------
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
{
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
{
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)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );

CMenu menu;
VERIFY( menu.LoadMenu( IDR_MENU1 ) );
CMenu* popup = menu.GetSubMenu(0);
ASSERT( popup != NULL );
popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );
}
*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的 subitem 添加圖標
注意: 首先要用 InsertItem() 插入一行的第一列, 然後才能用 SetItem 設置其他項
m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);
m_userlist.SetItem(..);
--------------------------------------------------------------------------------
18. 在CListCtrl顯示文件,並根據文件類型來顯示圖標
網上找到的代碼,自己試用並改正過, share
步驟1: 設置 list 的圖像列表為 系統圖像列表
BOOL SetSystemImageList( CListCtrl & list )
{
HIMAGELIST himlSmall;
HIMAGELIST himlLarge;
SHFILEINFO sfi;
char cSysDir[MAX_PATH];
CString strBuf;
memset(cSysDir, 0, MAX_PATH);
GetWindowsDirectory(cSysDir, MAX_PATH);
strBuf = cSysDir ;

// SHGetFileInfo:
// If uFlags contains SHGFI_SYSICONINDEX, the return value is a handle to
// an image list that contains the large icon images.
// If SHGFI_SMALLICON is included with SHGFI_SYSICONINDEX, the return value
// is the handle to an image list that contains the small icon images.
//
himlSmall = (HIMAGELIST)SHGetFileInfo ( (LPCSTR)cSysDir,
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
himlLarge = (HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir,
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
if (himlSmall && himlLarge)
{
::SendMessage(list.m_hWnd, LVM_SETIMAGELIST,
(WPARAM)LVSIL_SMALL, (LPARAM)himlSmall);

::SendMessage(list.m_hWnd, LVM_SETIMAGELIST,
(WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge);
}
return TRUE;
}
步驟2: 給列表添加指定的文件, 同時獲得該文件的的圖標索引, 給 list 添加圖標
int GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir, BOOL bSelected) ; // 向前聲明
void AddFiles(CListCtrl & list, LPCTSTR lpszFileName, BOOL bAddToDocument)
{
int nIcon = GetIconIndex(lpszFileName, FALSE, TRUE);
CString strSize;
CFileFind filefind;
// get file size
if ( filefind.FindFile(lpszFileName))
{
filefind.FindNextFile();
strSize.Format('%d', filefind.GetLength());
}
else
strSize = '0';
// split path and filename
CString strFileName = lpszFileName;
CString strPath;
int nPos = strFileName.ReverseFind('\\');
if (nPos != -1)
{
strPath = strFileName.Left(nPos);
strFileName = strFileName.Mid(nPos + 1);
}
// insert to list
int nItem = list.GetItemCount();

//list.InsertItem(nItem, strFileName, nIcon);
//list.SetItemText(nItem, 1, strSize);
//
// 此處可以根據實際需要修改代碼
//
}

--------------------------------------------------------------------------------
19. listctrl內容進行大數據量更新時,避免閃爍
m_list.SetRedraw(FALSE);
//更新內容
m_list.SetRedraw(TRUE);
m_list.Invalidate();
m_list.UpdateWindow();
20. 清除 ListCtrl 以重新初始化:
// 刪除所有行
m_ctrllist.DeleteAllItems() ;
// 刪除所有列
int iColCount = m_ctrllist.GetHeaderCtrl()->GetItemCount() ;

// 方法 1
// 原理: 刪除第一列後, 其他列向前移動
while( m_ctrllist.DeleteColumn(0) ) ;

// 方法 2
for (int i=0; i < iColCount ; i++)
{
m_ctrllist.DeleteColumn(0);
}

2. MFC 改變列表控制項(CListBox)樣式

有啊,你可以去查一次msdn,裡面有它的成員函數介紹如下圖結果:
下面是設置高度的函數介談冊弊紹,你可以查其含族他相應函數,知道查詢方法就好了
Example

// The pointer to my list box.
extern CListBox* pmyListBox;

// Set the height of every item to be the
//姿喊 vertical size of the item's text extent.
CString str;
CSize sz;
int dx=0;
CDC* pDC = pmyListBox->GetDC();
for (int i=0;i < pmyListBox->GetCount();i++)
{
pmyListBox->GetText( i, str );
sz = pDC->GetTextExtent(str);

pmyListBox->SetItemHeight( i, sz.cy );
}
pmyListBox->ReleaseDC(pDC);

3. MFC如何添加自定義控制項

資源編輯器里你照樣拖,在頭文件里包含你的CMyButton.h頭文件,用缺磨答你自己的類定義一個成員變數,並在實現文件中將這個伏慧變數和資源中的ID對應起來游皮

以CButtonST為例

在.h中包含CButtonST類頭文件,並定義一個成員變數
CButtonST m_btnTest;

在.CPP文件中將成員變數和資源中的控制項關聯

void CXXXDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BTN_TEST, m_btnTest);
}

4. mfc 修改控制項樣式

只能通過手動方式了。ModifyStyle

5. C++中已經用MFC編譯好了,怎麼再修改它的對話框控制項啊

只要你有源代碼,修改源代碼資源,再重新編譯一下就行了唄搏仔,這是廢話,你肯定不是這個意思。
如果沒有源代碼,只能譽殲用像exescope、resourcehacker 之類的軟體去慶銀沖修改EXE文件了,如果只是修改對話框控制項里的文字應該沒問題,如果要進行大的改動還是不好辦!

6. mfc怎麼自己寫控制項,類似vs2010添加了好多新的控制項,這事怎麼弄得。回答好的話給高分

可以槐哪蔽直接看MFC的源鉛州代碼,在安裝目錄\Microsoft Visual Studio 9.0\VC\atlmfc\src下,學學MFC的源代碼是緩茄很有幫助的

熱點內容
安卓手機已經鎖起來了怎麼刷機 發布:2025-02-13 06:35:01 瀏覽:882
安卓怎麼快速多選手機桌面圖標 發布:2025-02-13 06:21:51 瀏覽:298
androidia安裝 發布:2025-02-13 06:12:14 瀏覽:12
jsmcc文件夾 發布:2025-02-13 06:11:26 瀏覽:170
演算法與程序設計教案 發布:2025-02-13 06:10:51 瀏覽:55
ftp登錄需要輸入用戶名和密碼 發布:2025-02-13 06:03:33 瀏覽:398
數控編程代表 發布:2025-02-13 05:58:51 瀏覽:385
編程凸輪 發布:2025-02-13 05:38:21 瀏覽:691
判斷素數的編程 發布:2025-02-13 05:29:25 瀏覽:618
androidaes加密 發布:2025-02-13 05:08:36 瀏覽:493