Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Приклади створення вікон
Заборона запуску другого екземпляру додатку #include “Functions.h” //Оголошення функцій LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE hInstance; //Опис імен класу і заголовку вікна додатку char const szMainClass[]=”MainClass”; char szTitle[]=”Приклад”; //Головна функція додатку INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, PSTR, INT nCmdShow) {MSG msg; hInstance=hInst; HWND hwnd=FindWindow(szMainClass, szTitle); if(hwnd) {MessageBox(hwnd, “Можна запускати лише один екземпляр додатку! \n” “Пересувається на передній план перший екземпляр”, szTitle, MB_OK|MB_ICONSTOP); //Якщо вікно згорнуте, відновлюємо If (IsIconic (hwnd)) ShowWindow(hwnd, SW_RESTORE); SetForegroundWindow(hwnd); return 0; } if(! RegClass(WndProc, szMainClass, COLOR_BACKGROUND))return FALSE; hwnd=CreateWindow(szMainClass, szTitle, WS_POPUPWINDOW|WS_CAPTION|WS_MINIMIZEBOX, 0, 0, 0, 0, 0, 0, hInstance, NULL); if(! hwnd) return FALSE; ShowWindow(hwnd, SW_MAXIMIZE); while(GetMessage(& msg, NULL, 0, 0)) DispatchMessage(& msg); return(int)msg.wParam; } //Функція вікна додатку LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {switch (msg) {case WM_DESTROY: {PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam); } Задача. В правому нижньому куті робочої області вікна додатку при першому натисканні лівої клавіші миші відобразити вікно із заголовком “1-е вікно”, при другому натисканні – вікно із заголовком “2-е вікно”, і так до 5 вікон. Починаючи з 2-го, вікна розташовувати під попереднім, зсуваючи вгору і ліворуч так, щоб було видно заголовок, а лівий верхній кут 5-го вікна повинен співпадати з лівим верхнім кутом робочої області вікна додатку. Якщо якісь з цих вікон закриті, то при натисканні лівої кнопки миші повинно бути створене перше з закритих вікон. (Так зване розташування вікон черепицею в зворотньому порядку). Розв’язок. #include “Functions.h” LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK WndPopup (HWND, UINT, WPARAM, LPARAM); HINSTANCE hInstance; char const szMainClass[]=”MainClass”; char const szPopupClass[]=”PopupClass”; char const szTitle[]=”Приклад”; INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, PSTR, INT nCmdShow) {MSG msg; HWND hwnd; hInstance hInst; if (! RegClass(WndProc, szMainClass, COLOR_WINDOW)) return FALSE; if (! RegClass(WndPopup, szPopupClass, COLOR_BTNFACE)) return FALSE; hwnd=CreateWindow(szMainClass, szTitle, WS_OVERLAPPEDWINDOW|WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL); if (! hwnd) return FALSE; while (GetMessage (& msg, NULL, 0, 0)) DispatchMessage(& msg); return(int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {static short cxClient, cyClient, yStep, xStep, left, top, Width, Height; // Описуємо масив дескрипторів вікон static HWNSD hwnds[5]; switch(msg) {case WM_CREATE: {//Висота заголовку або зміщення вікон по вертикалі yStep=GetSystemMetrics(SM_CYCAPTION); return 0; } case WM_MOVE: {//Лівий верхній кут робочої області left=LOWORD(lParam); top=HIWORD(lParam); //Пересуваємо існуючі тимчасові вікна for(short j=0; j< 5, j++) if (IsWindow(hwnds[j])) MoveWindow(hwnds[j], left+cxClient-Width-xStep*j, top+cyClient-Height-yStep*j, Width, Height, TRUE); return 0; } case WM_SIZE: {//Ширина і висота робочої області cxClient=LOWORD(lParam); cyClient=HIWORD(lParam); //Ширина і висота тимчасових вікон Width=cxClient/2; Height=cyClient-4*yStep; //Зміщення вікон по горизонталі xStep=(cxClient-Width)/4; //Пересуваємо існуючі тимчасові вікна for (short j=0; j< 5, j++) if (IsWindow(hwnds[j])) MoveWindow(hwnds[j], left+cxClient-Width-xStep*j; top+cyClient-Height-yStep*j, Width, Height, TRUE); return 0; } case WM_LBUTTONDOWN: {//Шукаємо вільне місце в масиві дескрипторів вікон for (short j=0; j< 5, IsWindow(hwnds[j]); j++); //Якщо немає вільного місця, повертаємось if (j> 4) return 0; //Формуємо заголовок вікна char str[20]; _itoa(j+1, str, 10); strcat(str, " -е вікно"); //Створюємо -j-е тимчасове вікно hwnds[j]=CreateWindow(szPopupClass, str, WS_POPUPWINDOW|WS_CAPTION|WS_VISIBLE, left+cxClient-Width-xStep*j, //Коордната лівого краю top+cyClient-Height-yStep*j, //Координата верхнього краю Width, Height, hwnd, 0, hInstance, NULL); //Якщо створено не перше вікно, пересуваємо його донизу if (j> 0) {SetWindowPos(hwnds[j], hwnds[j-1], 0, 0, Width, Height, SWP_NOMOVE|SWP_NOSENDCHANGING); //Переміщуємо на передній план перше вікно SetForegroundWindow(hwnds[0]); } return 0; } case WM_DESTROY: {PostQuitMessage(0); return 0; } } return DefWindowProc (hwnd, msg, wParam, lParam); } LRESULT CALLBACK WndPopup(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {return DefWindowProc(hwnd, msg, wParam, lParam); }
IІ. ЗМІСТ ЗВІТУ 1. Тема, мета, умова завдання. 2. Опис команд, за допомогою яких було виконано завдання, і результатів їх виконання. 3. Висновок.
ІІІ. ЗАВДАННЯ Написати програму мовою програмування C++ для реалізації завдання згідно варіанту. 1. Правий верхній кут робочої області вікна додатку займає тимчасове вікно розміром в чверть цієї області. Після натискання правої кнопки миші над робочою областю вікна додатку тимчасове вікно згортається в піктограму в лівому нижньому куті, а після антискання лівої – розгортається в правому верхньому куті робочої області. 2. Після натсикання на ліву кнопку миші над робочою областю вікна в лівому верхньому куті цієї області відобразити тимчасове вікно розміром в чверть області. Тимчасове вікно приховати після відпускання клавіші в будь-якому місці екрану. 3. Після натсикання на праву кнопку миші над робочою областю вікна в правому нижньому куті цієї області відобразити тимчасове вікно розміром в чверть області. Тимчасове вікно приховати після відпускання клавіші в будь-якому місці екрану. 4. В лівому верхньому куті робочої області вікна створити тимчасове і дочірнє вікна. Після натискання лівої кнопки миші 4 рази “блимає” тимчасове вікно, а після натискання правої – 3 рази “блимає” дочірнє вікно, видаючи різні звукові сигнали. 5. В правому нижньому куті робочої області вікна створити тимчасове і дочірнє вікна. Після натискання лівої кнопки миші 4 рази “блимає” тимчасове вікно, а після натискання правої – 3 рази “блимає” дочірнє вікно, видаючи різні звукові сигнали. 6. Створити вікно додатку розміром в одну шістнадцяту площі екрану з заголовком “Форматування диску” без кнопок зміни розмірів, закриття та згортання в піктограму і без кнопки системного меню. При переміщенні курсору миші над робочою областю вікно повинно “тікати” від курсору миші у випадковим чином обраному напрямку, залишаючись в межах екрану. 7. В центрі робочої області вікна розташоване вікно без заголовка з вертикальною та горизонтальною смугами перегляду розміром в чверть робочої області. Після клацання кнопкою миші в різних місцях екрану тимчасове вікно видає різний звуковий сигнал. 8. При запуску і-го екземпляра (i> 2) додатку запитати користувача, чи потрібно його запустити. Якщо користувач відповість “Так”, то запустити його. Інакше на передній план помістити 2-й екземпляр додатку і завершити роботу і-го екземпляру. 9. Кути робочої області вікна додатку повністю займають 4 тимчасових вікна одного класу. Якщо натиснути ліву кнопку миші над тимчасовим вікном, то це вікно видає повідомлення про свій заголовок. 10. Вікно додатку без заголовка займає весь екран фоном робочого столу. 11. В центрі робочої області вікна розташовується невидиме вікно без заголовка розміром в чверть площі робочої області. Після натискання лівої кнопки миші над робочою областю будь-якого з вікон вікно без заголовку повинно стати видимим, а після натискання правої – невидимим. 12. В центрі робочої області вікна відображене дочірнє вікно з фоном кольору тривимірних елементів з вертикальною і горизонтальною смугами перегляду розміром в чверть цієї області. Дочірнє вікно пересувається в той кут робочої області, де натиснули ліву кнопку миші. 13. В лівому верхньому куті робочої області вікна створити тимчасове вікно площею в одну шістнадцяту площі цієї області. При натисканні на ліву кнопку миші тимчасове вікно пересунути в сусідній за годинниковою стрілкою кут робочої області. 14. В лівому верхньому куті робочої області вікна створити тимчасове вікно площею в одну шістнадцяту площі цієї області. При натисканні на праву кнопку миші тимчасове вікно пересунути в сусідній проти годинникової стрілки кут робочої області. 15. Створити вікно розміром в чверть площі екрану. Після подвійного клацання миші вікно пересувається так, що його центр співпадає з координатами курсору миші в мить клацання. 16. Дочірнє вікно розміром 100х100 при переміщенні курсору миші над ним “тікає” від курсору миші в довільному напрямку, залишаючись в межах робочої області батьківського вікна. 17. При запуску другого екземпляру додатку повідомити про заборону запуску декількох екземплярів, на передній план пересунути перший екземпляр додатку, 3 рази змінити підсвічування його вікна, видаючи звукове попередження, і завершити роботу другого екземпляру. 18. В робочій області вікна додатку поруч один з одним розташовані 3 тимчасових вікна, кожне з яких по-своєму реагує на натискання лівої кнопки миші. 19. Вікно 1-го екземпляру додатку розташувати в лівому верхньому, 2-го – в правому верхньому, 3-го – в лівому нижньому, 4-го – в правому нижньому куті екрану. Причому всі вікна рівних розмірів і разом займають весь екран. В заголовку вікна вказати номер екземпляра. Заборонити запуск 5-го екземпляру. 20. При запуску додатку показати вікна вже існуючих копій цього додатку і запитати користувача, чи потрібно запускати ще один екземпляр. Якщо “Так”, то запустити його. Якщо “Ні”, завершити роботу додатку. 21. Центр робочої області вікна займає тимчасове вікно розміром в чверть площі області. Воно пересувається в той кут робочої області, де клацнули лівою кнопкою миші. А після клацання правою клавішею миші тимчасове вікно пересувається в кут, протилежний поточному куту. 22. Вікно додатку займає чверть екрану і розташоване в лівому верхньому куті. Створити тимчасове вікно такого ж розміру в правому нижньому куті екрану. Будь-яке вікно після натискання лівої кнопки миші пересувається у вільний за годинниковою стрілкою кут. 23. Вікно розміром в чверть площі екрану розташоване в центрі екрану. Після натискання лівої кнопки миші вікно декілька разів змінює підсвічування і пересувається в той кут екрану, де курсор миші виявляється за межами вікна. 24. Вікно додатку розміром в чверть площі екрану займає один з кутів екрану. Після натискання лівої кнокпи миші вікно згортається в піктограму. Після клацання по піктограмі воно відновлюється в іншому куті екрану. 25. В робочій області вікна додатку поруч одне з одним розташувати 4 тимчасових вікна, в заголовках яких вказано номер вікна. Після натискання лівої кнокпи миші тимчасове вікно видає повідомлення, що містить номер вікна. 26. В кутах робочої області вікна додатку створені невидимі тимчасові вікна із заголовком. Кожне вікно стає видимим після натискання лівої кнопки миші поза його частиною робочої області і стає невидими після натискання лівої кнопки миші над його робочою областю. 27. Вікно додатку розміром в чверть площі екрану займає один з кутів екрану. Після натискання лівої кнопки миші вікно згортається в піктограму. Після клацання по піктограмі воно відновлюється в іншому куті екрану. 28. При запуску не першого екземпляру додатку видати попереджаючий звуковий сигнал і повідомити про кількість вже працюючих копій цього додатку. Запустити екземпляр, тільки якщо згоден користувач. 29. Центр робочої області вікна займає тимчасове вікно розміром в чверть площі області в згорнутому стані. Після натискання лівої кнопки миші над робочою областю тимчасове вікно розгортається в центрі області, а після натискання правої – згортається в центрі. 30. Вікно додатку займає чверть екрану і розташоване в правому верхньому куті. Створити тимчасове вікно такого ж розміру в лівому нижньому куті екрану. Будь-яке вікно після натискання лівої кнопки миші пересувається у вільний проти годинникової стрілки кут.
IV. КОНТРОЛЬНІ ПИТАННЯ 1. Чим відрізняється текст додатку, який створює вікно, від тексту додатку, який не створює вікон? 2. Який алгоритм роботи головної функції додатку? 3. Які дії повинен виконати додаток для створення вікна? 4. Опис яких програмних об’єктів потрібно включити в текст додатку для реєстрації класу вікон? 5. В якому місці і як відбувається виклик функції вікна? 6. Яке призначення формальних параметрів функції вікна?
|