CListBoxCtrl rendezés

CListBoxCtrl rendezés
2004-10-26T22:46:18+02:00
2004-11-06T16:45:37+01:00
2022-07-22T06:38:27+02:00
ZsZso
Hi

Problémák tömkelegébe ütközök. Probáltam készíteni Listboxot, sikerült. Több oszlopot. Az is ment. Rendezni akartam ... nem sikeredett :(. Szóval ebben kérnék egy kis segítséget. Ahogy én csinálom nem csinál semmit ... szóval marad minden, ahogy volt :(

Ismét csak "előre is köszi" !
Mutasd a teljes hozzászólást!
Ez egy kicsit hosszú lesz, de ez egy működő példa lesz:

header
#pragma once #include "MiniBer.h" // CCegView view typedef struct ITEMDATA { CString csCegNev; long Id; } ITEMDATA, *PITEMDATA; class CCegView : public CListView { DECLARE_DYNCREATE(CCegView) protected: CCegView(); // protected constructor used by dynamic creation virtual ~CCegView(); bool bAscending; public: #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: DECLARE_MESSAGE_MAP() virtual BOOL PreCreateWindow(CREATESTRUCT& cs); static int CALLBACK CompareFunc(LPARAM p1, LPARAM p2, LPARAM lSort); public: virtual void OnInitialUpdate(); private: void IniViewStyle(void); void IniColumns(void); public: afx_msg void OnSize(UINT nType, int cx, int cy); void LoadCegek(void); afx_msg void OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult); afx_msg void OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult); };

cpp

// CegView.cpp : implementation file // #include "stdafx.h" #include "CegView.h" // CCegView IMPLEMENT_DYNCREATE(CCegView, CListView) CCegView::CCegView() { bAscending = true; } CCegView::~CCegView() { } BEGIN_MESSAGE_MAP(CCegView, CListView) ON_WM_SIZE() ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnLvnColumnclick) ON_NOTIFY_REFLECT(NM_DBLCLK, OnNMDblclk) END_MESSAGE_MAP() // CCegView diagnostics #ifdef _DEBUG void CCegView::AssertValid() const { CListView::AssertValid(); } void CCegView::Dump(CDumpContext& dc) const { CListView::Dump(dc); } #endif //_DEBUG // CCegView message handlers BOOL CCegView::PreCreateWindow(CREATESTRUCT& cs) { return CListView::PreCreateWindow(cs); } void CCegView::OnInitialUpdate() { CListCtrl& CegListCtrl = GetListCtrl(); CListView::OnInitialUpdate(); IniViewStyle(); IniColumns(); LoadCegek(); CegListCtrl.SortItems(CCegView::CompareFunc, (LPARAM)&CegListCtrl); } void CCegView::IniViewStyle(void) { CListCtrl& CegListCtrl = GetListCtrl(); DWORD dwStyle = LVS_REPORT | LVS_SINGLESEL; CegListCtrl.ModifyStyle( 0, dwStyle, 0 ); DWORD dwExStyle = CegListCtrl.GetExStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES; CegListCtrl.SetExtendedStyle(dwExStyle); } void CCegView::IniColumns(void) { CListCtrl& CegListCtrl = GetListCtrl(); CRect recCol; this->GetClientRect(&recCol); int iColWidthIt = recCol.Width() / 6; LVCOLUMN lvCol; lvCol.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; lvCol.fmt = LVCFMT_LEFT; lvCol.cx = iColWidthIt; lvCol.iSubItem = 0; lvCol.pszText = _T("Cég"); int zz = CegListCtrl.InsertColumn( 0, &lvCol ); lvCol.cx = iColWidthIt *2; lvCol.iSubItem = 1; lvCol.pszText = _T("Cím"); zz = CegListCtrl.InsertColumn( 1, &lvCol ); lvCol.cx = iColWidthIt; lvCol.iSubItem = 2; lvCol.pszText = _T("Telefon"); zz = CegListCtrl.InsertColumn( 2, &lvCol ); lvCol.cx = iColWidthIt; lvCol.iSubItem = 3; lvCol.pszText = _T("Mobil"); zz = CegListCtrl.InsertColumn( 3, &lvCol ); lvCol.cx = iColWidthIt; lvCol.iSubItem = 4; lvCol.pszText = _T("E-mail"); zz = CegListCtrl.InsertColumn( 4, &lvCol ); } void CCegView::OnSize(UINT nType, int cx, int cy) { CListView::OnSize(nType, cx, cy); CListCtrl& CegListCtrl = GetListCtrl(); CRect recCol; this->GetClientRect(&recCol); int iColWidthIt = recCol.Width() / 6; CegListCtrl.SetColumnWidth(0, iColWidthIt); CegListCtrl.SetColumnWidth(1, iColWidthIt * 2); CegListCtrl.SetColumnWidth(2, iColWidthIt); CegListCtrl.SetColumnWidth(3, iColWidthIt); CegListCtrl.SetColumnWidth(4, iColWidthIt); } void CCegView::LoadCegek(void) { TCHAR pszDest[20] = ""; CCegek* pRs = new CCegek(((CMiniBerDoc*)GetDocument())->pDatabase); pRs->Open(); CListCtrl& CegListCtrl = GetListCtrl(); ITEMDATA* pItem; if( pRs != NULL ) { pRs->MoveFirst(); int iItem = 0; CString csCim = ""; while( !pRs->IsEOF()) { pItem = new ITEMDATA; pItem->csCegNev = CW2A(pRs->m_Ceg); pItem->Id = pRs->m_Id; CegListCtrl.InsertItem( LVIF_TEXT | LVIF_PARAM, iItem, CW2A(pRs->m_Ceg), 0, 0, 0, (LPARAM)pItem ); CegListCtrl.SetItemText( iItem, 1, CW2A(pRs->m_Cim) ); CegListCtrl.SetItemText( iItem, 2, CW2A(pRs->m_Telefon) ); CegListCtrl.SetItemText( iItem, 3, CW2A(pRs->m_Mobil) ); CegListCtrl.SetItemText( iItem, 4, CW2A(pRs->m_Email) ); pRs->MoveNext(); iItem++; } } pRs->Close(); delete pRs; } int CCegView::CompareFunc(LPARAM p1, LPARAM p2, LPARAM lSort) { PITEMDATA pData1 = (PITEMDATA)p1; PITEMDATA pData2 = (PITEMDATA)p2; bool bAscending = (bool)lSort; if( bAscending ) { return pData1->csCegNev.CompareNoCase(pData2->csCegNev); }else{ return pData2->csCegNev.CompareNoCase(pData1->csCegNev); } } void CCegView::OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult) { CListCtrl& CegListCtrl = GetListCtrl(); LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); int iColNum = pNMLV->iSubItem; bAscending = !bAscending; if( iColNum == 0 ) CegListCtrl.SortItems(CCegView::CompareFunc, (LPARAM)bAscending); *pResult = 0; } void CCegView::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult) { CListCtrl& CegListCtrl = GetListCtrl(); long lId = -1; NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; int iItem = pNMListView->iItem; if( iItem > -1 ) { PITEMDATA pData = (PITEMDATA)CegListCtrl.GetItemData(iItem); lId = pData->Id; }else{ } ((CMiniBerDoc*)GetDocument())->SetSelectedMenu(2); ((CMiniBerDoc*)GetDocument())->SetWorkplace(RUNTIME_CLASS(CCegForm)); ((CMiniBerDoc*)GetDocument())->FillCompany(lId); *pResult = 0; }

ezt még ősrégen csináltam, de biztosan emléxem, hogy működött
üdv
Kiri
Mutasd a teljes hozzászólást!

  • Köszi ... most már rájöttem, hogy az az egésznek a lényege, hogy ami a egy sorban van, azt jó egy STRUCTba tenni, aztán a sor DATAjaként eltárolni ... szóval a progirészleted, meg még egy kicsit mélyebbre merüléssel sikerült elkészítenem a listboxom úgy, hogy végre rendez is !
    Mutasd a teljes hozzászólást!
abcd