WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Кнопочка "Обзор"...

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Кнопочка "Обзор"...
Vovan опубликован 29-01-2002 15:58 MSK   Click Here to See the Profile for Vovan   Click Here to Email Vovan  
Как мне вывести стандартное окно "обзор", и что бы оно возвратило в программу путь к каталогу.
Извините за дурацкие вопросы, в MSDN всё написано, но у меня его нету, заодно посоветуйте где его взять, может он на дисках продаёться?
Заранее благодарен.
purpe опубликован 29-01-2002 16:28 MSK     Click Here to See the Profile for purpe  Click Here to Email purpe     
в разделе Delphi есть статейка:

http://www.sources.ru/delphi/delphi_browser_for_all.shtml

там внизу есть ссылочки:

http://msdn.microsoft.com/library/psdk/shellcc/shell/Functions/SHBrowseForFolder.htm

http://msdn.microsoft.com/library/psdk/shellcc/shell/Shell_basics/Folder_ID.htm

sergeyMJ опубликован 29-01-2002 16:30 MSK     Click Here to See the Profile for sergeyMJ  Click Here to Email sergeyMJ     
Я купил MSDN на горбушке за 600 руб (4 диска)
Раньше мне предлагали там же за 400 другие ребята
Muran опубликован 29-01-2002 16:47 MSK     Click Here to See the Profile for Muran  Click Here to Email Muran     
Вообще-то MSDN стоит 220р за 4 диска.
purpe опубликован 29-01-2002 16:54 MSK     Click Here to See the Profile for purpe  Click Here to Email purpe     
давайте не будем разводить демагогию по поводу ценообразования ...
Kresan опубликован 29-01-2002 17:20 MSK     Click Here to See the Profile for Kresan  Click Here to Email Kresan     
В модуле Builder 5.0 под названием FileCtrl.hpp есть функция SelectDirectory ( AnsiString Caption, WideString Root, AnsiString &SelectedDirectory ).
Вот и всё.
Drunkard опубликован 31-01-2002 04:40 MSK     Click Here to See the Profile for Drunkard  Click Here to Email Drunkard     
Долго базарить не буду. Я это на API в Borlande 5.0 делаю так:

Компиляцию под Borlandoм ведешь обязательно включив галочку OLE

#include <shlobj.h>

// Borland 5.0 ее не знает, поэтому я определяю
#define BIF_EDITBOX 0x0010

void Browse HWND,char*,int,UINT,int);//Виндовый диалог выбора папки

//Обьявляешь глобальной переменную
IMalloc *pMalloc;

В Main функции пишешь
{
HRESULT hRes;
//Здесь всякая своя хрень

CoInitialize(NULL);
hRes=CoGetMalloc(1,&pMalloc);
if(!SUCCEEDED(hRes)) {
MessageBox(hwnd,"Windows не выдала указатель на IMalloc.","",MB_SYSTEMMODAL|MB_OK);
CoUninitialize();
DestroyWindow(hwnd);
return 0;
};
// Здесь опять всякая хрень
}

// Создаешь свой диалог, в котором есть редактируемое поле, допустим его идентиф IDE_PAPKA
// В этом диалоге у тебя еще три кнопки 1) Browse, 2) ОК, 3) Cancel
// В процедуре диалога должны быть примерно такие строки

case WM_INITDIALOG:
SetDlgItemText(hwnd,IDE_PAPKA,"");

case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDB_BROWSE:
Browse(hwnd,"Выберите основную папку.",CSIDL_DRIVES,BIF_EDITBOX|BIF_RETURNONLYFSDIRS,IDE_PAPKA);
// Вот после этого вызова в редактируемом поле IDE_PAPKA у тебя появится путь к папке
return TRUE;
case IDCANCEL:
EndDialog(hwnd,TRUE);
return TRUE;
case IDOK:
GetWindowText(GetDlgItem(hwnd,IDE_PAPKA),StrPap,MAX_PATH-1);
//После этого путь будет сидеть в строке char StrPap[MAX_PATH]

// Стандартная функция придуманная не мною, а списанная с книжки :)))
void Browse(HWND hwnd,char* Title,int RootFolder,UINT Flag,int IdDialog)
{
static BROWSEINFO bi;
LPSTR lpBuffer;
LPITEMIDLIST pidlPrograms,pidlBrowse;

lpBuffer=(LPSTR)pMalloc->Alloc(MAX_PATH);
if(MAX_PATH!=pMalloc->GetSize(lpBuffer)) {
MessageBox(hwnd,"Затрудняюсь получить блок памяти.","",MB_SYSTEMMODAL | MB_OK);
return;
};
if(!SUCCEEDED(SHGetSpecialFolderLocation(hwnd,RootFolder,&pidlPrograms))) {
pMalloc->Free(lpBuffer);
MessageBox(hwnd,"Затрудняюсь обнаружить корневую папку.","",MB_SYSTEMMODAL | MB_OK);
return;
};
bi.hwndOwner=hwnd;
bi.pidlRoot=pidlPrograms;
bi.pszDisplayName=lpBuffer;
bi.lpszTitle=Title;
bi.ulFlags=Flag;
bi.lpfn=NULL;
bi.lParam=0;
pidlBrowse=SHBrowseForFolder(&bi);
if(pidlBrowse!=NULL) {
if(SHGetPathFromIDList(pidlBrowse,lpBuffer))
SetDlgItemText(hwnd,IdDialog,lpBuffer);
pMalloc->Free(lpBuffer);
}
else pMalloc->Free(lpBuffer);
}

Drunkard опубликован 31-01-2002 04:43 MSK     Click Here to See the Profile for Drunkard  Click Here to Email Drunkard     
void Browse ( HWND,char*,int,UINT,int);//Виндовый диалог выбора папки

Там куда-то подевалась открывающая скобка

ADK опубликован 31-01-2002 05:31 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
2Drunkard: так много кода для SHBrowseForFolder... Хе У меня больше 10 строк никак не выходило.
Drunkard опубликован 31-01-2002 10:48 MSK     Click Here to See the Profile for Drunkard  Click Here to Email Drunkard     
ADK< Покажи - поучусь. Только чур на API. :)
Drunkard опубликован 31-01-2002 15:39 MSK     Click Here to See the Profile for Drunkard  Click Here to Email Drunkard     
ADK< Жду 10 строк кода. :)
Если в стиле "Читай MSDN" ,то спасибо. Это в прогу не подошьешь.
У меня один знакомый тоже проги в 10 строк пишет. Да ты его знаешь, это Вася Пупкин. Он просто переводы строки в исходники не вставляет. :)
Хочу скопировать твой код и вставить в прогу и она заурчав мягко тронулась, а не запердела, дергаясь рывками и застучав клапанами. Хе.
SUnteXx опубликован 31-01-2002 23:44 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
2Dunkard:
Вот мой пример на Win32API!

char szWorkDir[MAX_PATH];

LPCITEMIDLIST lpItemDList;
BROWSEINFO bi =
{
hWnd,
NULL,
(LPSTR)szWorkDir,
"Please, choose the folder...",
BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_EDITBOX /*| BIF_STATUSTEXT */| BIF_BROWSEFORCOMPUTER,
BrowseCallbackProc, // У меня еще свой процесс для обработки некоторых мессаг, я в него (диалог) добавляю две кнопки:)
NULL,
0
};

if(!(lpItemDList=SHBrowseForFolder(&bi)))
{
.
.
.
return;
}

SHGetPathFromIDList(lpItemDList, szWorkDir);

6 строк:) Может что упустил, но суть ясна:)

Drunkard опубликован 01-02-2002 01:39 MSK     Click Here to See the Profile for Drunkard  Click Here to Email Drunkard     
SUnteXx< Привет. Не хочу лезть в бутылку, но куда мне сувать эти 6 строк?

Вопрос в чем? Парень попросил "как это сделать". MSDN у него нету и не знает где его взять. Я ему подробно от 0 до 100% расписал "как и что следует сделать на ВС 5.0". Он может просто скопировать код в свою прогу и запустить, и все ОК. Проверено. Сюда включены даже обработки ошибок и куда совать обращения к функциям и где получать результат. Надеюсь ты заметил отличие моего примера от твоего? Я его не подписал такими словами "Может что упустил, но суть ясна:)
" Вот именно, где у тебя указатель на интерфейс Imalloc оболочки? Пример функции Browse взят мной из "Руководства программиста по Microsoft Windows 95" изд. MicrosoftPress стр. 168. Может я его коряво переработал :)), но суть не в том. Суть в том, что за нормальный ответ получаешь какие-то усмешки за спиной типа "Хе". Зачем ADK залез в этот раздел? Чтобы покритиковать? Я тут крутой? MSDN прочел своими глазами :)) теперь пишу за 10 строк. Ну-Ну. (см. тему того же Vovana "Ламеры и пр.") Я считаю так: не привел своего кода, нечего лезть с вы@бонами типа "да у меня покруче". Можешь встрять в случае обнаружения ошибок. Кто видит в приведенном коде ошибку - пусть закидает меня дохлыми мониторами. А по мне, парень попросил - я ему отписал всё от корки до корки и это видно из текста. Не люблю я этот снобизм типа "читай MSDN". Вобщем пожалел даже, что ответ Vovanу послал - очень неприятное впечатление осталось от этого Хе.

GE опубликован 01-02-2002 02:37 MSK     Click Here to See the Profile for GE  Click Here to Email GE     
2Drunkard: "читай MSDN" - это не снобизм, замечание в адрес SUnteXx как раз результат того, что Вы не знакомы с MSDN.
Drunkard опубликован 01-02-2002 02:52 MSK     Click Here to See the Profile for Drunkard  Click Here to Email Drunkard     
GE< Вы что-то не допоняли. Вы имеете ввиду замечание "куда мне сувать эти шесть строк"?
Я правильно понял? Если да, то отвечу, что прекрасно знаю куда их вставить в программу. И это видно из ответа Vovanу. При ответе Vovanу как раз, я ему показал куда и как надо "сувать", т.к. у него нет MSDN. Обратите внимание на его вопрос. Так что кроме MSDN следует еще и внимательно читать вопросы и переписку.
Если же Вас лично задело "Читай MSDN", то я считаю, что это Вам на пользу :))
Форум все-таки на "исходниках", а не на "MSDNах":)). Или я не прав?

С SUnteXx-ом я не вступал ни в какую полемику, т.к. не вижу никакого отличия приведенного мной кода и его, кроме того что мной прописаны детали употребления этого кода, которые никак в мифические 10 строк не влезают.
Удачи.

ADK опубликован 01-02-2002 05:58 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
Во-первых, Druncard, не стоит всё так воспринимать, я вовсе не хотел тебя задеть.
Вот мой код. Кое-что добавил для полноты, но суть не меняется.

BROWSEINFO bi;
char foldername[MAX_PATH];
ZeroMemory(&bi,sizeof(bi));
bi.pszDisplayName=foldername;
bi.hwndOwner=hwnd;
bi.lpszTitle="Âûáåðèòå ïàïêó äëÿ óñòàíîâêè:";
bi.ulFlags=BIF_RETURNONLYFSDIRS;
LPITEMIDLIST lpid= SHBrowseForFolder(&bi);
if(!lpid) return FALSE;
IMalloc* pMalloc;
SHGetPathFromIDList(lpid,foldername);
SHGetMalloc(&pMalloc);
pMalloc->Free((void*) lpid);
pMalloc->Release();

Подключить:

#include <shellapi.h>
#include <shlobj.h>

ADK опубликован 01-02-2002 06:03 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
2Drunkard: Можешь бесконечно наезжать, что мой код неполный и непонятный, но по-моему, его достаточно. И комментов типа
// Здесь опять всякая хрень
нет.
ADK опубликован 01-02-2002 06:09 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
А от того, что твоя прога умеет выдавать ошибки типа "Затрудняюсь обнаружить корневую папку" никому легче не будет. Ещё раз извини, не считай наездом, ты первый начал.
SUnteXx опубликован 01-02-2002 12:21 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
2Drunkard & Vovan:
Сори, не заметил что без MSDN'a человек. Сори, не хотел! Но код, как вы могли видеть в приведенном коде ADK, не сильно меняется.

2Drunkard:
Наезды на меня не действуют:)
>Долго базарить не буду. Я это на API в Borlande 5.0 делаю так:
А я код писал для MVC++.

Если на то пошло, то может код выложить с добавлением еще 2 кнопок и обработкой строки пути к папке?

2ADK:
Согласен, зачем в данном случае наворачивать код, если, для начала, можно кинуть основу, а потом уже, если человека заинтересует, более подробно и глобально!

Vovan опубликован 01-02-2002 13:16 MSK     Click Here to See the Profile for Vovan  Click Here to Email Vovan     
Спасибо всем, но мне хотелось сделать на VC++ с MFC? но ладно!
ADK опубликован 01-02-2002 13:24 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
Так мы ж тебе на API дали!! Юзай!!

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.