Pergunta

Pode-se obter o texto do item selecionado na visualização da lista de uma caixa de diálogo comum. Mas não se pode obter seu PIDL e, se o usuário optou por ocultar extensões conhecidas (o padrão), não se pode realmente dizer qual arquivo foi selecionado sem a extensão ou o seu PIDL.

Assim, maneiras possíveis de resolver isso pode ser:

  1. Obtenha uma View Ishell da caixa de diálogo de arquivo aberto padrão. O Ishellview subjacente pode dizer qual é o PIDL para a seleção atual. Então, se eu pudesse simplesmente se aprofundar no Ishellview, eu ficaria dourado. Infelizmente, não vejo CDM_XXX que o faria. E não consigo pensar no topo da minha cabeça de qualquer coisa que possa alcançá -lo !!! :(
  2. Alguma outra ideia?!

Costumávamos confiar no fato de que a versão Windows 9x, 2000 e XP da caixa de diálogo de arquivo comum armazenou o PIDL de cada item nos dados do LVITEM (crédito original para Paul Dilascia):

LpcItemidlist pidlitem = (lpcitemidlist) plistctrl-> getItemdata (nitem);

No entanto, começando com os controles comuns do Vista e acima, essa técnica falha :(

Alguma ideia?

EDIT: Preciso obter essas informações não apenas para o item atualmente selecionado na visualização da lista, mas também para todos os itens na visualização da lista.

Edit2: a razão pela qual preciso cavar tão profundo:

Em versões anteriores do nosso aplicativo, fornecemos a capacidade de: (1) pressionar um botão personalizado "Visualizar" que fecha a caixa de diálogo, mas transfere para o aplicativo a lista de itens atualmente exibidos na visualização, em sua ordem visível, juntamente com o Índice do atualmente destacado. Esta lista deve ser totalmente especificada - vendo 3 arquivos que são todos "J1329192" (quando existem realmente 3 arquivos "J1329192.xyz" "J1329192.xzy" e "J1329192.zyx" [nessa ordem) não são úteis.

Os usuários podem digitar um filtro de nome de arquivo parcial no campo "Nome do arquivo:", e a caixa de diálogo comum mostrará apenas arquivos que correspondem ao filtro parcial fornecido, na ordem de classificação que o usuário escolheu. Portanto, para relatar o aplicativo exatamente o que o usuário queria visualizar exige que possamos consultar essas informações do controle de visualização da lista (ou a própria caixa de diálogo comum).

Também fazemos outros aprimoramentos na caixa de diálogo de arquivo-incluindo um painel de visualização no local que mostra a seleção atual do usuário como miniatura, além de ter uma interface de plantas recentes personalizadas, etc. Tudo isso foi possível (com muito de trabalho) antes de Vista. Poste o Vista, eu corri para a parede da parede. Por enquanto, usamos uma caixa de diálogo de arquivo padrão com apenas poucos recursos próprios, o que não se encaixa bem com os clientes (o que aconteceu com o recurso X?!)

Existem outros aprimoramentos, mas essa é uma boa visão geral. E todos se resumem a exigir o conhecimento de "realmente, honestamente, qual arquivo especificamente está na exibição no índice X?" E por razões desconhecidas - a Microsoft parece não sentir a necessidade de fornecer essa interface. Na verdade, eles nunca o fizeram. Somente através de algumas engenharia hackers e reversa, pudemos descobrir como as coisas funcionavam sob o capô e obtendo as informações necessárias. E sim, isso não é suportado e, sim, a Sra. Inevitavelmente quebrou nosso código. Eu realmente não os culpo por isso - o que acho desagradável é que a interface mais nova e mais assustadora é muito mais fechada do que a mais velha - e elas não forneceram interfaces mais iniciais - interfaces suportadas - para fazer esses aprimoramentos de diálogo . É como se eles tivessem dado alguns passos para trás - e nenhum para a frente (em nome do progresso).

Foi útil?

Solução

Mandar Wm_user+7 Para obter o navegador e, em seguida, obtenha a interface IshellView do Shell View ativa.

Você conhece a conseqüência usual do uso de comportamento sem documentos, certo?

Outras dicas

Ah, eu encontrei. Você vai querer usar IFileOpenDialog Para o Vista, que deve suportar explicação de todas as operações que você mencionou.

Eu sei que este é um tópico antigo, mas, no Vista+, os diálogos de estilo antigo ainda são suportados. Você pode desligar o estilo Vista e manter todos os seus controles personalizados como antes. É isso que fazemos: temos uma janela de visualização personalizada em um modelo conectado ao cfiledialog, que parece ser impossível de se reproduzir no Ifiledialog.

Acredito que você precisa passar false em um parâmetro bool no construtor para desligar as caixas de diálogo no estilo Vista.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top