Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517

Не корректно работает диалог открытия файла

16.03.2012, 20:54. Показов 1463. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
После открытия диалогового окна функция возвращает результат положительный
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    OPENFILENAME ofn;
    static char szFilter[] = "Text Files(*.TXT)\0*.txt\0\0";
    RECT rc;
 
    switch(iMsg)
    {
    case WM_CREATE:
        ZeroMemory(&ofn,sizeof(ofn));
 
        ofn.lStructSize = sizeof(OPENFILENAME);
        ofn.hwndOwner = hwnd;
        ofn.hInstance = NULL;
        ofn.lpstrFilter = szFilter;
        ofn.lpstrCustomFilter = NULL;
        ofn.nMaxCustFilter = 0;
        ofn.nFilterIndex = 0;
        ofn.lpstrFile = NULL; 
        ofn.nMaxFile = _MAX_PATH;
        ofn.lpstrFileTitle = NULL; 
        ofn.nMaxFileTitle = _MAX_FNAME + _MAX_EXT;
        ofn.lpstrInitialDir = NULL;
        ofn.lpstrTitle = NULL;
        ofn.Flags = 0;
        ofn.nFileOffset = 0;
        ofn.nFileExtension = 0;
        ofn.lpstrDefExt = "txt";
        ofn.lCustData = 0L;
        ofn.lpfnHook = NULL;
        ofn.lpTemplateName = NULL;
 
        if(!GetOpenFileName(&ofn))//не выполняется, GetOpenFileName говорит что всё хорошо у неё
            DestroyWindow(hwnd); 
        
        FILE *file;
        int iLength;
        PSTR pstrBuffer;
        //pFile=fopen(ofn.lpstrFile, "r");
        //if(!pFile)
            MessageBox(hwnd, ofn.lpstrFile,"Error",MB_OK); // Какого в lpstrFile NULL?
        return 0;
Полный код чтобы можно было его засунуть в vs в main
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <windows.h>
#include <stdio.h>
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
HINSTANCE instance;
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int iCmdShow)
{
    static char szAppName[]="ReadTextAndSwapWords";
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wndclass;
 
    instance=hInstance;
 
 
    ZeroMemory(&wndclass,sizeof(wndclass));
    wndclass.cbSize=sizeof(wndclass);
    wndclass.style=CS_HREDRAW|CS_VREDRAW;
    wndclass.lpfnWndProc=WndProc;
    wndclass.hInstance=hInstance;
    wndclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor=LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground=(HBRUSH) GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName=NULL;
    wndclass.lpszClassName=szAppName;
    wndclass.hIconSm=LoadIcon(NULL, IDI_APPLICATION);
 
    RegisterClassEx(&wndclass);
 
    hwnd=CreateWindow(szAppName, "Swap", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);
 
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    OPENFILENAME ofn;
    static char szFilter[] = "Text Files(*.TXT)\0*.txt\0\0";
    RECT rc;
 
    switch(iMsg)
    {
    case WM_CREATE:
        ZeroMemory(&ofn,sizeof(ofn));
 
        ofn.lStructSize = sizeof(OPENFILENAME);
        ofn.hwndOwner = hwnd;
        ofn.hInstance = NULL;
        ofn.lpstrFilter = szFilter;
        ofn.lpstrCustomFilter = NULL;
        ofn.nMaxCustFilter = 0;
        ofn.nFilterIndex = 0;
        ofn.lpstrFile = NULL; 
        ofn.nMaxFile = _MAX_PATH;
        ofn.lpstrFileTitle = NULL; 
        ofn.nMaxFileTitle = _MAX_FNAME + _MAX_EXT;
        ofn.lpstrInitialDir = NULL;
        ofn.lpstrTitle = NULL;
        ofn.Flags = 0;
        ofn.nFileOffset = 0;
        ofn.nFileExtension = 0;
        ofn.lpstrDefExt = "txt";
        ofn.lCustData = 0L;
        ofn.lpfnHook = NULL;
        ofn.lpTemplateName = NULL;
 
        if(!GetOpenFileName(&ofn))
            DestroyWindow(hwnd);
        
        FILE *file;
        int iLength;
        PSTR pstrBuffer;
        //pFile=fopen(ofn.lpstrFile, "r");
        //if(!pFile)
            MessageBox(hwnd, ofn.lpstrFile,"Error",MB_OK);
        return 0;
 
    case WM_PAINT:
        hdc=BeginPaint(hwnd, &ps);
        
        GetClientRect(hwnd, &rc);
        DrawText(hdc,ofn.lpstrFileTitle,strlen(ofn.lpstrFileTitle),&rc,DT_CENTER|DT_VCENTER);
 
        EndPaint(hwnd, &ps);
        return 0;
 
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
Это всего лишь набросок кода, проблема возникла на первом же шаге - шаге открытия файла.

Добавлено через 2 минуты
Тьфу, сам же вспомнил после того как создал тему что для этой тупой функции в структуре ещё и память же надо выделить под строчки, ато она сама же не в состоянии сделать столь сложную задачу ...

Добавлено через 4 минуты
Ладно, спрошу заодно тогда раз уж тему создал, всё равно вопрос будет касаться по открытию файлов:
я в начале хотел схитрить, получить путь к файлу через GetOpenFileName, а потом взять да и воспользоваться обычными файловыми потоками да строками string чтобы текст из файла тягать, но когда я дописал в начале include <fstream>, а в WM_CREATE начал писать что-то вроде
C++
1
2
std::ifstream file;
file>>temp;
То vs завопила что она отменяет все мои case в switch. Это с чего же такая самодеятельность?
Вот я например дописываю в WM_CREATE
C++
1
2
3
    case WM_CREATE:
 
        std::ifstream fffile;
И сразу же получаю ошибки
Code
1
2
3
4
5
6
Compiling...
main.cpp
C:\c++\VS PROJECTS\Temp\main.cpp(94) : error C2360: initialization of 'fffile' is skipped by 'case' label
        C:\c++\VS PROJECTS\Temp\main.cpp(59) : see declaration of 'fffile'
C:\c++\VS PROJECTS\Temp\main.cpp(103) : error C2360: initialization of 'fffile' is skipped by 'case' label
        C:\c++\VS PROJECTS\Temp\main.cpp(59) : see declaration of 'fffile'
Почему, где тут связь?

Добавлено через 1 минуту
Хотя вот если перенести вообще в WndProc этот мой std::ifstream то компилируется всё ок, это что же мне и временно файл открыть-закрыть нельзя по мнению vs?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.03.2012, 20:54
Ответы с готовыми решениями:

Самый простой способ создать диалог для открытия файла с диска?
Добрый день! Подскажите, пожалуйста, самый не трудозатратный способ создать что-то вроде этого? То есть вызвать диалог, который...

Не корректно работает гиперссылка для открытия файла в PhotoShop для редактирования
Всем доброго времени суток! Возникла проблемка с гиперссылкой в access. Дело в том, что при нажатии на нее мною подразумевалось...

Выбор исходного файла через диалог открытия файла и импорт его в БД акссес
Народ подскажите плиз ! =) вот задание : 1. выбор исходного файла через диалог открытия файла (лист 1.xls) 2.импорт содержимого файла ...

4
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
16.03.2012, 22:12
Gepar, тебе компилятор так и написал
Цитата Сообщение от Gepar Посмотреть сообщение
initialization of 'fffile' is skipped by 'case' label
- что объявил

Цитата Сообщение от Gepar Посмотреть сообщение
std::ifstream fffile;
в теле case - так нельзя поступать, вынеси
ifstream fffile; вначало WndProc а доступ к файлу в нужной точке получай с помощью fffile.open вот и вся беда
Цитата Сообщение от Gepar Посмотреть сообщение
FILE *file;
- аналогично вынеси в начало WndProc (до switch)


Не по теме:

PS:Почему не хочешь MFC попробовать???К примру диалог открытия там идёт как CFileDialog есть куча интересных ньюансов, облегчающих жизнь. Если тяжело можешь в нём смело просить у меня помощи. Код там проще, поверь человеку с 8-ми летним стажем работы, я не обманываю;)

1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
16.03.2012, 23:48  [ТС]

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Почему не хочешь MFC попробовать???
Почти дочитал второй том Петзолда, последнюю главу по OLE читаю и дальше планирую почитать что-то по MFC. Ты же помнишь что мне захотелось сначала ознакомиться с чистым WINAPI, не хотелось уже бросать тогда начатое. А с MFC я косвенно знаком с лент по дополнительным аспектам программирования так что я помню что там всё значительно проще за счёт того что базируется он уже не на си, а на с++.



Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- аналогично вынеси в начало WndProc (до switch)
Это я понял что если вынести то всё ок, я не понял чего оно мне указывает что делать, может я хочу при WM_CREATE открыть разок файл какой-то и больше не открывать его так нечего мне и вписывать его вначале WNDPROC, но VS видать другого мнения.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
17.03.2012, 00:08
Цитата Сообщение от Gepar Посмотреть сообщение
то я понял что если вынести то всё ок, я не понял чего оно мне указывает что делать, может я хочу при WM_CREATE открыть разок файл какой-то и больше не открывать его так нечего мне и вписывать его вначале WNDPROC, но VS видать другого мнения.
- вынеси свой код открытия доступа к файлу в отдельную функцию, а лучше используй условия мол поток есть или нет(можно флаг сигнализирующий том что файл уже открыт ввести). Ну уж так задуман компилятор, впринципе норм что нельзя в лайблах объявлять потому как во внешнем и внутреннем коде могли бы присутствовать переменные с одинаовым именем(была бы путаница)
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
17.03.2012, 08:47
Цитата Сообщение от Gepar Посмотреть сообщение
она отменяет все мои case в switch
Нельзя создавать объекты в блоке case не ограничив время жизни. Т.е. обернув тело блока case в {} всё заработает.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.03.2012, 08:47
Помогаю со студенческими работами здесь

Диалог открытия файла на winApi
Здратвуйте как вызвать диалог открытия/сохранения файла в winApi?

Как использовать диалог открытия файла
скажите само диалоговое окно открывается бкз каких либо параметров или параметры ,скажем размер окна ,где оно будет находится нужно...

Диалог открытия файла в bat/cmd
Добрый день! Подскажите решения JS вставки отображения (и функционирования) диалога открытия файла (FileOpenDialog) для bat. Нашел...

Диалог открытия файла по 64 разрядной версией
Доброго времени суток была в mdb функция которая работала как часы (по Ken Getz) открывала диалог выбирала файлик попробовал...

Диалог открытия файла при нажатии на кнопку
Помогите люди срочно очень надо, в общем я не знаю как сделать, обшарил интернет и как такового не нашел для себя ответа. Есть кнопка, при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru