psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2010-02-03 07:16 pm

Выбор каталога

В виндах есть диалог для выбора каталога SHBrowseForFolder. В работе сие позорище выглядит так:



Не буду объяснять, насколько оно неудобно - если разок столкнетесь, то поймете на опыте.

Вместо этого хотелось бы иметь диалог, подобный тем, что дают функции GetSaveFileName/GetOpenFileName. Что-то в таком роде:



Осталось понять, как этого добиться - ведь те функции позволяют выбрать файл, а не фолдер. Под катом решение, опробованное на работоспособность под Win XP и Win 7. Можно прямо копипастить.


//ага, просто static, без выпендрежа
static WNDPROC wProcBase;
static char getFolderNameResult[_MAX_PATH];

//функция для субклассинга
LRESULT CALLBACK wProcNew(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDOK) 
	{
                //сохраняем путь в lpstrFile и выходим
		SendMessage(hwnd, CDM_GETFILEPATH, _MAX_PATH, (LPARAM)getFolderNameResult);

                //здесь можно проверить getFolderNameResult если надо чтобы это был существующий каталог, например так:
   	        struct _stat buffer;
                if (0 == _stat(fname, &buffer) && 0 != (buffer.st_mode & _S_IFDIR))
      		    EndDialog(hwnd, IDOK);
		return 0;
	}
        //вызов прежнего обработчика
	return CallWindowProc(wProcBase, hwnd, msg, wParam, lParam);
}

//Hook-функция для диалога
static UINT_PTR CALLBACK OFNHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
	if (uiMsg == WM_INITDIALOG)
	{
                //hdlg - это не сам диалог, а его child, так что на шаг вверх
		HWND par= (HWND)GetWindowLong(hdlg, GWL_HWNDPARENT);
                //субклассинг
		wProcBase= (WNDPROC)GetWindowLong(par, GWL_WNDPROC);
		SetWindowLong(par, GWL_WNDPROC, (LONG)wProcNew);
                //скрываем лишние контролы, на некоторых меняем надпейси
		SendMessage(par, CDM_HIDECONTROL, cmb1, NULL);
		SendMessage(par, CDM_HIDECONTROL, stc2, NULL);
		SendMessage(par, CDM_SETCONTROLTEXT, stc3, (LPARAM)"Folder:");
		SendMessage(par, CDM_SETCONTROLTEXT, IDOK, (LPARAM)"Accept");
		SendMessage(par, CDM_SETCONTROLTEXT, stc4, (LPARAM)"In folder:");
		return 0;
	}
	return 0;
}

//на входе надо заполнить ofn так, как будто хотим сохранить файл
//в каталоге. на выходе результат будет в ofn->lpstrFile.
int GetFolderName(OPENFILENAME *ofn)
{
    ofn->Flags|= OFN_EXPLORER|OFN_ENABLEHOOK;
    ofn->lpfnHook= OFNHookProc;
    ofn->lpstrCustomFilter= NULL;
    ofn->nFilterIndex= 0;
    ofn->lpstrFilter= " \0:\0\0"; //фильтр, который гарантирует показ только каталогов, но не файлов
    ofn->lpstrTitle= "Select Folder...";
    int r= GetSaveFileName(ofn);
    strcpy(ofn->lpstrFile, getFolderNameResult);
    ofn->nFileOffset= (WORD)strlen(getFolderNameResult);
    return r;
}


[identity profile] psilogic.livejournal.com 2010-02-03 07:59 pm (UTC)(link)
Ну Windows 7 ничего так. Хотя тот диалог остался убогим и под семеркой :)

[identity profile] leo-sosnine.livejournal.com 2010-02-03 08:22 pm (UTC)(link)
Да та же Виста, ничё почти к лучшему не поменялось.

Наглядный пример, кстати, насколько народный опинион зависит от рекламной шумихи. Типа, Виста была отстоем, а семёрка неплоха. Но это бред, семёрка это та же Виста с другим скином.

[identity profile] psilogic.livejournal.com 2010-02-03 08:28 pm (UTC)(link)
висту тоже нехило рекламировали
просто ко времени выхода семерки в ней пофиксили баги :)

[identity profile] leo-sosnine.livejournal.com 2010-02-03 08:49 pm (UTC)(link)
Их не надо было создавать, для начала. Я не понимаю, куда они прут. Сделал хорошую ОС -- молодец. Развивай направление, привязывай клиента. Нет, не буу. Всё перебуроблю. Были песочные часы -- получите кольцо. Были документс энд сеттингс (а ещё до этого профайлс) получите усерс. И так далее до бесконечности. Нахрена менять шило на мыло? Для админа это один непрекращающийся головняк, особенно если машины с разными осями.

Неясно зачем убирать удачные решения. Типа кнопки "вверх". Или запуск из-под любого юзера по правой кнопке.

По логике, каждая последующая ос должна те же самые функции выполнять лучше и быстрее. Но куда там. Допустим, вот, терминальные сервисы в 2003 работают побыстрее, чем в 2000. Но что Виста, что семёрка, пользы почти нет, а памяти жрут и тормозят на порядок круче предыдущих. Спрашивается, а нахрена.

Простым людям этот отстой проталкивают в горло грязным ботинком. Типа, ноутбучок захотел? Тока с Вистой (или семёркой). Захотел снести и поставить экспишку? А хрен тебе дров.

А бизнесы, которые слушают относительно вменяемых онолитегов, на 80% проигнорили Висту, и семёрку, возможно, будут игнорить на схожий процент. И правильно сделают, ИМХО.

Потому как бабло. Расходы на внедрение есть. Прибытка от повышения эффективности работы сотрудников нет. Так нахера?

Вот и ставят её тока партнёры Майкрософт, т.к. через шантаж. Да и то не все. Интел послал их, например, с этими дурацкими приколами...

[identity profile] psilogic.livejournal.com 2010-02-03 09:51 pm (UTC)(link)
а чо за "кнопка вверх?"

шо касается эффективности, то дома я работаю под триальной семеркой - т.к. есть выбор
красивая она сцука, завораживает :) и вполне удобная - чего только стоит железно срабатывающий из под всяких висяков alt-ctrl-del

[identity profile] gaussrifle.livejournal.com 2010-02-06 08:04 am (UTC)(link)
все дело в деньгах.

Майкрософт имеет бабло не только с продаж ОС но и с обучения и с подтверждения знаний(сертификат) админа.

Чем больше продуктов - тем больше вам-админам придется платить деньги за обучение и сдачу экзаменов.

Байка откуда берутс баги:
Мой папа - железнодорожник и он рассказывал, что в советское время было несколько НИИ для нужд ЖД. Они там разрабатывали всякие приспособления, в том числе башмак(клин) для подкладки его под колесо поезда при необходимости стояночной фиксации.
Так вот, для всех этих НИИ был предусмотрен план постоянного повышения эфективности. Но как это выполнить? Так что делали: Заранеее запроектировали башмак гиганствкого размера. И каждый год делали его на 100 граммов легче. В масштабах страны- это гигантская экономия материала, но почему-бы сразу не запроектировать его без ошибок-нужного размера?
А есть то на что? А премии?

А другие люди потом на местах получали преммии за изобретельство-рационализаторство - ведь можно спилить лишний вес и насверлить в нем дырок - тем самыс облегчить работу путейцев, которые таскают их вручную.

Так же и майкрософт - будучи монополистом заранее делают необходимые ошибки, чтобы иметь работу и потом их исправлять.

[identity profile] leo-sosnine.livejournal.com 2010-02-06 08:15 am (UTC)(link)
Хорошая байка, может они действительно поэтому всё постоянно меняют, а админы с каждой, буквально с каждой новой версией продукта мучаются.

А что касается сертификации админов, то выходит, что такие админы дураки, потому как их обувают, а они и рады. Значит, выходит, что и я дурак.

Как дальше жить?

[identity profile] leo-sosnine.livejournal.com 2010-02-06 08:19 am (UTC)(link)
Кстати, как-то проходил второй фоллаут с гаусс райфлом. Высокая перцепция давала высокий сиквенс, начинал всегда первым и следующий ход был за мной. Максимальный аджилити позволял стрелять из гаусс райфла два раза за ход прицельно.

Итого: встреча с энклэйв патролом, первые два хода мои, к началу действий энклэйв патрола четверо из них уже отправились в верхний вэйстланд...

[identity profile] gaussrifle.livejournal.com 2010-02-06 09:40 am (UTC)(link)
А со мной еще Кесседи был и тоже с гаусовкой. Жалко на метерикое к гауссовке патронов всего 50 было у двух охранников великого дракона и добыча этих 50-ти патронов стоила жизни всему китайскому населению Сан-Франциско :)

[identity profile] leo-sosnine.livejournal.com 2010-02-06 10:00 am (UTC)(link)
Кэссиди не стоит давать гауссовку из-за нехватки патронов. Маловато хитов он из неё вышибает, тока патроны переводить. Вообще, следует признать, что во втором фоллауте если играть боевым персонажем, то команда только мешает. Лезут на амбразуры, постоянно попадают под очередь из минигана, дамэйдж выдают просто никакой по сравнению с прокаченным персом.

Патроны для гауссовки продаёт верхний продавец в сан-фране у входа, правда, у него обновляются они редко, приходится ждать.

[identity profile] gaussrifle.livejournal.com 2010-02-06 11:11 am (UTC)(link)
Спасибо! Жаль я не знал этого 12 лет назад.

[identity profile] psilogic.livejournal.com 2010-02-06 10:15 am (UTC)(link)
чо та из второго фаллаута запомнились тока муравьи, плюющаяся колючками трава и взорванный туалет =)

[identity profile] gaussrifle.livejournal.com 2010-02-06 11:12 am (UTC)(link)
взорваный туалет это да!

А ты могилы выкапивал?

[identity profile] psilogic.livejournal.com 2010-02-06 11:20 am (UTC)(link)
че та не помню такого...