Учреждение «Университет «Туран» Факультет «Академия кино и телевидения» Специальность «Вычислительная техника и программное обеспечение» Лабораторная работа 8 По дисциплине: «Системное программирование» Выполнил: студент группы ВТПО 20-1 Матусевич А.С. 3 – Заполнить выпадающий список используя клавишу F2, заскринить. 4 – Удалить элемент выпадающего списка используя клавишу F8, заскринить. Заполнил список (f2 or enter) Удалил элемент списка (f8 или delete) #include <Windows.h> LRESULT CALLBACK winproc(HWND, UINT, WPARAM, LPARAM); WNDCLASSEXW ws; //струкутра для регистрации класса окон const wchar_t* wn = L"class1"; //имя класса MSG msg; //для сообщения HWND hwnd, hb[2]; //для дескрипторов элементов окна HINSTANCE h; int flag, i; wchar_t ss[100]; int CALLBACK WinMain( _In_ HINSTANCE hInstance, _In_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow ) { h = hInstance; ws.cbSize = sizeof(WNDCLASSEXW); ws.cbClsExtra = 0; ws.cbWndExtra = 0; ws.hIcon = LoadIcon(NULL, IDI_APPLICATION); ws.hCursor = LoadCursor(NULL, IDC_ARROW); ws.hbrBackground = CreateSolidBrush(RGB(0, 80, 80)); ws.hIcon = NULL; ws.hInstance = hInstance; ws.lpszClassName = wn; ws.lpszMenuName = NULL; ws.lpfnWndProc = (WNDPROC)winproc; ws.style = CS_VREDRAW | CS_HREDRAW; //зарегистрировать класс окна if (RegisterClassExW(&ws) == 0) { MessageBoxExW(0, L"Ошибка регистрации!", L"Сообщение", 0, 0); return 0; }; //создать окно hwnd = CreateWindowExW(0, wn, L"Окно с ComboBox", WS_OVERLAPPEDWINDOW, 10, 10, 400, 300, NULL, NULL, hInstance, NULL); //сделать окно видимым ShowWindow(hwnd, nCmdShow); //обновить содержимое UpdateWindow(hwnd); //цикл обработки сообщений while (GetMessage(&msg, NULL, NULL, NULL)) { if (msg.message == WM_KEYDOWN) { winproc(msg.hwnd, msg.message, msg.wParam, msg.lParam); } TranslateMessage(&msg); DispatchMessage(&msg); } //выход из программы return (int)msg.wParam; } //функция окна LRESULT CALLBACK winproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { int ind; switch (uMsg) { case WM_KEYDOWN: //обработка нажатия клавиши tab if (wParam == 9) { if (i == 2)i = 0; else i++; SetFocus(hb[i]); } //проверяем фокус и код клавиши if ((flag == 1 && wParam == 0x71) || (flag == 1 && wParam == 0x0D)) { //f2 - добавляем к списку SendMessageW(hb[0], WM_GETTEXT, 50, (LPARAM)ss); SendMessageW(hb[0], CB_ADDSTRING, 0, (LPARAM)(LPSTR)ss); } if ((flag == 1 && wParam == 0x77) || (flag == 1 && wParam == 0x2E)) { //f8 - удаляем из списка //получить индекс элемента ind = (int)SendMessageW(hb[0], CB_GETCURSEL, (WPARAM)0, (LPARAM)0); if (ind != -1) { //удалить элемент SendMessageW(hb[0], CB_DELETESTRING, ind, 0); } } break; case WM_CREATE: //выпадающий список i = 1; hb[0] = CreateWindowExW(0, L"ComboBox", L" ", WS_CHILD | WS_VISIBLE | CBS_DROPDOWN | WS_OVERLAPPED | CBS_AUTOHSCROLL | CBS_DISABLENOSCROLL | WS_VSCROLL, 10, 10, 150, 300, hWnd, 0, h, NULL); //кнопка hb[1] = CreateWindowExW(0, L"button", L"Выход", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 200, 10, 80, 30, hWnd, 0, h, NULL); break; case WM_COMMAND: //события выпадающего списка if (lParam == (int)hb[0]) { if (HIWORD(wParam) == CBN_SETFOCUS) { //получил фокус flag = 1; } if (HIWORD(wParam) == CBN_KILLFOCUS) { //потерял фокус flag = 0; } } //события кнопки if (lParam == (int)hb[1]) { if ((HIWORD(wParam) == BN_CLICKED)) { DestroyWindow(hWnd);//закрыть приложение } } break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); };