ID Artikel: 250614 - Kajian Terakhir: 21 September 2011 - Revisi: 2.0

Bagaimana jenis item dalam CListCtrl dalam laporan Tampilan

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.
Perbesar semua | Perkecil semua

RINGKASAN

Tidak banyak informasi telah disediakan untuk proses menyortir barang di kontrol ListView, terutama yang dibungkus oleh CListCtrl MFC kelas. Rincian mudah untuk menerapkan dan artikel ini mencoba untuk mengisi kesenjangan dalam dokumentasi untuk fitur ini berguna. Contoh kode mewakili MFC dialog dengan daftar kontrol yang ditetapkan untuk gaya LVS_REPORT.

INFORMASI LEBIH LANJUT

Untuk menyortir barang di kontrol ListView, ada harus LVITEM struktur yang terkait dengan item. MFC menyediakan ini untuk pengembang, memungkinkan item untuk dimasukkan dengan sederhana InsertItem (int nItem, LPCTSTR lpszItem) fungsi panggilan yang menciptakan struktur dengan default masuk akal. Buffer dari kompleksitas kadang-kadang dapat menyesatkan. Namun, LVITEM struktur adalah kunci penting untuk memanipulasi ListView item, termasuk mekanisme pengurutan.

The lParam unsur LVITEM menyediakan informasi yang diperlukan. Ketika SortItems fungsi CListCtrl kelas ini disebut, itu harus memberikan fungsi pointer ke fungsi panggilan balik semacam, dan aplikasi buatan DWORD nilai. Selama seperti itu, fungsi panggilan balik berulang kali dijalankan sebagai dua item dari daftar kontrol yang dipilih untuk perbandingan. Parameter yang diterima lParam elemen dari setiap item LVITEM struktur, dan DWORD nilai yang disahkan oleh SortItems panggilan.

Kode di bawah ini mewakili contoh sederhana menyortir daftar Presiden AS sepuluh mengendalikan ListView. Presiden awalnya disimpan dalam array CString multi-dimensi yang statis.

static CString strData[10][3] =
{
	{ _T("Washington"), _T("George"), _T("1789-1797") },
	{ _T("Adams"), _T("John"), _T("1797-1801") },
	{ _T("Jefferson"), _T("Thomas"), _T("1801-1809") },
	{ _T("Madison"), _T("James"), _T("1809-1817") },
	{ _T("Monroe"), _T("James"), _T("1817-1825") },
	{ _T("Adams"), _T("John Quincy"), _T("1825-1829") },
	{ _T("Jackson"), _T("Andrew"), _T("1829-1837") },
	{ _T("Van Buren"), _T("Martin"), _T("1837-1841") },
	{ _T("Harrison"), _T("William Henry"), _T("1841") },
	{ _T("Tyler"), _T("John"), _T("1841-1845") }
};
				

Fungsi panggilan balik semacam dapat didefinisikan statis sebagai anggota kelas atau, seperti di sini, hanya sebagai fungsi global:
int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
				

Unsur lParam bisa apa saja dari yang sederhana sampai sangat kompleks. Sering, struktur ini berguna dalam konteks ini, memungkinkan beberapa lembar data yang dirujuk. Untuk contoh ini, struktur yang disebut ITEMDATA didefinisikan untuk menahan unsur-unsur yang tiga terdiri dari item yang diberikan:
typedef struct {
	LPTSTR pszLastName;
	LPTSTR pszFirstName;
	LPTSTR pszTerm;
} ITEMDATA, *PITEMDATA;
				

Dalam contoh ini, struktur didefinisikan dalam CDialog file header kelas, dan variabel anggota dari pointer ke array 10 didefinisikan:
	ITEMDATA* m_pData[10];
				

Kontrol ListView ditambahkan ke dialog, dan variabel anggota didefinisikan disebut m_ctlListView. Item ditambahkan dalam OnInitDialog:

	m_ctlListView.InsertColumn(0, _T("Last Name"), LVCFMT_LEFT, 100);
	m_ctlListView.InsertColumn(1, _T("First Name"), LVCFMT_LEFT, 100);
	m_ctlListView.InsertColumn(2, _T("Term"), LVCFMT_LEFT, 100);

	for (int i=0; i<10; i++)
	{
		m_pData[i] = new ITEMDATA;
		m_pData[i]->pszLastName = (LPTSTR)(LPCTSTR)strData[i][0];
		m_pData[i]->pszFirstName = (LPTSTR)(LPCTSTR)strData[i][1];
		m_pData[i]->pszTerm = (LPTSTR)(LPCTSTR)strData[i][2];

		m_ctlListView.InsertItem(i, strData[i][0]);
		m_ctlListView.SetItemText(i, 1, strData[i][1]);
		m_ctlListView.SetItemText(i, 2, strData[i][2]);
		m_ctlListView.SetItemData(i, (LPARAM)m_pData[i]);
	}
				

Tiga kolom dimasukkan untuk nama terakhir, nama pertama dan masa jabatan. Kemudian, untuk masing-masing sepuluh item, baru ITEMDATA struktur dialokasikan dan dijalankan dari CString array. Item dimasukkan sangat sederhana, menggunakan hanya indeks dan nama terakhir string, maka teks diatur untuk dua kolom lain item. Akhirnya, fungsi SetItemData disebut, melewati ITEMDATA baru sebagai parameter. Ini reinitializes lParam item LVITEM struktur, dan mempersiapkan cara untuk jenis.

MFC dalam Visual C++ 6.0 memiliki masalah dengan header pemberitahuan untuk kontrol ListView. Meskipun handler dapat ditambahkan, dalam versi ini tidak disebut. Sebagai contoh, gunakan Wizard kelas atau WizardBar untuk menambahkan Windows pesan Handler. Jika ID pengendalian ListView disorot, sejumlah pemberitahuan pesan dipilih. Untuk mengurutkan item ketika header diklik untuk kolom tertentu, pilih pemberitahuan HDN_ITEMCLICK. An ON_NOTIFY pesan peta catatan yang dihasilkan, serta fungsi pengendali. Sebagai contoh saat ini, entri muncul sebagai berikut:

	ON_NOTIFY(HDN_ITEMCLICK, IDC_LIST1, OnItemclickList1)
				

Masalahnya di sini adalah bahwa pemberitahuan tidak benar-benar berasal dari kontrol ListView; Sebaliknya, kontrol Header yang dibuat oleh ListView mengirimkan pemberitahuan. Entri peta pesan yang tercantum di atas tidak bekerja. Perbaikan sederhana, namun, karena Header kontrol selalu memiliki ID 0, makro dapat diedit untuk bekerja dengan benar:
	ON_NOTIFY(HDN_ITEMCLICK, 0, OnItemclickList1)
				

Kemudian, dalam OnItemclickList1 handler, SortItems panggilan dibuat:
void CSortListDlg::OnItemclickList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NMLISTVIEW *pLV = (NMLISTVIEW *) pNMHDR;
	
	m_ctlListView.SortItems(SortFunc, pLV->iItem);
	
	*pResult = 0;
}
				

(Header pesan pemberitahuanNMHDR) adalah benar-benar pemberitahuan ListView, NMLISTVIEW, yang berisi indeks ke kolom yang diklik. Dalam contoh ini, ini diwakili oleh iItem. Daftar yang lebih kompleks mungkin perlu referensi iSubItem unsur struktur ini juga. Alamat fungsi panggilan balik berlalu untuk SortItems, bersama dengan jumlah kolom yang diklik.

SortFunc rutin disebut berulang kali seperti pasangan ListView item yang dilewatkan ke fungsi untuk perbandingan. Dua parameter pertama adalah lParam elemen masing-masing item LVITEM struktur, dan parameter ketiga (aplikasi-didefinisikan) adalah jumlah kolom yang disediakan dalam SortItems panggilan.
int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	int nRetVal;

	PITEMDATA pData1 = (PITEMDATA)lParam1;
	PITEMDATA pData2 = (PITEMDATA)lParam2;


	switch(lParamSort)
	{
	case 0:	// Last Name
		nRetVal = strcmp(pData1->pszLastName,
                                 pData2->pszLastName);
		break;

	case 1:	// First Name
		nRetVal = strcmp(pData1->pszFirstName,
                                 pData2->pszFirstName);
		break;

	case 2: // Term
		nRetVal = strcmp(pData1->pszTerm, pData2->pszTerm);
		break;

	default:
		break;
	}

	return nRetVal;
}
				

Indeks kolom berlalu dalam lParamSort menentukan mana elemen objek ITEMDATA berlalu dalam lParam1 dan lParam2 harus digunakan untuk perbandingan. Hasilnya adalah kembali dan proses terus sampai semua item telah disortir.

Sebagai pengingat, struktur ITEMDATA yang dialokasikan untuk daftar item harus akhirnya dihancurkan. Untuk contoh ini, WM_DESTROY Handler untuk dialog iterates melalui elemen anggota dan menghapus mereka.
	for (int i=0; i<10; i++)
		delete m_pData[i];
				

REFERENSI

Untuk informasi lebih lanjut tentang ListView umum kontrol, berkonsultasi dengan Platform SDK dokumentasi di bawah Kontrol umum Windows dalam Layanan antarmuka pengguna bagian.

Berlaku bagi:
  • Microsoft Foundation Class Library 4.2
Kata kunci: 
kbcmnctrls kbctrl kbhowto kblistview kbmt KB250614 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:250614  (http://support.microsoft.com/kb/250614/en-us/ )
Retired KB ArticleSanggahan Konten KB yang Tidak Lagi Diperbarui
Artikel ini berisi tentang produk yang tidak lagi didukung oleh Microsoft. Oleh karena itu, artikel ini disajikan ?sebagaimana adanya? dan tidak akan diperbarui.