Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2011, 20:13   #1
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию Как выбрать рабочий каталог?

Please, help me! Как выбрать рабочий каталог? Необходимо иметь пункт-команду "Выбрать". Пока есть только пункт-команда "Открыть", который даёт возможность получить путь к файлу в переменной структуры ofn (ofn.lpstrFile). При нажатии на пункт-команду "Выбрать" и выбора папки нужно получить путь к выбранному каталогу в блоке "case IDM_SELECT:" (см. "SelectWorkFolder.cpp" ниже). Есть ли функция, наподобие "GetOpenFileName()" для получения пути к выбранному каталогу? Есть ли стандартный диалог, наподобие диалога "Открыть"?

SelectWorkFolder.cpp

Код:
//////////////////////////////////////////////////////////////////////
// SelectWorkFolder.cpp
#include <windows.h>
#include <stdio.h>
#include "KWnd.h"
#include "resource.h"

#define ESC_OF "Отказ от выбора или ошибка выполнения функции "

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//==================================================================== 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	MSG msg;
	KWnd mainWnd("SelectWorkFolder", hInstance, nCmdShow, WndProc,
		MAKEINTRESOURCE(IDR_MENU1), 100, 100, 400, 300);	

	while (GetMessage(&msg, NULL, 0, 0))  {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

//==================================================================== 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	BOOL success;

        // Переменные для стандартных диалогов "Open", "Save as"
	static OPENFILENAME ofn;
	static char szFile[MAX_PATH];

	switch (uMsg)
	{
	case WM_CREATE:
		// Инициализация структуры ofn
		ofn.lStructSize = sizeof(OPENFILENAME);
		ofn.hwndOwner = hWnd;
		ofn.lpstrFile = szFile;
		ofn.nMaxFile = sizeof(szFile);
		break;

	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDM_OPEN:	
			strcpy(szFile, "");
			success = GetOpenFileName(&ofn);
			if (success)
				MessageBox(hWnd, ofn.lpstrFile, "Открывается файл:", MB_OK);
			else
				MessageBox(hWnd, ESC_OF"GetOpenFileName",
				"Отказ от выбора или ошибка", MB_ICONWARNING);
			break;

                // Блок в котором нужен путь к каталогу
		case IDM_SELECT:
                        MessageBox(hWnd, "Здесь хотелось бы путь к файлу", "Выбирается каталог:", MB_OK);
			break;

		case IDM_EXIT:
			SendMessage(hWnd, WM_DESTROY, 0, 0);
			break;

		default:
			break;
                }
		break;

        case WM_DESTROY:
		PostQuitMessage(0);
		break;

	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
   }

	return 0;
}
//////////////////////////////////////////////////////////////////////
Демонстрационный рабочий проект:
Вложения
Тип файла: rar SelectWorkFolder.rar (1.50 Мб, 31 просмотров)

Последний раз редактировалось 8Observer8; 31.01.2011 в 20:18.
8Observer8 вне форума Ответить с цитированием
Старый 01.02.2011, 00:23   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

функции из shell32.dll

Цитата:
Displays a dialog box that enables the user to select a shell folder.

WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder(

LPBROWSEINFO lpbi
);


Parameters

lpbi

Pointer to a BROWSEINFO structure that contains information used to display the dialog box.
Пример на великом и ужасном.
Код:
BrowseForFolder proc uses ebx edi esi, hWndEXT:DWORD, IDPrevDir:DWORD, pBufferOUT:DWORD, pString:DWORD

	LOCAL	pIDListLOC:DWORD
	LOCAL	brinf:BROWSEINFO

	mov	eax, [hWndEXT]
	mov	[brinf.hwndOwner], eax
	mov	eax, [IDPrevDir]
	mov	[brinf.pidlRoot], eax
	mov	[brinf.pszDisplayName], 0
	mov	eax, [pString]
	mov	[brinf.lpszTitle], eax
	mov	[brinf.ulFlags], BIF_RETURNONLYFSDIRS or BIF_DONTGOBELOWDOMAIN
	mov	[brinf.lpfn], 0
	mov	[brinf.lParam], 0
	mov	[brinf.iImage], 0

	invoke	SHBrowseForFolder, addr [brinf]
	mov	[pIDListLOC], eax
	push	eax
	cmp	eax, 0
	je	BrowseForFolderRet
	invoke	SHGetPathFromIDList, [pIDListLOC], [pBufferOUT]
BrowseForFolderRet:
	invoke	CoTaskMemFree, [pIDListLOC]
	pop	eax
	ret
BrowseForFolder endp
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 01.02.2011, 07:07   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Благодарю! Это то, что надо! За пример тоже, спасибо. Но, думаю, на эту ступень мне ещё рановато карабкаться. Я на данной себя неуверенно чувствую. Хотя "Пятнашки" я скачал буду потихоньку разбираться.

Пример взят отсюда:
http://www.rsdn.ru/?article/qna/ui/getfldr.xml

SelectWorkFolder.cpp
Код:
//////////////////////////////////////////////////////////////////////
// SelectWorkFolder.cpp
#include <windows.h>
#include <stdio.h>
#include "KWnd.h"
#include "resource.h"
#include <shlobj.h>
#pragma comment(lib,"shell32")

#define ESC_OF "Отказ от выбора или ошибка выполнения функции "

BOOL GetFolder(LPTSTR szPath);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//==================================================================== 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	MSG msg;
	KWnd mainWnd("SelectWorkFolder", hInstance, nCmdShow, WndProc,
		MAKEINTRESOURCE(IDR_MENU1), 100, 100, 400, 300);	

	while (GetMessage(&msg, NULL, 0, 0))  {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

//==================================================================== 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	BOOL success;
	BOOL folderSelected;

        // Переменные для стандартных диалогов "Open", "Save as"
	static OPENFILENAME ofn;
	static char szFile[MAX_PATH];
	static char szFolder[MAX_PATH];

	switch (uMsg)
	{
	case WM_CREATE:
		// Инициализация структуры ofn
		ofn.lStructSize = sizeof(OPENFILENAME);
		ofn.hwndOwner = hWnd;
		ofn.lpstrFile = szFile;
		ofn.nMaxFile = sizeof(szFile);
		break;

	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDM_OPEN:	
			strcpy(szFile, "");
			success = GetOpenFileName(&ofn);
			if (success)
				MessageBox(hWnd, ofn.lpstrFile, "Открывается файл:", MB_OK);
			else
				MessageBox(hWnd, ESC_OF"GetOpenFileName",
				"Отказ от выбора или ошибка", MB_ICONWARNING);
			break;

                // Блок в котором нужен путь к каталогу
		case IDM_SELECT:
			strcpy(szFolder, "");
			folderSelected = GetFolder(szFolder);
			if (folderSelected)
				MessageBox(hWnd, szFolder, "Выбирается каталог:", MB_OK);
			else
				MessageBox(hWnd, ESC_OF"GetFolder",
				"Отказ от выбора или ошибка", MB_ICONWARNING);
			break;

		case IDM_EXIT:
			SendMessage(hWnd, WM_DESTROY, 0, 0);
			break;

		default:
			break;
                }
		break;

        case WM_DESTROY:
		PostQuitMessage(0);
		break;

	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
   }

	return 0;
}
//////////////////////////////////////////////////////////////////////
BOOL GetFolder (LPTSTR szPath)
{
    szPath[0] = 0;
    bool result = false;
    
    LPMALLOC pMalloc;
    if (::SHGetMalloc(&pMalloc) == NOERROR) {
        BROWSEINFO bi;
        ::ZeroMemory(&bi,sizeof bi);
        bi.ulFlags = BIF_RETURNONLYFSDIRS;
        LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi);
        if (pidl != NULL) {
            if (::SHGetPathFromIDList(pidl,szPath))
                result = true;
            pMalloc->Free(pidl);
        }
        pMalloc->Release();
    }
    return result;
}

Последний раз редактировалось 8Observer8; 01.02.2011 в 07:11.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реестр, как найти каталог... igni Общие вопросы Delphi 3 17.05.2010 10:58
Как скопировать каталог primeplus Общие вопросы C/C++ 3 16.01.2010 23:57
Как создать новый каталог MixanMM Общие вопросы Delphi 6 16.11.2009 12:58
Как сделать электронный каталог продукции? natarius PHP 7 01.03.2009 21:55
Как обозначается корневой каталог программы? BeeX Свободное общение 1 25.11.2007 20:25