ID do artigo: 250614 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 1.2

Como classificar itens em um CListCtrl no modo de exibição relatório

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Recolher tudo

Sumário

Não a quantidade de informações foi fornecido para o processo de classificação dos itens em um controle ListView, especialmente um quebradas pela classe CListCtrl MFC. Os detalhes são fáceis de implementar e este artigo tenta preencher a lacuna na documentação para este recurso útil. O código de exemplo representa uma caixa de diálogo MFC com um controle de lista definido como o estilo LVS_REPORT.

Mais Informações

Para classificar os itens em um controle ListView, deve haver uma estrutura LVITEM associada ao item. MFC fornece isso para o desenvolvedor, permitindo que um item a ser inserido com uma chamada de função InsertItem(int nItem, LPCTSTR lpszItem) simples que cria a estrutura com padrões razoáveis. Um buffer de complexidade subjacente às vezes pode ser enganoso. No entanto, a estrutura LVITEM é uma chave importante para manipular itens ListView, incluindo o mecanismo de classificação.

O elemento lParam LVITEM fornece informações necessárias. Quando a função SortItems de classe CListCtrl é chamada, ele deve fornecer um ponteiro de função para uma função de retorno de chamada de classificação e um valor DWORD definido pelo aplicativo. Durante a classificação, a função de retorno de chamada é invocada repetidamente como dois itens do controle de lista são selecionados para comparação. Os parâmetros que recebe são o elemento lParam da estrutura LVITEM cada item, e o valor DWORD passado pela chamada SortItems .

O código a seguir representa um exemplo simples de classificar uma lista de dez EUA presidentes em um controle ListView. Os presidentes inicialmente são armazenados em uma matriz de CString multidimensional estática.

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") }
};
				

A função de classificação de retorno de chamada pode ser definida estaticamente, como um membro de uma classe ou, como aqui, simplesmente como uma função global:
int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
				

O elemento lParam pode ser desde simples para altamente complexas. Com freqüência, uma estrutura é útil neste contexto, permitindo que várias partes de dados para ser referenciado. Neste exemplo, uma estrutura chamada ITEMDATA foi definida para conter os três elementos que compõem um determinado item:
typedef struct {
	LPTSTR pszLastName;
	LPTSTR pszFirstName;
	LPTSTR pszTerm;
} ITEMDATA, *PITEMDATA;
				

Neste exemplo, a estrutura tiver sido definida no arquivo de cabeçalho de uma classe CDialog e uma variável de membro de um ponteiro para uma matriz de 10 foi definida:
	ITEMDATA* m_pData[10];
				

Um controle ListView foi adicionado a uma caixa de diálogo e uma variável de membro definida chamado m_ctlListView. Os itens foram adicionados ao 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]);
	}
				

Três colunas foram inseridas para o último nome, nome e termo do escritório. Em seguida, para cada um dos dez itens, uma nova estrutura ITEMDATA é alocada e inicializada da matriz CString. O item é inserido muito simples, usando somente o índice e a última seqüência de nome, em seguida, o texto é definido para as outras duas colunas do item. Finalmente, a função SetItemData é chamado, passando o novo ITEMDATA como um parâmetro. Reinicializa o lParam da estrutura LVITEM do item e prepara a forma para a classificação.

MFC no Visual C++ 6.0 tem um problema com notificações de cabeçalho para o controle ListView. Embora possa ser adicionado a um manipulador, na versão atual ele não é chamado. Por exemplo, use o Assistente de classe ou o WizardBar para adicionar um manipulador de mensagem do Windows. Se a identificação do controle ListView estiver realçada, um número de mensagens de notificação está disponível para seleção. Para classificar os itens quando o cabeçalho é clicado para uma determinada coluna, selecione notificação HDN_ITEMCLICK . Uma entrada de mapa de mensagem ON_NOTIFY é gerada, bem como uma função de manipulador. Por exemplo atual, a entrada aparece da seguinte maneira:

	ON_NOTIFY(HDN_ITEMCLICK, IDC_LIST1, OnItemclickList1)
				

O problema aqui é que a notificação, na verdade, não se originam do controle ListView; em vez disso, o controle de cabeçalho criado por ListView envia a notificação. A entrada de mapa de mensagem acima não funciona. A correção é simples, no entanto, como o controle de cabeçalho sempre tem uma identificação de 0, a macro pode ser editada para funcionar corretamente:
	ON_NOTIFY(HDN_ITEMCLICK, 0, OnItemclickList1)
				

Em seguida, no manipulador OnItemclickList1, é feita a chamada SortItems :
void CSortListDlg::OnItemclickList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NMLISTVIEW *pLV = (NMLISTVIEW *) pNMHDR;
	
	m_ctlListView.SortItems(SortFunc, pLV->iItem);
	
	*pResult = 0;
}
				

O cabeçalho de mensagem de notificação ( NMHDR ) é, na verdade, uma notificação de ListView, NMLISTVEIW , que contém o índice para a coluna que foi clicado. Neste exemplo, é representado por iItem . Listas mais complexas pode ser necessário consultar o elemento iSubItem bem dessa estrutura. O endereço da função de retorno de chamada é passado para SortItems , juntamente com o número da coluna que foi clicado.

A rotina SortFunc é chamada repetidamente conforme pares de itens de ListView são passados para a função para comparação. Os primeiros dois parâmetros são o elemento lParam da estrutura LVITEM dos respectivos itens e o terceiro parâmetro (definido por aplicativo) é o número de coluna fornecido na chamada SortItems .
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;
}
				

O índice de coluna passado lParamSort determina qual elemento dos objetos ITEMDATA passado lParam1 e lParam2 deve ser usado para comparação. O resultado é retornado e o processo continua até que todos os itens tenham sido classificados.

Como um lembrete, as estruturas ITEMDATA que foram alocadas para os itens da lista precisa eventualmente ser destruído. Neste exemplo, o manipulador WM_DESTROY para a caixa de diálogo itera através os elementos de membro e exclui-los.
	for (int i=0; i<10; i++)
		delete m_pData[i];
				

Referências

Para obter mais informações no controle ListView comuns, consulte a documentação SDK em Controles comuns do Windows na seção Serviços de interface do usuário .

A informação contida neste artigo aplica-se a:
  • Microsoft Foundation Class Library 4.2
Palavras-chave: 
kbmt kbcmnctrls kbctrl kbhowto kblistview KB250614 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 250614  (http://support.microsoft.com/kb/250614/en-us/ )
Retired KB ArticleAviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.