|
김병은 님이 쓰신 글 :
: 1.자료실에 있는 BrowserFolder 컴포넌트를 다이얼로그로 사용하는것 말구
: Panel이나 Form에 넣는 방법은 없습니까?
:
: 2.자료실이나 팁을 찾아보아두 TreeView에 관한 내용은 하나 없더군요..
: TreeView에 관한 자료나, 팁을 부탁드립니다.
:
: 3.C++Builder5.0에 있는 VirtualListView라는 예제는 내 컴퓨터(My Computer)
: 부터 나오게 되어있는데 이것을 바탕 화면(DeskTop)부터 나오게 할수 있는 방법이
: 없을까요...?
: 아래는 예제에서 발췌한 부분인데요.
: Help에 보니깐 SHGetSpecialFolderLocation에서 2번째 파라미터를 CSIDL_DRIVES 가 아닌
: CSIDL_DESKTOP으로 바꾸면 바탕화면(DESKTOP)부터 나온다구 되어있는데...
: 바꾸어 보니깐 에러가 나더라구요..
: ========================================================================
: OleCheck(SHGetSpecialFolderLocation(Application->Handle, CSIDL_DRIVES,
: &NewPIDL));
:
: =========================================================================
:
: 제발 TreeView에 대한 예제 하나만이라두 부탁드립니다.
:
: 감사합니다.
임펠리테리입니다.
다음부터는 여러개의 질문은 하나씩 나누어 질문하시고 적절한 제목을 달아 주세요. Q/A 게시판은 그 자체로서도 중요한 자료의 데이터베이스가 되니까요.
첫번째 질문.
BrowserFolder 컴퍼넌트는 컴퍼넌트로 되어 있고 다이얼로그로 나와 있어서 곤란하고, 폼에 배치할 수 있는 컨트롤 형태가 필요하다는 말씀이시죠? 제가 사용하고 있는 다른 공개 컴퍼넌트가 있으므로 올려드리겠습니다.
두번째 질문.
리스트뷰도 상당히 복잡하지만, 트리뷰는 더욱 복잡하지요. 그런데 활용도면에서는 리스트뷰만큼 많이 쓰이지는 않아서 아마도 그에 관련한 자료가 많이 나와있지 않습니다. 신경쓰도록 하겠습니다.
세번째 질문.
문제는 SHGetSpecialFolderLocation() 함수에 있는 것이 아니라 그 아래에 구현되어 있는 SetPath() 함수 내에 있습니다. 그 함수의 바디를 보시면 폴더의 IShellFolder 객체를 얻어내기 위해 IShellFolder::BindToObject() 함수를 사용했는데, MSDN에서 이 함수의 헬프를 찾아보면 다음과 같이 짤막히 설명되어 있죠.
Retrieves an IShellFolder object for a subfolder.
이게 중요합니다. 서브폴더라고 되어있죠? IShellFolder::BindToObject() 함수는 현재 IShellFolder가 지정하고 있는 폴더의 서브폴더의 IShellFolder 객체를 알아내는 함수란 겁니다. 그런데 위쪽의 초기화부분 소스를 보시면 아시겠지만, 여기서 IShellFolder의 인스턴스는 FIDesktopFolder로서, 이미 바탕화면(데스크탑) 폴더로 지정되어있습니다.
결과적으로 바탕화면의 서브폴더중에서 바탕화면을 찾고 있는 셈이죠. 다시 말해서, 아까 말했듯이 BindToObject() 함수는 특정 폴더의 서브폴더를 얻는 함수이므로 이 함수로는 바탕화면 폴더를 찾아낼 수가 없고, 루트인 데스크탑 폴더 인터페이스를 얻어내는 함수인 SHGetDesktopFolder() 함수를 써야 합니다. 물론 소스 위쪽의 FIDesktopFolder 객체 초기화 부분을 보면 바로 이 SHGetDesktopFolder() 함수를 이용해서 데스크탑폴더의 인터페이스를 얻어낸 것을 볼 수 있습니다.
썰이 좀 길었는데, 결과적으로 간단히 말해서, 데스크탑폴더를 열고 싶다면 SetPath() 함수의 내에서 원래의 코드인 다음 라인을,
OleCheck(FIDesktopFolder->BindToObject(ID, NULL, IID_IShellFolder, (void **)&NewShellFolder));
다음 라인으로 바꿔주면 됩니다.
NewShellFolder = FIDesktopFolder;
그럼 참고하시길...
|