Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
-JR-
4 / 4 / 2
Регистрация: 22.04.2015
Сообщений: 54
Завершенные тесты: 1
#1

Поиск всех .bmp файлов в системе

04.09.2015, 11:12. Просмотров 337. Ответов 2
Метки нет (Все метки)

Приветствую всех.
Ребята, помогите пожалуйста организовать поиск в локальных дисках по маске *.bmp.
Ниже приведенный код собирает bmp файлы в указанной директории, которые имеют целочисленное имя и подхватываются циклом при переборе файлов c помощью wsprintf(str, L"C:\\1\\pic\\%d.bmp", i);

Но вот как запустить поиск к примеру по целому диску С, при этом ловя файлы не по названию, а лишь по маске .bmp, с ночи ломаю голову...
Будьте добры подсказать.


Code
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
#include <windows.h>
#include <string>
#include "resource.h"
using namespace std;
 
// включает манифест красивого интерфейса.
#pragma comment(linker, "\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' \
publicKeyToken='6595b64144ccf1df' language='*'\"")
 
HWND hStart, hStop, hPicture;
HBITMAP hBmp[5]; // HBITMAP * h = new HBITMAP[...]
 
BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
    return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
}
 
BOOL CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CLOSE:
        EndDialog(hWnd, 0);
        return TRUE;
 
    case WM_INITDIALOG:
 
        // hStart = GetDlgItem(hWnd, IDC_START);
        // hStop = GetDlgItem(hWnd, IDC_STOP);
        // hPicture = GetDlgItem(hWnd, IDC_PICTURE);
                                                                            //рамочка    // Рамка в стиле ворда.
        hPicture = CreateWindowEx(0, L"STATIC", 0, WS_CHILD | WS_VISIBLE | WS_DLGFRAME | WS_BORDER,
            130, 20, 80, 80, hWnd, 0, GetModuleHandle(0), 0);
 
                            //меняем поле стайл                             // позволяет на статик ставить картинки
        SetWindowLong(hPicture, GWL_STYLE, GetWindowLong(hPicture, GWL_STYLE) | SS_BITMAP); // установка доп. стиля
 
        SendMessage(hPicture, STM_SETIMAGE, WPARAM(IMAGE_BITMAP),
            (LPARAM)(LoadImage(GetModuleHandle(0), L"C:\\1\\pic\\1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)));
 
        hStart = CreateWindowEx(0, L"BUTTON", L"Start", WS_CHILD | WS_VISIBLE,
            20, 55, 100, 50, hWnd, 0, GetModuleHandle(0), 0);
 
        hStop = CreateWindowEx(0, L"BUTTON", L"Stop", WS_CHILD | WS_VISIBLE,
            236, 55, 100, 50, hWnd, 0, GetModuleHandle(0), 0);
 
        SetWindowText(hWnd, L"Gallery");
        MoveWindow(hWnd, 400, 300, 374, 200, TRUE);
 
        EnableWindow(hStop, FALSE);
 
        for (int i = 1; i <= 5; i++) // загрузка картинок.
        {
            wchar_t* str = new wchar_t[200];
            wsprintf(str, L"C:\\1\\pic\\%d.bmp", i);
            // загрузка картинки по имени файла. Возвращается тип handle, который преобразуется в HBITMAP
            hBmp[i - 1] = (HBITMAP)LoadImage(GetModuleHandle(0), str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
            delete[]str;
        }
 
        return TRUE;
 
    case WM_COMMAND: // взаимодействие с каким либо видом управления (чекбоксы, радиобатоны, и т.п.)
        //if (LOWORD(wParam) == IDC_START)
        if (lParam == (LPARAM)hStart) // есди я нажал на кнопку Старт
        {
            SetTimer(hWnd, 1, 1000, 0);
            EnableWindow(hStart, FALSE);
            EnableWindow(hStop, TRUE);
            SetFocus(hStop); // переключает активность на кнопку стоп.
        }
        if (lParam == (LPARAM)hStop)
        {
            KillTimer(hWnd, 1);
            EnableWindow(hStart, TRUE);
            EnableWindow(hStop, FALSE);
            SetFocus(hStart);
        }
        return TRUE;
 
    case WM_TIMER:
        static int index = 0;
        index++;
        if (index > 4)
            index = 0;
        SendMessage(hPicture, STM_SETIMAGE, WPARAM(IMAGE_BITMAP), LPARAM(hBmp[index]));
        return TRUE;
    }
    return FALSE;
}


Добавлено через 10 минут
Забыл добавить:
Вышеприведенный код программы помещает найденные файлы в галерею для просмотра.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2015, 11:12
Ответы с готовыми решениями:

Класс по обработке bmp-файлов
добрый вечер! проблема в чтении структур в файл. когда писала программу по...

Поиск изображения в другом изображении (BMP)
Всем привет! Делаю поиск выбранного изображения (PIC_1) в другом изображении...

Перехват запуска файлов в системе
Мне нужно перехватывать запуск файлов с некоторыми специфичными расширениями....

Получить дескрипторы всех окон в системе
Как получить дескрипторы всех окон в системе

Курсовая по теме "Структура файлов *.bmp"
Нужна помощь в написании курсовой. Не совсем понимаю что нужно написать по этой...

2
Shvonder
20 / 35 / 24
Регистрация: 16.03.2015
Сообщений: 179
04.09.2015, 23:13 #2
-JR-, набросок
Карл Маркс и Фридрих Энгельс не муж и жена, а четыре разных человека
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
TCHAR GFilename[4096][MAX_PATH];
int FindFile(TCHAR* Root, TCHAR* Match, TCHAR* Buffer);
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
    return 0;
}
 
BOOL CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int nCount = 0;
    TCHAR Buffer[4096];
    TCHAR Root[]=TEXT("C:\\");
    TCHAR Match[]=TEXT("*.BMP");
 
    switch (message)
    {
    case WM_INITDIALOG:
    
    nCount=FindFile(Root,Match,Buffer);
    if(nCount==0)
        return TRUE;
 
    for (int i = 1; i <= 5; i++) // загрузка картинок.
    {
        wchar_t* str = new wchar_t[260];
        wsprintf(str,TEXT("%s"),GFilename[i]);
        hBmp[i - 1] = (HBITMAP)LoadImage(GetModuleHandle(0), str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
        delete[]str;
    }
 
    return TRUE;
}
 
/*
 * Рекурсивная функция.
*/
int FindFile(TCHAR* Root, TCHAR* Match, TCHAR* Buffer)
{
    HANDLE hFind;
    WIN32_FIND_DATA finddata;
    TCHAR Path[MAX_PATH+1];
    int nCount = 0;
    lstrcpyn(Path,Root,MAX_PATH-1);
    if(Path[lstrlen(Path)-1]=='\\')
        lstrcpyn(Path+lstrlen(Path),Match,MAX_PATH-1-lstrlen(Path));
    else {
        lstrcat(Path,TEXT("\\"));
        lstrcpyn(Path+lstrlen(Path),Match,MAX_PATH-lstrlen(Path));
    }
    hFind=FindFirstFile(Path, &finddata);
    if(hFind!=INVALID_HANDLE_VALUE) {
        do {
            wsprintf(Buffer,TEXT("%s\\%.260s"),Root,finddata.cFileName);
            lstrcpy(GFilename[nCount],Buffer);
            ++nCount;
        } while( FindNextFile(hFind,&finddata) );
        FindClose(hFind);
    }
    lstrcpyn(Path,Root,MAX_PATH-1);
    if(Path[lstrlen(Path)-1]=='\\')
        lstrcpyn(Path+lstrlen(Path),TEXT("*"),MAX_PATH-lstrlen(Path));
    else {
        lstrcpyn(Path+lstrlen(Path),TEXT("\\*"),MAX_PATH-lstrlen(Path));
    }
    hFind=FindFirstFile(Path,&finddata);
    if(hFind==INVALID_HANDLE_VALUE) return nCount;
    do {
        if((lstrcmp(finddata.cFileName,TEXT("."))==0) ||
           (lstrcmp(finddata.cFileName,TEXT(".."))==0))
           continue;
        if(finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
            TCHAR NewRoot[MAX_PATH+1];
            lstrcpyn(NewRoot,Root,MAX_PATH-1);
            if(NewRoot[lstrlen(NewRoot)-1]=='\\')
                lstrcpyn(NewRoot+lstrlen(NewRoot),finddata.cFileName,MAX_PATH-1-lstrlen(NewRoot));
            else {
                lstrcat(NewRoot,TEXT("\\"));
                lstrcpyn(NewRoot+lstrlen(NewRoot),finddata.cFileName,MAX_PATH-lstrlen(NewRoot));
            }
            nCount+=FindFile(NewRoot,Match,Buffer);
        }
    } while(FindNextFile(hFind,&finddata));
    FindClose(hFind);
    return nCount;
}
1
-JR-
4 / 4 / 2
Регистрация: 22.04.2015
Сообщений: 54
Завершенные тесты: 1
06.09.2015, 16:56  [ТС] #3
Спасибо большое за набросок. Применил в своём примере, работает на отлично
Если Вас не затруднит, не могли бы Вы прокомментировать алгоритм работы функции FindFile, чтобы получше в нём разобраться?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2015, 16:56

Как в WinAPI быстро и элегантно получить список всех доступных COM портов в системе?
Может ComDBGetCurrentPortUsage ? Или EnumPorts ? Или же простым перебором...

Рекурсивный вывод всех папок и файлов
Господа казалось бы банальный вопрос , но что то я упёрся !!! Вообщем делаю...

Вывод всех файлов в заданной директории
Здравствуйте, написал код, но почему-то не рабоатет #include&lt;iostream&gt;...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru