Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Вниз

Вопросы по SHBrowseForFolder   Найти похожие ветки 

 
rolex   (2005-01-29 20:58) [0]

К примеру, как сделать, чтобы окошко вылезало не где-попало, а в определённой позиции? И ещё, как сделать, чтобы нельзя было выделить CD-приводы?
А использую я эту функцию вот так:
var
 lpItemID : PItemIDList;
 BrowseInfo : TBrowseInfo;
 TempPath : array[0..MAX_PATH] of char;
begin
 FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
 BrowseInfo.hwndOwner := Form1.Handle;
 BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
 lpItemID := SHBrowseForFolder(BrowseInfo);
 if lpItemId <> nil then
 begin
   SHGetPathFromIDList(lpItemID, TempPath);
   ListBox1.Items.Add(TempPath);
   GlobalFreePtr(lpItemID);
 end else ShowMessage("Пусто!");
end;


 
a.denisov   (2005-01-30 01:50) [1]

Суть в обработке сообщений диалога в функции обратного вызова BrowseCallbackProc.
Для этого, перед вызовом SHBrowseForFolder установить указатель lpfn на такую функцию:

 BrowseInfo.lpfn := BrowseCallbackProc;
 lpItemID := SHBrowseForFolder(BrowseInfo);

И, функция, собственной персоной:

function BrowseCallbackProc(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall;
var
 buf               : array[0..MAX_PATH] of char;
begin
 Result := 0;
 case uMsg of
   BFFM_SELCHANGED: begin
       if (lParam <> 0) and SHGetPathFromIDList(PItemIDList(lParam), @buf) then
         if GetDriveType(PChar(@buf)) = DRIVE_CDROM then
           SendMessage(Wnd, BFFM_ENABLEOK, 0, 0)
         else
           SendMessage(Wnd, BFFM_ENABLEOK, 0, 1);
     end;
   BFFM_INITIALIZED:
     SetWindowPos(Wnd, HWND_TOP,
       Form1.Left, Form1.Top, 0, 0, SWP_NOSIZE or SWP_SHOWWINDOW);
 end;
end;


 
a.denisov   (2005-01-30 02:31) [2]

Или, например, более кардинальное средство. Функция обратного вызова просто удаляет ненужные папки или диски:

{$DEFINE DELETE_UNNECESSARY}

function BrowseCallbackProc(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall;
var
 buf               : array[0..MAX_PATH] of char;
 DriveType         : UINT;
{$IFDEF DELETE_UNNECESSARY}
 T                 : THandle;
 H                 : HTREEITEM;
 Item              : TTVItem;

 procedure EnumTreeViewItems;
 begin
   T := FindWindowEx(Wnd, 0, WC_TREEVIEW, nil);
   if T <> 0 then begin
     H := TreeView_GetFirstVisible(T);
     H := TreeView_GetChild(T, H);
     repeat
       FillChar(Item, SizeOf(Item), 0);
       Item.hItem := H;
       Item.mask := TVIF_HANDLE;
       if TreeView_GetItem(T, Item) then
         TreeView_Select(T, H, TVGN_CARET);
       H := TreeView_GetNextSibling(T, H);
     until not Assigned(H);
   end;
 end;

 procedure DeleteTreeViewItem;
 begin
   T := FindWindowEx(Wnd, 0, WC_TREEVIEW, nil);
   if T <> 0 then begin
     H := TreeView_GetSelection(T);
     TreeView_DeleteItem(T, H)
   end;
 end;

{$ENDIF}

begin
 Result := 0;
 case uMsg of
   BFFM_SELCHANGED: begin
       if (lParam <> 0) and SHGetPathFromIDList(PItemIDList(lParam), @buf) then begin
         DriveType := GetDriveType(PChar(@buf));
         if DriveType = DRIVE_CDROM then
{$IFDEF DELETE_UNNECESSARY}
           DeleteTreeViewItem;
{$ELSE}begin
           SendMessage(Wnd, BFFM_ENABLEOK, 0, 0);
         end
         else
           SendMessage(Wnd, BFFM_ENABLEOK, 0, 1);
{$ENDIF}
       end;
     end;
   BFFM_INITIALIZED: begin
{$IFDEF DELETE_UNNECESSARY}
       EnumTreeViewItems;
{$ENDIF}
       SetWindowPos(Wnd, HWND_TOP,
         Form1.Left, Form1.Top, 0, 0, SWP_NOSIZE or SWP_SHOWWINDOW);
     end;
 end;
end;

Одно но: Дескриптор дерева в случае установки стиля диалога BIF_NEWDIALOGSTYLE придется искать внутри встроенного диалога с дескиптором GetDlgItem(Wnd,100) и именем класса "SHBrowseForFolder ShellNameSpace Control"


 
a.denisov   (2005-01-30 02:45) [3]

Хотя, в обоих сл-ях функци могут быть доработаны, например,после строки:
     until not Assigned(H);
неплохо смотрится:
     TreeView_Select(T, TreeView_GetFirstVisible(T), TVGN_CARET);


 
rolex   (2005-01-30 12:30) [4]

Спасибо вам, a.denisov, огромное! Очень помогли!


 
a.denisov   (2005-01-30 13:06) [5]

Не за что, как я говорил, в частном сл-е все работает хорошо. До тех пор, пока не изменится внутренняя реализация SHBrowseForFolder:)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.042 c
1-1107178538
Fonda
2005-01-31 16:35
2005.02.13
Сортировка в Excel


14-1106224865
Anonimus
2005-01-20 15:41
2005.02.13
Выделенка на Вынь2к


11-1090659893
Batoon
2004-07-24 13:04
2005.02.13
tclientsocket и tserversocket


6-1099675291
tati
2004-11-05 20:21
2005.02.13
Xp, 98 и Server2003


14-1106362768
Поручик
2005-01-22 05:59
2005.02.13
Миранда





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский