Guest User

Untitled

a guest
Nov 16th, 2018
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 37.86 KB | None | 0 0
  1. Лабораторная работа 1.
  2. Создание окон.
  3.  
  4. Программы для Windows называют приложениями. Пользователь с приложением взаимодействует через окна следующих видов:
  5. 1. Окно приложения. Оно организует работу, появляется первым при запуске и закрывается вместе с прекращением работы приложения.
  6. 2. MDI-окиа. Они служат для одновременной обработки нескольких документов.
  7. 3. Окно помощи. Оно в большей степени работает под управлением операционной системы, чем под управлением приложения.
  8. 4. Диалоговое окно. Оно обеспечивает оперативный обмен данными между пользователем и приложением (рис. 1.1).
  9.  
  10. Рис. 1.1. Окно со множеством элементов: 1 - кнопка системного меню; 2 - кнопка сворачивания окна в пиктограмму; 3- кнопка максимализации или восстановления размеров окна; 4- кнопка закрытия окна; 5 - рамки изменения размеров окна
  11. С точки зрения языка программирования, окна - это объекты (пере¬менные), над которыми выполняют действия.
  12. Класс окон.
  13. Набор используемых ресурсов класса задают в структуре типа WNDCLASS. Эта структура описана следующим образом: typedef struct
  14. {
  15. UINT style;
  16. WNDPROC IpfnWndProc;
  17. Int cbClsExtra;
  18. Int cbWndExtra;
  19. HANDLE hlnstance;
  20. HICON hlcon;
  21. HCURSOR hCursor;
  22. HBRUSH hbrBackground;
  23. LPCTSTR IpszMenuName
  24. LPCTSTR IpszClassName;
  25. } WNDCLASS;
  26. Назначение полей структуры:
  27. 1. style – описывает стиль клааса окна.
  28. Например: wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  29. 2. IpfnWndProc – указывает на функцию окна.
  30. 3. cbClsExtra – равно количеству дополнительных байт класса.
  31. 4. cbWndExtra – равно количеству дополнительных байт окна этого класса.
  32. 5. hlnstance – указывает на дескриптор текущего приложения.
  33. 6. hlcon – указывает на имя пиктограммы (иконки), в которую превраща¬ется окно при минимизации. Ресурс иконки загружают функцией LoadIcon.
  34. 7. hCursor – задает вид курсора мыши при его прохождении над окном. Ресурс курсора агружают функцией LoadCursor.
  35. 8. hbrBackground – задает дескриптор кисти закрашивания фона окна.
  36. 9. IpszMenuName – указывает на имя ресурса главного меню окон этого класса. Если задать NULL, окна этого класса не имеют заданного по умолчанию меню.
  37. 10. IpszClassName – указывает на текстовую строку, содержащую имя ре¬гистрируемого класса окон.
  38.  
  39. Для регистрации класса окон удобно использовать функцию следу¬ющего вида:
  40. int RegClass( WNDPROC Proc, LPCTSTR szName)
  41. {
  42. WNDCLASS wc;
  43. wcstyle = CS.HREDRAW | CS.VREDRAW;
  44. wc.cbClsExtra = wccbWndExtra = 0;
  45. wclpfnWndProc = Proc; wc.hlnstance = hlnstance;
  46. wchlcon = Loadlcon(NULL, IDLAPPLICATION);
  47. wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  48. wchbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  49. wc.lpszMenuName = (LPCTSTR)NULL;
  50. wc.lpszClassName = szName;
  51. return RegisterClass(&wc);
  52. }
  53. Формальными параметрами этой функции являются указатели на функцию окна и строку с именем класса. Имя, список формальных пара¬метров и тип возврата функции могут быть любыми другими. Главное, чтобы приложению после регистрации были доступны имя зарегистри¬рованного класса, а операционной системе - функция окна этого класса.
  54. Функция окна описывает реакцию окна на поступающие сообщения. Она от обычных функций отличается следующим;
  55. • имеет стандартные тип возврата и список формальных парамет¬ров;
  56. • вызывается только операционной системой при поступлении сообще¬ния окну;
  57. • сообщения, которые не обрабатываются функцией окна, возвра¬щаются операционной системе.
  58. Есть еще одно отличие. В объектно-ориентированном программиро¬вании методы изменения параметров состояния объекта обычно описывают отдельно. Функция окна реализует единствен¬ный метод для изменения всех параметров состояния окна.
  59. Имя функции окна - это обычное имя, определяемое разработчиком. При регистрации класса операционная система запоминает указатель на эту функцию.
  60. Рассмотрим пример описания функции окна.
  61. LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM IParam)
  62. {
  63. static short ex, cy, left, top; //Описание локальных переменных
  64. switch (msg) //Обработка сообщения
  65. { caseWM_CREATE: { ...; return 0;}
  66. case WM.MOVE:
  67. { left=LOWORD(IParam); top=HIWORD(IParam); return 0;
  68. }
  69. case WM_SIZE:
  70. {
  71. cx= LOWORD(IParam); cy=HIWORD(IParam);
  72. return 0;
  73. }
  74. case WM_COMMAND: //Обрабатываем команды
  75. {
  76. switch (LOWORD(wParam))
  77. {
  78. case CM_FILE_EXIT:
  79. { DestroyWindow(hwnd); return 0; }
  80. //Далее могут быть ветви других команд
  81. } return 0;
  82. }
  83. case WM_DESTROY:
  84. { ...; PostQuitMessage(O); return 0;}
  85. }
  86. return DefWindowProc(hwnd, msg, wParam, IParam);
  87. }
  88. Заголовок функции окна определен соглашениями Windows и имеет вид:
  89. LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM IParam)
  90. Тип возврата LRESULT равноценен типу signed long. Модификатор CALLBACK указывает на соглашения о том, что эта функция вызывает¬ся операционной системой (такие функции называют функциями об¬ратного вызова).
  91. Имена типов UINT, WPARAM, LPARAM описаны следующим образом:
  92. typedef unsigned int UINT;
  93. typedef UINT WPARAM;
  94. typedef LONG LPARAM;
  95. Параметр hwnd - дескриптор окна-адресата, a msg, wParam и IParam описывают полученное сообщение. Например, параметр msg принимает код сообщения.
  96. Рассмотрим, каким сообщениям соответствуют используемые в при¬мере имена констант. В Windows описаны несколько сот кодов сообще¬ний с префиксом WM_.
  97. Код WM_CREATE поступает от функции CreateWindow перед созданием окна. Если после обработки этого сообщения функции CreateWindow возвращается значение -1, то окно не создается.
  98. Код WM_SIZE функция окна получает после изменения размеров окна, a WM_MOVE - после перемещения левого верхнего угла рабочей области окна. Если при изменении размеров окна изменились координа¬ты левого верхнего угла рабочей области, то функция окна сначала по¬лучает код WM_MOVE, а затем - WM_SIZE.
  99. Код WM_COMMAND функция окна получает при поступлении ко¬манды. Тогда младшее слово параметра wParam содержит код команды.
  100. Код WM_DESTROY функции окна посылают перед разрушением окна. В примере функция окна, вызывая функцию DestroyWindow, сама себе отправляет сообщение WMDESTROY.
  101. Рассмотрим сообщения от мыши. Пусть курсор мыши находится над рабочей областью окна. После нажатия левой клавиши мыши функция окна получит код WM_LBUTTONDOWN а правой клавиши - WM_RBUTTON DOWN. После отжатия левой (правой) клавиши функция окна получит код WMJLBUTTONUP (WM_RBUTTONUP). После перемещении кур¬сора мыши функция окна получает код WM_MOUSEMOVE.
  102. Можно получать сообщения от мыши, даже если курсор мыши не на¬ходится над рабочей областью окна. Для передачи мыши в монопольное использование окну hwnd вызывают функцию: HWND SetCapture(HWND hwnd);
  103. Эта функция возвращает дескриптор окна, у которого в монопольном пользовании была мышь, или NULL.
  104. Вызов функции void ReleaseCapture(void); отменяет режим монопольного использования.
  105. Значение параметра IParam зависит от кода сообщения.
  106. При поступлении кода WMMOVE параметр IParam содержит экранные координаты левого верхнего угла рабочей области. Например:
  107. left=LOWORD(IParam); //Координата левого края рабочей области
  108. top=HIWORD(IParam); //Координата верхнего края рабочей области
  109. Для кода WM_SIZE параметр IParam несет информацию о ширине сх и высоте су рабочей области:
  110. cx=LOWORD(IParam); //Ширина рабочей области
  111. cy=HIWORD(IParam); //Высота рабочей области
  112. При поступлении любых сообщений от мыши расстояние курсора мыши от левого края рабочей области равно LOWORD(lParam), а от верхнего края - HIWORD(lParam).
  113. Вызов функции DefWindowProc означает, что. необработанное сооб¬щение возвращают операционной системе.
  114. Для создания окна вызывают функцию CreateWindow. Она создает перекрывающееся, временное или дочернее окно и устанавливает на¬чальные значения некоторых его параметров. Эта функция объявлена следующим образом:
  115. HWND CreateWindow{
  116. LPCSTR IpClassName,
  117. LPCSTR IpWindowName,
  118. DWORD dwStyle,
  119. int x,
  120. int y,
  121. int nWidth,
  122. int Height,
  123. HWND hWndParent,
  124. HMENU hMenu,
  125. HANDLE hInstanse,
  126. LPVOID IpParam
  127. };
  128.  
  129. Назначение параметров вызова этой функции:
  130. 1. IpClassName указывает на имя зарегистрированного функцией RegisterClass или определенного операционной системой класса.
  131. 2. dwStyie задает стиль окна..
  132. 3. х - координата левого края окна в пикселях. Для перекрывающихся или временных окон х отсчитывают от левого края экрана, дочерних окон - от левого края рабочей области родительского окна. Если для перекрывающегося окна со стилем WSVISIBLE в качестве х задать константу CWJJSEDEFAULT, Windows устанавливает не обязатель¬но нулевую позицию по умолчанию для левого верхнего угла окна и игнорирует координату у верхнего края окна. Для временного и дочернего окна такая позиция по умолчанию равна (0,0).
  133. 4. у - координата верхнего края окна в пикселях. Для перекрывающихся и временных окон ее отсчитывают от верхнего края экрана, дочерних окон - от верхнего края рабочей области родительского окна.
  134. 5. nWidth - ширина окна в пикселях. Для перекрывающихся окон мож¬но задать равной WJJSEDEFAULT. В этом случае система уста¬навливает ненулевые значения ширины и высоты по умолчанию и игнорирует заданную высоту nHeight окна. Ширина и высота вре¬менного и дочернего окна по умолчанию равны нулю.
  135. 6. hWndParent может указывать только на инициированное окно. Де¬скриптор окна-родителя обязательно указывают при создании до¬чернего окна. Дескриптор окна-владельца для временного окна ука¬зывать необязательно.
  136. 7. hMenu - дескриптор меню или идентификатор создаваемого дочер¬него окна.
  137. еню перекрывающегося или временного окна можно задать тремя способами:
  138. 1) в классе окон указывают имя меню, и все окна этого класса мо¬
  139. гут пользоваться этим меню;
  140. 2) имя меню указывают как аргумент функции CreateWindow, и создаваемое окно будет пользоваться этим меню, игнорируя меню класса;
  141. 3) меню создают в процессе или после создания окна.
  142. Стиль окна задает внешнее поведение окна.
  143. Для описания стиля окна используют символические константы с префиксом WS_.
  144. По совокупности свойств различают перекрывающиеся (overlapped), временные (pop-up) и дочерние (child) окна.
  145. Перекрывающиеся окна чаще используют в качестве окон при¬ложения. Они всегда имеют заголовок (title bar), рамку и рабочую об¬ласть окна (client region), могут иметь системное меню, кнопки восста¬новления размеров, закрытия и сворачивания окна в пиктограмму, го¬ризонтальную и вертикальную полосы просмотра (scroll bar), меню, панель инструментов (tool bar) и строку состояния (status bar) (см. рис. 1.1). Базовый стиль таких окон описан константой WS_OVERLAPPED. Чаще используемый стиль окон WS_OVERLAPPED WINDOW вдобавок к базовому указывает, что окно имеет системное меню, кнопки восста¬новления размеров, закрытия и сворачивания окна.
  146. Перекрывающееся окно может принадлежать другому окну (владельцу). Если окно-владелец сворачивается в пиктограмму, то подчиненные ему окна становятся невидимыми. При уничтожении окна автоматически унич¬тожаются подчиненные ему окна. Подчиненные окна всегда располагаются над поверхностью окна-владельца, загораживая его.
  147. Временные окна обычно используют для вывода сообщений пользо¬вателю и остаются на экране непродолжительное время. Базовый стиль временного окна описан константой WS_POPUP. Такое окно по умолча¬нию не имеет заголовка. Чаще временное окно описывают константой WS_POPUPWINDOW. Для добавления к временному окну системного меню и заголовка стиль WS_POPUPWINDOW комбинируют со стилем WS_CAPTION. Во всем остальном временные окна - это специальный вид перекрывающихся окон.
  148. Дочерние окна используют для создания органов управления. Опре¬деляемые системой классы органов управления (кнопки, полосы про¬смотра и т. п.) представляют собой дочерние окна. Базовый стиль дочер¬них окон описан константой WS_CHILD. Этот стиль полностью совпа¬дает со стилем WS_ CHILDWINDOW. Дочерние окна не имеют кнопок минимизации и максимального увеличения размера, но всегда имеют ок¬но-родителя. Они "прилипают" к поверхности родителя, перемещаются с ним и не могут выйти за пределы родительского окна.
  149.  
  150. Приложения всегда описывают функцию с именем WinMain. Она получает управление при запуске приложения, выполняет присущие обычным функциям действия, регистрирует классы окон, создает окна, опрашивает очередь сообщений и распределяет свои сообщения.
  151. Пример описания функции WinMain:
  152. int WINAPI WinMain( HINSTANCE hlnstance,
  153. HINSTANCE hPrevlnstance, LPSTR IpszCmdLine, int nCmdShow)
  154. {
  155. MSG msg; HWND hwnd;
  156. if (!RegClass(WndPrtic, szClassName)) return FALSE;
  157. hwnd = CreateWindow(szCiassName, “Пример 1”, WS_OVERLAPPEDWINDOW, CWJJSEDEFAULT, CWJJSEDEFAULT,CWJJSEDEFAULT, CWJJSEDEFAULT,
  158. 0,0, hlnstance.NULL);
  159. if (!hwnd) return FALSE;
  160. ShowWindow( hwnd, SW_SHOWMAXIMIZED);
  161. UpdateWindow(hwnd); while (GetMessage(&msg, 0,0,0))
  162. { TransiateMessage(&msg); DispatchMessage(&msg); }
  163. return msg.wParam;
  164. }
  165. В теле функции WinMain описаны переменные msg и hwnd. Пере¬менная msg предназначена для временного хранения сообщений при их получении и распределении. Переменная hwnd хранит дескриптор созданного окна.
  166.  
  167. Структура текста приложения определяется двумя требованиями:
  168. 1. Текст содержит описание функции с именем WinMain.
  169. 2. Если регистрируются новые классы, то текст содержит описание структуры типа WNDCLASS и функций окон этих классов.
  170.  
  171. Windows API содержит множество функций, связанных с созданием окон. Это функции поиска, определения состояния, перемещения окон, а также обмена сообщениями с пользователем.
  172. Функции поиска и определения состояния окон.
  173. Часто требуется определить, существует ли окно для некоторого де¬скриптора. На этот вопрос отвечает функция IsWindow: BOOL lsWindow( HWND hwnd);
  174. Если нужно определить, имеет ли заданное окно фокус ввода, вызы¬вают функцию IsWindowEnabled:
  175. BOOL lsWindowEnabled( HWND hwnd);
  176. Для передачи или отнятия фокуса ввода у окна вызывают функцию EnableWindow:
  177. BOOL EnableWindow( HWND hwnd, BOOL bEnable);
  178. Фокус ввода окну hwnd передают с помощью функции SetFocus:
  179. SetFocus(hwnd);
  180. Следующая функция возвращает ненулевое значение, если окно hwnd свернуто в пиктограмму: BOOL lslconic(HWND hwnd);
  181. Функция FindWindow у операционной системы запрашивает деск¬риптор окна класса lpClassName с заголовком lpWindowName. Эта функция объявлена следующим образом:
  182. HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName);
  183. Функции перемещения окон
  184. Для перемещения и изменения размеров окна hwnd вызывают функ¬цию MoveWindow. Ей передают новые координаты окна.
  185. Функция SetWindowPos изменяет координаты окна hwnd на экране и его расположение по отношению к другим окнам.
  186. При одновременной работе нескольких приложений одно из них можно вывести на передний план и передать его окну фокус ввода. Для этих целей используют функцию SetForegroundWindow. Она по¬мещает поток, который создал заданное окно, на передний план и акти¬визирует это окно. Синтаксис этой функции:
  187. BOOL SetForegroundWindow (HWND hwnd );
  188. Для перемещения окна важно знать системные метрики экрана и ок¬на. Их получают с помощью функции GetSystemMetrics. Она возвращает метрики и текущие установки конфигурации системы. Метрики систе¬мы - это габариты (ширина и высота) отображаемых элементов Windows. Все габариты возвращаются в пикселях..
  189. Функция GetSystemMetrics объявлена следующим образом:
  190. int GetSystemMetrics (int nlndex);
  191. Параметр nlndex указывает на возвращаемую метрику системы или установку конфигурации.
  192. Например, следующий оператор определяет ширину экрана:
  193. Int w=GetSystemMetrics(SM_GXSCREEN);
  194. Следующая функция позволяет получить координаты обрамляющего окно liwnd прямоугольника:
  195. BOOL GetWindowRect( HWND hwnd, LPRECT IpRect);
  196. Параметр IpRect указывает на структуру типа RECT.
  197. Функция GetClientRect возвращает координаты прямоугольника, об¬рамляющего рабочую область окна:
  198. BOOL GetClientRect( HWND hwnd, LPRECT IpRect);
  199. Сообщения приложения для пользователя
  200. Для вывода текстовых сообщений и получения ответа пользователя применяют окно сообщения. Функция MessageBox создает, отображает, обеспечивает работу и закрывает окно сообщения.
  201. Приложение может обработать ответ пользователя на сообщение, анализируя возвращаемое функцией MessageBox значение.
  202. Windows предусматривает возможность выдачи и звуковых "сообще¬ний". Например, при вызове функции MessageBeep компьютер проигры¬вает "звук" из множества зарегистрированных в системе "звуков". Син¬таксис этой функции:
  203. BOOL MessageBeep( UINT uType);
  204. Параметр uType этой функции определяет звуковой тип и принимает одно из следующих значений:
  205. Если требуется обратить внимание пользователя на определенное ок¬но, то можно несколько раз изменить подсветку окна или его пикто¬граммы.
  206. Для этой цели используют функцию FlashWindow, которая за один вызов один раз изменяет подсветку указанного окна:
  207. BOOL FlashWindow(
  208. HWND hwnd, //Дескриптор подсвечиваемого окна
  209. BOOL blnvert //Параметр подсветки
  210. );
  211. Пример. После нажатия левой клавиши мыши над окном hwnd 5 раз изменить подсветку неактивного окна OwnedHwnd.
  212. Следующий фрагмент описывает версию решения этой задачи:
  213. case WM_LBUTTONDOWN:
  214. { FlashWindow(OwnedHwnd, TRUE);
  215. for (int i=0; i<9; i++)
  216. { for (long j=0;j<1e7;j++);
  217. FlashWindow(OwnedHwnd, TRUE);
  218. } .
  219. return 0;
  220. }
  221.  
  222.  
  223. Задания.
  224. 1. После нажатия на левую (правую) клавишу мыши над рабочей об¬ластью окна в левом верхнем (правом нижнем) углу области отобразить временное окно размером в четверть области. Временное окно скрыть после отжатия клавиши в любом месте экрана.
  225. 2. В левом верхнем (в правом нижнем) углу рабочей области окна! создать временное (дочернее) окно. После нажатия левой клавиши мыши 4 раза "мигает" временное окно, а после нажатия правой - 3 раза "мига¬ет" дочернее окно. При этом окна выдают различные звуковые сигналы.
  226. 3. Создать окно приложения размером в одну шестнадцатую площади эрана с заголовком "Форматирование диска" без кнопок изменения размеров, закрытия и сворачивания в пиктограмму и без кнопки систем¬ного меню. При перемещении курсора мыши над рабочей областью окно должно "убегать" от курсора мыши в случайным образом выбранном на¬правлении, оставаясь в пределах экрана.
  227. 4. В левом верхнем углу рабочей области окна создать временное ок¬но площадью в одну шестнадцатую площади этой области. При нажатии па левую (правую) клавишу мыши временное окно переместить в сосед¬ний по ходу (против хода) часовой стрелки угол рабочей области.
  228. 5. При запуске i-го экземпляра (i>2) приложения спросить пользова¬теля, нужно ли его запустить. Если пользователь ответит "Да", то запус¬тить его. Иначе на передний план переместить 2-й экземпляр приложе¬ния и завершить работу i-го экземпляра.
  229. 6. Углы рабочей области окна приложения полностью занимают 4 временных окна одного класса. Если нажать левую клавишу мыши над временным окном, то это окно выдает сообщение о своем заголовке.
  230. 7. Окно приложения без заголовка занимает весь экран фоном рабо¬чего стола.
  231. 8. В центре рабочей области окна располагается невидимое окно без заголовка размером в четверть площади рабочей области. После нажатия пеной клавиши мыши над рабочей областью любого из окон окно без заголовка должно стать видимым, а после нажатия правой - невидимым.
  232. 9. В центре рабочей области окна отображено дочернее окно с фоном циста трехмерных элементов с вертикальной и горизонтальной полосами просмотра размером в четверть этой области. Дочернее окно перемещается и тот угол рабочей области, где нажали левую клавишу мыши.
  233. 10. В центре рабочей области окна расположено окно без заголовка V вертикальной и горизонтальной полосами просмотра размером в чет¬верть рабочей области. При нажатии разных клавиш мыши временное нк но выдает разный звуковой сигнал.
  234. 11. Создать окно размером в четверть площади экрана. После двой¬ною щелчка мыши окно перемещается так, что его центр совпадает с координатами курсора мыши в момент щелчка.
  235. 12. Дочернее окно размером 100*100 пикселей при перемещении курсора мыши над ним "убегает" от курсора мыши в произвольном на¬правлении, оставаясь в пределах рабочей области родительского окна.
  236. 13. При запуске второго экземпляра приложения сообщить о запрете
  237. ка нескольких экземпляров, на передний план переместить первый экземпляр приложения, 3 раза изменить подсветку его окна, выдавая звуковое предупреждение, и завершить работу второго экземпляра.
  238. 14. В рабочей области окна приложения рядом друг с другом распо¬ложить 3 временных окна, каждое из которых по-своему реагирует на нажатие левой клавиши мыши.
  239. 15. Окно первого экземпляра приложения расположить в левом верх¬нем, второго - в правом верхнем, третьего - в левом нижнем, четверто¬го - в правом нижнем углу экрана. Причем все окна равных размеров и вместе занимают весь экран. В заголовке окна указать номер экземпляр ра. Запретить запуск пятого экземпляра.
  240. 16. Центр рабочей области окна занимает временное окно размером в четверть площади области в свернутом состоянии. После нажатия ле¬вой клавиши мыши над рабочей областью временное окно распахивается в центре области, а после нажатия правой - сворачивается в центре.
  241. 17. Центр рабочей области окна занимает временное окно размером в четверть площади области. Оно перемещается в тот угол рабочей об¬ласти, где щелкнули левой клавишей мыши. А после щелчка правой клавишей мыши временное окно перемещается в угол, противоположный текущему углу.
  242. 18. Окно приложения занимает четверть экрана и расположено в левом верхнем углу. Создать временное окно такого же размера в правом нижнем углу экрана. Любое окно после нажатия левой клавиши мыши перемещается в свободный по ходу часовой стрелки угол.
  243. 19. Окно размером в четверть площади экрана расположено в центре экрана. После нажатия левой клавиши мыши окно несколько раз меняет подсветку и перемещается в угол экрана так, что курсор мыши оказывается за пределами окна.
  244. 20. При запуске не первого экземпляра приложения выдать преду¬преждающий звуковой сигнал и сообщить о количестве уже работающих копий этого приложения. Запустить экземпляр, только если согласи! пользователь.
  245. 21. В рабочей области окна приложения рядом друг с другом расположить 4 временных окна, в заголовках которых указан номер окна. После нажатия левой клавиши мыши временное окно выдает сообщение! содержащее номер окна.
  246. 22. Правый верхний угол рабочей области окна приложения занимает! временное окно размером в четверть этой области. После нажатия левой клавиши мыши над рабочей областью окна приложения временное окно сворачивается в пиктограмму в левом нижнем углу, а после нажатия левой - распахивается в правом верхнем углу рабочей области.
  247. 23. В углах рабочей области окна приложения созданы невидимые временные окна с заголовком. Каждое окно становится видимым после нажатия левой клавиши мыши над его частью рабочей области и становится невидимым после нажатия левой клавиши мыши над его рабочей областью.
  248. 24. Окно приложения размером в четверть площади экрана занимает один из углов экрана. После нажатия левой клавиши мыши окно свора¬чивается в пиктограмму. После щелчка по пиктограмме оно восстанав¬ливается в другом углу экрана.
  249. 25. При запуске приложения показать окна уже существующих копий •того приложения и спросить пользователя, нужно ли запустить еще один экземпляр. Если пользователь ответит "Да", то запустить его. Ина¬че завершить работу приложения.
Add Comment
Please, Sign In to add comment