Ветеран
Сообщения: 3320
Благодарности: 916
|
Профиль
|
Отправить PM
| Цитировать
Доброго времени суток student_po, не совсем понятно, какого масштаба задание: практика, лаба, расчётно-графическая, другое?
Меня смущает в перечисленных форматах наличие doc и rtf, так как для последних встроенных возможностей языка будет не достаточно. Придётся писать довольно массивный код, дабы получить возможность без проблемного чтения данных файлов (по сути свой Word/WordPad), чего не скажешь про txt.
В технологии поиска можно предусмотреть использование ключевых слов "и" "или" и т.д. или без таких, опираясь на спец символы, вводящие в окно поиска, дабы искать по несколько строк сразу.
Для построения GUI в предполагаемых средствах программирования Visual C++ 6 и выше до 9 во всех этих версия можно построить, используя или чистый Win32 Api, или библиотеку классов MFC.
В версиях 7.Х и выше возможно так же использовать и WinForms (который использует .Net Framework), а начиная с 8й версии и выше можно и Windows Presentation Foundation (тоже использует .Net Framework).
Если окно нужно строить используя WIN32 API, то вот
прототип окна поиска
Код:
#include <windows.h>
#include <commctrl.h>
#pragma comment(lib, "comctl32.lib")
enum {ID_BUTTON};
HWND hWndListView;
LRESULT CALLBACK WindowFunc(HWND hWnd,UINT message,
WPARAM wParam,LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
CreateWindow(
TEXT("STATIC"),
TEXT("Search by any or all of the criterial below."),
WS_CHILD | WS_VISIBLE,
10,
10,
270,
20,
hWnd,
NULL,
NULL,
NULL);
CreateWindow(
TEXT("STATIC"),
TEXT("All or part of the file name:"),
WS_CHILD | WS_VISIBLE,
10,
45,
250,
20,
hWnd,
NULL,
NULL,
NULL);
CreateWindow(
TEXT("EDIT"),
NULL,
WS_CHILD | WS_VISIBLE | ES_LEFT | ES_MULTILINE ,
10,
65,
270,
20,
hWnd,
NULL,
NULL,
NULL);
CreateWindow(
TEXT("STATIC"),
TEXT("A word or phase in the file:"),
WS_CHILD | WS_VISIBLE,
10,
85,
250,
20,
hWnd,
NULL,
NULL,
NULL);
CreateWindow(
TEXT("EDIT"),
NULL,
WS_CHILD | WS_VISIBLE | ES_LEFT | ES_MULTILINE ,
10,
105,
270,
20,
hWnd,
NULL,
NULL,
NULL);
CreateWindow(
TEXT("STATIC"),
TEXT("Look in:"),
WS_CHILD | WS_VISIBLE,
10,
125,
100,
20,
hWnd,
NULL,
NULL,
NULL);
CreateWindow(
TEXT("EDIT"),
NULL,
WS_CHILD | WS_VISIBLE | ES_LEFT | ES_MULTILINE ,
10,
145,
270,
20,
hWnd,
NULL,
NULL,
NULL);
CreateWindow(
TEXT("BUTTON"),
TEXT("Search"),
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_TABSTOP,
200,
200,
80,
30,
hWnd,
NULL,
NULL,
NULL);
break;
case WM_COMMAND:
switch(wParam)
{
case ID_BUTTON:
//MessageBox(NULL, TEXT("Search Results"), TEXT("About"), MB_ICONASTERISK | MB_OK);
ShowWindow(hWndListView,SW_SHOW);
break;
}
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hWnd,message,wParam,lParam);
}
return 0;
}
int WINAPI WinMain (HINSTANCE hThisInst,HINSTANCE hPrevInst,
LPSTR lpszArgs,int nWinMode)
{
WNDCLASS wcl;
wcl.style = 0;
wcl.lpfnWndProc = WindowFunc;
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
wcl.hInstance = hThisInst;
wcl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wcl.hCursor = LoadCursor (NULL, IDC_ARROW);
wcl.hbrBackground = (HBRUSH)COLOR_WINDOW;
wcl.lpszMenuName = NULL;
wcl.lpszClassName = TEXT("Search");
if (!RegisterClass (&wcl))
return -1;
HWND hWnd = CreateWindowEx (WS_EX_TOPMOST,
wcl.lpszClassName,
TEXT("Search Results"),
WS_TILEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
HWND_DESKTOP,
NULL,
hThisInst,
NULL);
if (!hWnd)
return -1;
ShowWindow (hWnd,nWinMode);
UpdateWindow (hWnd);
MSG msg;
hWndListView = CreateWindow(
WC_LISTVIEW,
NULL,
WS_CHILD | LVS_REPORT | LVS_EDITLABELS,
300,
10,
250,
220,
hWnd,
NULL,
NULL,
NULL);
#ifdef UNICODE
TCHAR szColumnHeader[3][12] = {TEXT("Name"), TEXT("In Folder"), TEXT("Size")};
#else
char szColumnHeader[3][12] = {TEXT("Name"), TEXT("In Folder"), TEXT("Size")};
#endif
int index;
int iiWidth[3];
LV_COLUMN lvC;
ListView_SetExtendedListViewStyle(hWndListView, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
iiWidth[0] = 60;
iiWidth[1] = 100;
iiWidth[2] = 400;
lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvC.fmt = LVCFMT_LEFT;
for(index = 0; index < 3; index++)
{
lvC.iSubItem = index;
lvC.cx = iiWidth[index];
lvC.pszText = szColumnHeader[index];
ListView_InsertColumn(hWndListView,index,&lvC);
}
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
По нажатию на кнопку Поиск ("Search") появляется окно с предполагаемым результатом. Кроме того в коде не совсем корректно создаётся собственно это окно (в примере моветон), так как по хорошему его создание и определение ListView_SetExtendedListViewStyle нужно было размещать в case WM_CREATE: а не так как здесь после MSG msg; перед while(GetMessage(&msg, NULL, 0, 0) > 0). На практике между этими двумя строками ничего не должно быть.
Я размесил эго создание между этим двумя строчками, так как хотел продемонстрировать его включение по кнопке. А как включать это окно, если оно расположено на своём месте в case WM_CREATE: я показать не готов (кнопка в case WM_COMMAND: получает не инициализированный hWndListView), возможно другие участники смогу подсказать как это сделать корректно.
Если же окно нужно строить не на Win32 API, тогда, учитывая что версия MSVC от 6 до 9, его нужно строить с использованием библиотек MFC. Это ещё проще, так как это можно сделать визуально, перетягивая соответственные элементы управления.
|