2009-11-18 6 views
3

공통 대화 상자의 목록보기에서 선택한 항목의 텍스트를 가져올 수 있습니다. 그러나 하나는 PIDL을 얻을 수 없으며 사용자가 알려진 확장 (기본)을 숨기도록 선택한 경우 확장자 나 PIDL없이 어떤 파일을 선택했는지 알 수 없습니다. 이 문제를 해결하기 위해공통 파일 대화 상자에서 현재 선택 파일의 실제 이름을 얻으시겠습니까?

그래서 가지 방법이 될 수 있습니다

  1. 가 표준 파일 열기 대화 상자에서 IShellView를 얻습니다. 기본 IShellView는 PIDL이 현재 선택에 해당하는지 알 수 있습니다. 그래서 만약 내가 간단하게 IShellView 보류 얻을 수, 나는 황금 것입니다. 불행히도, 나는 그것을 할 CDM_xxx를 볼 수 없습니다. 그리고 나는 내 머리의 상단을 생각할 수 없다 그걸 얻을 수도 있습니다! :(
  2. 우리는 사실에 의존하는 데 사용

다른 어떤 아이디어?! 그 윈도우 9x, 2000, 그리고 LVITEM 데이터의 각 항목의 PIDL 저장된 공용 파일 대화의 XP 버전 (원래 신용) 폴 딜라 시아에 :

LPCITEMIDLIST pidlItem = (LPCITEMIDLIST) pListCtrl-> GetItemData (nItem)

그러나, 위의 비스타의 일반 컨트롤로 시작하고, 그 기술은 실패 :(

어떤 생각?

편집 : 목록보기에서 현재 선택한 항목뿐만 아니라 목록보기의 모든 항목에 대해이 정보를 얻을 수 있어야합니다.

EDIT2 : (1) [사용자 지정 버튼 대화 상자를 닫습니다 "미리보기"하지만 전달한다에 : 우리가 할 수있는 기능을 제공합니다 우리의 응용 프로그램의 이전 버전에서

: 난 너무 깊이 파고해야하는 이유 보기에 현재 표시된 항목 목록을 현재 강조 표시된 항목의 색인과 함께 표시 순서대로 app합니다. 이 목록은 완전히 지정되어야합니다. "J1329192"인 3 개의 파일을 봅니다 (실제로 "J1329192.xyz" "J1329192.xzy"및 "J1329192.zyx"의 3 개의 파일이 유용 할 때).

사용자는 "파일 이름 :"필드에 부분 파일 이름 필터를 입력 할 수 있으며 사용자가 선택한 정렬 순서대로 주어진 부분 필터와 일치하는 파일 만 일반 대화 상자에 표시됩니다. 따라서 사용자가 미리보기를 원했던 것을 앱에 정확히보고하려면 목록보기 컨트롤 (또는 공통 대화 상자 자체)에서 해당 정보를 쿼리 할 수 ​​있어야합니다.

파일 대화 상자에 대한 다른 향상된 기능 - 사용자의 현재 선택을 미리보기 이미지로 표시하고 사용자 지정 최근 장소 인터페이스 등을 포함하는 내부 미리보기 창 포함 (많은 작업을 통해) Vista 이전. 포스트 비스타, 나는 벽에 벽에 부딪쳤다. 당분간은 표준 파일 대화 상자를 사용하여 고객과 잘 어울리지 않는 몇 가지 기능 만 제공합니다 (X 기능은 어떻게됩니까?)

다른 향상된 기능이 있지만 좋은 대략적인 개요. 그리고 그들은 모두 "정말로, 정직하게, 어떤 파일이 인덱스 X에서 볼 수 있는가?"에 대한 지식을 필요로합니다. 그리고 알려지지 않은 이유로 - Microsoft는 그러한 인터페이스를 제공 할 필요성을 느껴 보이지 않습니다. 사실 그들은 결코 그렇게하지 않았습니다.해킹과 리버스 엔지니어링을 통해서만 상황이 어떻게 작동하는지 파악하고 필요한 정보를 얻을 수있었습니다. 그리고 예, 그것은 지원되지 않습니다. 예, 필연적으로 MS가 우리 코드를 위반했습니다. 나는 그것들을 정말로 비난하지 않는다. 내가 불쾌하다고 느낀 점은 그들의 더 새롭고, 더 단단한 인터페이스가 이전 인터페이스보다 훨씬 더 닫히고 더 많은 인터페이스를 지원하지 않는다는 것이다. . 그것들은 거꾸로 한 걸음 더 나아갔습니다. 그리고 어떤 것도 진행하지 않았습니다 (진행의 이름으로).

+0

CDM_GETFILEPATH의 문제점은 무엇입니까? – MSN

+0

일반 대화 상자에서 사용자가 입력 한 것과 같은 기본 확장명을 포함하여 대화 상자에서 반환 된 파일 이름이 될 것이라고 생각하는 내용을 알려줍니다. 단순히 "목록보기에서 선택한 항목"이 아닙니다. – Mordachai

+0

대신 GetItemData 먼저 GetItem과 캐스트 lParam을 호출합니까? 똑같다? – BostonLogan

답변

2

WM_USER+7을 보내 브라우저를 가져온 다음 활성 셸보기의 IShellView 인터페이스를 가져옵니다.

문서화되지 않은 동작을 사용했을 때의 일반적인 결과를 알고 계십니까?

+0

나는 이것을 줄 것이다. 고마워. 그리고 특히 링크에 감사한다. – Mordachai

1

아, 찾았습니다. Vista에 IFileOpenDialog을 사용하고 싶습니다. 언급 한 모든 작업을 명확하게 지원해야합니다.

+0

나는이 인터페이스 bu 세부 사항에 모호하다. 훌륭한 기사처럼 보입니다! 나는이 방법을 시도 할 것이다. 고맙습니다! – Mordachai

+0

불행히도 IFileOpenDialog는 최소한 문서화 된 방식으로 쉘 뷰 객체에 대한 직접 액세스를 제공하지 못합니다. 나는 누군가가 당신이 IShellView에 도착하기 위해 사용할 수있는 IFileOpenDialog에서 IShellBrowser 인터페이스를 쿼리 할 것을 제안했다. 이것은 꽤 좋았습니다. 그리고이 질문에 대해 내가 선택한 대답보다 더 나빴습니다. – Mordachai

+0

하지만 궁극적으로 우리의 Open Dialog 버전에도 다른 사용자 지정 컨트롤을 추가 할 수 있어야합니다. IFileDialog 인터페이스는 사용자가 직접 컨트롤을 추가 할 수있는 권한을 부여하지 못합니다. 푸시 버튼 및 라디오 버튼과 같은 -하지만 사용자 정의 컨트롤 없음). 궁극적 인 목적을 위해 IFileDialog는 궁극적 인 막 다른 골목입니다. (기술적으로, 셸을 확장하여 사용자 지정 파일을 미리 보는 방법을 알아 내면이 방법을 사용할 수 있습니다). – Mordachai

1

나는 이것이 오래된 스레드이지만 Vista +에서는 이전 스타일의 대화 상자가 여전히 지원된다는 것을 알고 있습니다. Vista 스타일을 해제하고 모든 사용자 정의 컨트롤을 그대로 유지할 수 있습니다. 그게 우리가하는 일입니다. 우리는 CFileDialog에 훅 된 템플릿에 커스텀 미리보기 창을 가지고 있습니다. 이것은 IFileDialog에서 재현하는 것이 불가능한 것으로 보입니다.

Vista 스타일 대화 상자를 사용하지 않으려면 생성자의 BOOL 매개 변수에 FALSE를 전달해야한다고 생각합니다.

관련 문제