Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 [ 177 ] 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242

15.16. Обработка событий масштабирования в Тк

Проблема

Вы написали программу на базе Тк, но при измеиении размеров окна пользователем нарушается порядок элементов.

Решение

Перехватывая событие Configure, можно запретить пользователю изменять размеры окна;

use Тк;

$main = MainWindow->new();

$main->bind(<Configure> -> sub { $xe = $main->XEvent; $main->maxsi2e($xe->w, $xe->h), $main->minsi2e($xe->w, $xe->h);

Пример 15.7 (продолжение)

П Команды вашей программы $main = MainWindow->new();

$main->Button( -text => Make A Warning",

-command => \&make warning) ->pack(-side => "left"); $main->Button( -text => "Ouif,

-command => sub { exit } ) ->pack(-side => "left");

MainLoop;

# Фиктивная подпрограмма для выдачи предупреждения

sub make warning { my $a;

my $b = 2 . $a;

> Смотри также-

Страница руководства Tk:;DialogBox в документации по модулю Тк с CPAN; страница руководства тепи{п) (еслн она есть).



15.16. Обработка событий масштабирования в Тк 549

Кроме того, можно определить особенности масштабирования элементов при изменении размеров контейнера с помощью метода раек:

$widget->pack( -fill => "both", -expand => 1 ), $widget->pack( -fill => "x, -expand => 1 );

Комментарий

По умолчанию упакованные элементы изменяют размеры вместе с контейнером - они не масштабируют себя или свое содержимое в соответствии с новым размером. В результате между элементами возникают пустые места, а их содержимое обрезается или искажается.

Первое решение - вообще запретить изменение размеров. Мы перехватываем событие <Conf igure>, которое возникает при изменении размера или положения элемента, и регистрируем косвенно-вызываемую функцию (callback) для восстановления прежнего размера окна. Именно так обеспечивается фиксированный размер окон с сообщениями об ошибках.

Иногда запрещать изменение размеров окна нежелательно; в этом случае необходимо определить, как каждый элемент должен реагировать на изменения. Для этого используются аргументы метода раек: -fill управляет той областью, внутри которой должен находиться элемент, а -expand говорит о том, должен ли элемент изменять свой размер для заполнения доступного места. Параметр -expand принимает логические значения, true или false. Строковый параметр -fill обозначает оси, по которым может изменяться размер элемента: "х", "у", "both" или "попе".

Для правильной работы необходимы оба параметра: -expand без -fill не узнает, в какой области должен увеличиваться элемент, -fill без -expand захватит область нужного размера, но сохранит прежние размеры.

Разные части вашего приложения ведут себя по-разному. Например, главная область Web-броузера при изменении размера окна, вероятно, должна изменить свои размеры в обоих направлениях. Метод раек для такого элемента выглядит так:

$mainarea->pack( -fill => both, -expand => 1);

Однако меню, расположенное над главной областью, может расшириться по горизонтали, но не по вертикали:

$menubar->pack( -fill => "х , -expand => 1 );

С изменением размеров связана и другая задача - закрепление элементов в определенной точке контейнера. Например, полоса меню закрепляется в левом верхнем углу контейнера следующим образом:

$menubar->pack (-fill => "х", -expand => 1, -anchor => "nw" );

Теперь при изменении размеров окна меню останется иа своем месте и не будет выровнено по центру пустой области.

t> Смотри также-

Страницы руководства рас(п), XEvent(3) и XConfigureEvent(3) (если есть).



15.17. Удаление окна сеанса DOS в Рег1/Тк для Windows

Проблема

Вы написали программу для Windows-версии Perl и Тк, однако при каждом запуске программы открывается окно DOS-сеанса.

Решение

Запускайте программу из другого сценария Perl. В примере 15.8 содержится пример загрузчика, который запускает программу realpmgram без окна DOS.

Пример 15.8. loader

#!/usr/bin/perl -w

# loader - запуск сценариев Perl без раздражающего окна DOS use strict;

use Win32;

use Win32::Process;

# Создать объект процесса.

Win32--Process::Create($Win32::Process:iCreate::Process0b],

C-/perl5/bin/perl.exe, # Местонахождение Perl

perl realprogram, «

0, # He наследовать

DETACHED PROCESS, »

) or # Текущий каталог die print error();

sub print error() {

return Win32: :Forit)atMessage( Win32: :GetLastError() );

Комментарий

Программа проще, чем кажется. Окно DOS появляется потому, что интерпретатор Perl был откомпилирован как консольное приложение. Для чтения из STDIN и записи в STDOUT ему нужно окно DOS. Это нормально в приложениях, работающих в режиме командной строки, но если все общение с пользователем организовано с помощью Тк, то окно DOS не понадобится.

Загрузчик использует модуль Win32::Process для запуска программы в качестве нового процесса. Этот процесс отделяется от текущего, поэтому при завершении загрузчика окно DOS пропадет вместе с ним. Ваша программа будет прекрасно работать, не отягощенная пережитками прошлого.

Если произойдет какая-нибудь беда и программа не запустится, загрузчик умрет с выдачей сообщения об ошибке Windows.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 [ 177 ] 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242