Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции-ТРПС.doc
Скачиваний:
13
Добавлен:
15.11.2018
Размер:
810.5 Кб
Скачать

13.2. Функция главного окна

// Прототипы функций, используемые в WndProc() HWND CreateListView (HWND hwndParent); void InitListView (HWND hwndList); void ResizeListView (HWND hwndList, HWND hwndParent); void SwitchButton (HWND hWnd, TCHAR chMode);

DWORD WINAPI ThreadFunc (LPVOID pData);

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { // Используем две статические переменные // для дескриптора рабочего потока // и структуры параметров для него. static HANDLE hThread; static THREADPARAM parm;

switch (message) {

case WM_CREATE : // Создаем элемент управления ListView. parm.hwndList = CreateListView(hWnd); if (parm.hwndList) { // На одном месте создаем две кнопки // с разными идентификаторами. // Первая будет запускать процесс проверки, // а вторая - останавливать. // Пряча одну и показывая другую, // организуем эффект переключения.

HWND hButt = ::CreateWindow(TEXT("BUTTON"), StrFromRC(ID_BUTT_BEG), WS_CHILD | WS_TABSTOP | WS_VISIBLE, 10, 6, 80, 24, hWnd, (HMENU)ID_BUTT_BEG, g_hInst, NULL); if (hButt) { // Заменяем шрифт для кнопки на тот, // который используется для ListView. WPARAM pFont = ::SendMessage(parm.hwndList, WM_GETFONT, 0, 0); ::SendMessage(hButt, WM_SETFONT, pFont, MAKELPARAM(TRUE, 0)); }

hButt = ::CreateWindow(TEXT("BUTTON"), StrFromRC(ID_BUTT_END), WS_CHILD | WS_TABSTOP, 10, 6, 80, 24, hWnd, (HMENU)ID_BUTT_END, g_hInst, NULL);

if (hButt) { WPARAM pFont = ::SendMessage(parm.hwndList, WM_GETFONT, 0, 0); SendMessage(hButt, WM_SETFONT, pFont, MAKELPARAM(TRUE, 0)); } } break;

case WM_SIZE : // Изменяем размеры ListView. ResizeListView(parm.hwndList, hWnd); return 0;

case WM_SETFOCUS : // Передаем фокус на элемент ListView. ::SetFocus(parm.hwndList); break;

case WM_COMMAND : ::SetFocus(parm.hwndList); if (LOWORD(wParam) == ID_BUTT_BEG) { // Запускаем рабочий поток. InitListView(parm.hwndList); lstrcpy(parm.szRoot, g_szCmd); parm.hWnd = hWnd; if (hThread) ::CloseHandle(hThread); hThread = ::CreateThread(NULL, 0, ThreadFunc, &parm, 0, &parm.idThread); SwitchButton(hWnd, TEXT('E')); } else if (LOWORD(wParam) == ID_BUTT_END) { // Останавливаем рабочий поток // и запускаем таймер ожидания. parm.hWnd = 0; ::SetTimer(hWnd, TIMER_WAIT, 100, NULL); SwitchButton(hWnd, TEXT('B')); } return 0;

case WM_NOTIFY : { NMHDR& nm = *(NMHDR*)lParam; if (nm.hwndFrom == parm.hwndList && nm.code == LVN_KEYDOWN) { // Определяем какая клавиша нажата. LV_KEYDOWN& km = *(LV_KEYDOWN*)lParam; if (km.wVKey == VK_RETURN) { // Нажата клавиша "Enter". // Имитируем нажатие соответствующей кнопки. ::PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(((parm.idThread) ? ID_BUTT_END : ID_BUTT_BEG), BN_CLICKED), 0); } else if (km.wVKey == VK_ESCAPE) // Нажата клавиша "Esc". // Имитируем нажатие соответствующей кнопки. ::PostMessage(hWnd, WM_CLOSE, 0, 0); return 0; } break; }

case WM_TIMER : ::KillTimer(hWnd, wParam); if (parm.idThread) { // Продолжаем ждать окончания рабочего потока. ::SetTimer(hWnd, wParam, 100, NULL); } else { // Поток завершен. ::CloseHandle(hThread); hThread = NULL; if (wParam == TIMER_CLOSE) ::PostMessage(hWnd, WM_CLOSE, 0, 0); } return 0;

case WM_CLOSE : if (parm.idThread) { // Рабочий поток еще активен. // Запускаем таймер ожидания окончания. parm.hWnd = 0; ::SetTimer(hWnd, TIMER_CLOSE, 100, NULL); return 0; } break;

case WM_DESTROY : if (hThread) ::CloseHandle(hThread); ::PostQuitMessage(0); return 0; }

return ::DefWindowProc(hWnd, message, wParam, lParam); }