Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

Вопросы по 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.033 c
1-1106934258
novice_man
2005-01-28 20:44
2005.02.13
DLL и динамическая загрузка.


1-1106842792
gonzales
2005-01-27 19:19
2005.02.13
Печать со 100% масштабом


1-1107241090
aleks-ran
2005-02-01 09:58
2005.02.13
Древовидные структуры


6-1101747637
alexa
2004-11-29 20:00
2005.02.13
icmp-пакеты


10-1083227214
Господин Уэф!
2004-04-29 12:26
2005.02.13
Как выставить окно Excel "всегда наверху"?