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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2016, 15:17   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию Диалог выбора файла

Вот смотрю пример из книги по работе с диалогом.

смущает эта строка (скрин).

тут автор устанавливает поле hInstance значением которое в коде нигде не

фигурировало. в описании на OPENFILENAME нечего не сказано что оно должно быть установлено вручную.

есть догадка что там должно быть так

Код:
file.hwndOwner = hWnd;
верно ?
Изображения
Тип файла: jpg Безымянный.JPG (53.0 Кб, 47 просмотров)
RAFA91 вне форума Ответить с цитированием
Старый 21.03.2016, 15:26   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
тут автор устанавливает поле hInstance значением которое в коде нигде не
фигурировало
А вы параметры посмотрите у текущей функции или глобальные переменные.

Цитата:
в описании на OPENFILENAME нечего не сказано что оно должно быть установлено вручную.
Да ну
Цитата:
hInstance
Type: HINSTANCE
If the OFN_ENABLETEMPLATEHANDLE flag is set in the Flags member, hInstance is a handle to a memory object containing a dialog box template. If the OFN_ENABLETEMPLATE flag is set, hInstance is a handle to a module that contains a dialog box template named by the lpTemplateName member. If neither flag is set, this member is ignored. If the OFN_EXPLORER flag is set, the system uses the specified template to create a dialog box that is a child of the default Explorer-style dialog box. If the OFN_EXPLORER flag is not set, the system uses the template to create an old-style dialog box that replaces the default dialog box.
Цитата:
есть догадка что там должно быть так
Нет. Они для разных целей, они разного типа.
p51x на форуме Ответить с цитированием
Старый 21.03.2016, 15:34   #3
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

вот полный листинг

Код:
// Листинг 2.1. Просмотрщик файлов с диалогом выбора имени

#include <commdlg.h>
#include <fstream>
#include <vector>
#include <string>
const int LineHeight = 16;//Высота строки текста + межстрочное расстояние

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId;
	PAINTSTRUCT ps;
	HDC hdc;
	static TCHAR name[256] = _T("");;
	static OPENFILENAME file;
	std::ifstream in;
	std::ofstream out;
	static std::vector<std::string> v;
	std::vector<std::string>::iterator it;
	std::string st;
	int y;
	switch (message)
	{
	case WM_CREATE:
		file.lStructSize = sizeof(OPENFILENAME);
        file.hInstance = hInst;
		file.lpstrFilter = _T("Text\0*.txt");
		file.lpstrFile = name;
		file.nMaxFile = 256;
		file.lpstrInitialDir = _T(".\\");
		file.lpstrDefExt = _T("txt");
        break;
	case WM_COMMAND:
        wmId    = LOWORD(wParam);
		switch (wmId)
		{
		  case ID_FILE_NEW :
			if (!v.empty()) std::vector<std::string>().swap(v);
			InvalidateRect(hWnd, NULL, TRUE);
			break;
		  case ID_FILE_OPEN :
			  file.lpstrTitle = _T("Открыть файл для чтения");
			  file.Flags = OFN_HIDEREADONLY;
			  if (!GetOpenFileName(&file)) return 1;
			  in.open(name);
			  while (getline(in,st)) v.push_back(st);
			  in.close();
			  InvalidateRect(hWnd,NULL,1);
			  break;
		  case ID_FILE_SAVE :
			  file.lpstrTitle = _T("Открыть файл для записи");
			  file.Flags = OFN_NOTESTFILECREATE;
			  if (!GetSaveFileName(&file)) return 1;
			  out.open(name);
			  for (it = v.begin(); it != v.end(); ++it) out << *it << '\n';
			  out.close();
			  break;
		  case IDM_EXIT: DestroyWindow(hWnd); break;
          default: return DefWindowProc(hWnd, message, wParam, lParam);
	      }
		  break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		   for (y = 0, it = v.begin(); it < v.end(); ++it, y += LineHeight)
			   TextOutA(hdc, 0, y, it->data(), it->length());
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY: PostQuitMessage(0); break;
	default: return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
hInst; нигде нету

создание окна происходит по стандартному шаблону, поэтому не приводится
Цитата:
Сообщение от p51x Посмотреть сообщение

Да ну
там вообще то идет речь про установку флага который лежит вообще в другой переменной

Последний раз редактировалось RAFA91; 21.03.2016 в 15:38.
RAFA91 вне форума Ответить с цитированием
Старый 21.03.2016, 15:43   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
hInst; нигде нету
Ну значит баг копипаста

Цитата:
там вообще то идет речь про установку флага который лежит вообще в другой переменной
Нет, читайте внимательно. Там идет речь о том, что в другой переменной могут быть установлены флаги, которые повлияют на то, как это поле будет трактоваться.
p51x на форуме Ответить с цитированием
Старый 21.03.2016, 15:47   #5
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Нет, читайте внимательно. .
хорошо как получить этот дескриптор приложения , что-бы не гадать ?

там кстати часть полей заполняет ОС.

еще раз повторюсь точно там не
Код:
file.hwndOwner = hWnd;
,

а то опять придется лезть на другие форумы (((
RAFA91 вне форума Ответить с цитированием
Старый 21.03.2016, 15:50   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
поле hInstance
Цитата:
должно быть так
совсем иное поле.

hInst обычно ставят глобальной переменной инициализируемой из WinMain.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.03.2016, 15:57   #7
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
совсем иное поле.
какие поля нужно заполнять вручную ?
RAFA91 вне форума Ответить с цитированием
Старый 21.03.2016, 16:40   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Зависит от того, что вы хотите и какие флаги поставите - читайте описание полей. Размер точно заполняется.
p51x на форуме Ответить с цитированием
Старый 21.03.2016, 16:55   #9
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Размер точно заполняется.


понятное дело что надо заполнить

1. file.lStructSize = sizeof(OPENFILENAME);

2. file.lpstrTitle = _T("Открыть файл для чтения");

3. file.lpstrFile = name;

4. file.nMaxFile = 256;

5. file.lpstrDefExt = _T("txt");

6. file.Flags = OFN_HIDEREADONLY;


кстати строка file.lpstrInitialDir = _T(".\\"); верно указана, или надо так

file.lpstrInitialDir = _T("C:\\");
RAFA91 вне форума Ответить с цитированием
Старый 21.03.2016, 17:00   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ну если вам нужна не текущая, а C:\ то меняйте
p51x на форуме Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
диалог выбора файла с консоли nastya25 Qt и кроссплатформенное программирование С/С++ 1 01.04.2015 17:16
Диалог выбора файлов БалаШагаЛ Win Api 1 21.12.2011 20:39
Как отобразить модально диалог выбора файла GetOpenFileName? bigcrush Win Api 3 13.05.2009 16:03
Диалог выбора каталога AlexeyLed Общие вопросы C/C++ 0 15.03.2009 14:16
Диалог выбора папки delphin100 Общие вопросы Delphi 2 01.06.2008 22:43