суббота, 26 сентября 2009 г.

Управление интерфейсом Windows

Если вы знакомы с диалоговым окном "свойства экрана", то знаете, что с его помощью можно изменить интерфейс Windows. Ну а если вашей программе понадобятся определённые настройки интерфейса (например, определённое разрешение экрана), то лучше самостоятельно их установить, чем просить об этом пользователя. А я помогу "научить" программу этому делу.

Основные параметры интерфейса Windows - это картинка рабочего стола, заставка, разрешение экрана, и скорость обновления монитора. С помощью HiAsm вы в силах создать программу, которая будет изменять все эти настройки.

Необходимые компоненты находятся в HiAsm на вкладке "Система", в группе "Компоненты". Тут есть три компоненты со значками в виде экрана, они-то нам и нужны. Установите первый из них (Desktop) на рабочее поле HiAsm.

Как видите, он устанавливает картинку рабочего стола. Можно указать в качестве картинки файл, можно передать картинку в потоке. Про работу в HiAsm с картинками я уже писал. Так что в потоке передать картинку вы наверняка сможете. Но стоит помнить, что при этом она просто сохраняет в файл во временной папке и оттуда устанавливается как обои. А при очистке временной папки - удаляется. Поэтому лучше указывать известный файл на диске.



Компонент Desktop может получить имя файла текущей картинки, чем мы и воспользовались. И при каждом кизменении картинки она будет отображаться у нас на форме.
У компонента Desktop есть ещё параметр Style, который определяет стиль размещения картинки на рабочем столе. Рассмотрите его самостоятельно.

В диалоге открытия файлов всгде сначала будет показываться содержимое папки C:\WINDOWS\Web\Wallpaper, потому что именно там лежат картинки, которые берутся для обоев в диалоге "свойства экрана". А задаётся это в параметре StartDir компонента ODialog.


Теперь перейдём к HiAsm'овскому компоненту Screen, он следующий за Desktop. Этот компонент управляет разрешением экрана и частотой его обновления. Помимо этого он может получать текущие значения.



В этой схеме HiAsm при запуске программы (событие формы onCreate) во все поля устанавливаются значения, и вы узнаете ширину, высоту и частоту обновления экрана. При нажатии кнопки "Применить" устанавливается новая ширина и высота экрана. Но не любую можно установить, а только ту, которая поддерживается вашим монитором.

Чтобы выяснить, какие режимы поддерживаются вашим монитором, есть метод doEnum компонента HiAsm Screen. Однако перед его использованием нужно установить маску вывода значений. Она задаётся в параметре EnumMask. В описании этого параметра есть все необходимые сведения. Можно, конечно, оставить маску по умолчанию. Вот вариант схемы.



Вот здесь кнопка "Режимы" перечисляет все возможные режимы монитора.

Теперь перейдём к заставке (скринсейверу). HiAsm позволет управлять заставками при помощи компонента SCR. Методы компонента SCR хорошо описаны в подсказках HiAsm, а пример я сейчас покажу.



Из этой программы HiAsm вы можете запустить заставку, а можете отключить её (тогда она автоматически запускаться не будет) или включить.

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



Здесь пока не используется компонент HiAsm SCR, потому что он не умеет запускать предпросмотр заставки.
Первым делом при входе в программу начинается поиск файлов с расширением scr (имеено такое имеют заставки) в папке C:\WINDOWS\system32, ведь именно там лежат заставки. Имена найденных файлов выдаются в список, у которого параметр ReadOnly=True (да и у формы некоторые параметры изменены).

По событию выпадающего списка onClick в поток выдаётся имя (параметр списка DataType=String). При этом происходит соединение строк "/p" и идентификатор окна компонента Image. Да, визуальный компонент является окном, и у него есть идентификатор. Но точка свойств для его получения спрятана на вкладке "Точки" панели парметров.

Однако картинки на форме две, потому что одна - декоративная (обрамление монитора), а во второй должна показываться заставка. Она тоже имеет рисунок, но при выборе заставки из списка вместо рисунка появляется заставка.

Чтобы так происходило, заставку нужно запустить файл заставки с параметром /p и идентификатором окна, в котором нужно отрисовать заставку. Сцепляются именно эти парметры в компонента StrCat (причём после /p обязательно ставится пробел). А потом происходит запуск файла заставки.

Однако если вы здесь выберете заставку несколько раз, то новые заставки будут просто поверх старых, потому что старые остаются открытыми. Это мы исправим, и я приведу полный код схемы HiAsm, а вы попытайтесь разобраться в нём без подсказок. Он будет довольно большим. По многим компонентам и приёмам из него я напишу потом отдельные статьи.



2 комментария:

  1. Пример с выбором заставок чреват тем, что просматривая в нем имеющиеся заставки можно не заметить, как изменить существующие настройки (именно так у меня получилось).
    А изменять разрешение экрана при том многообразии типов экранов, что сейчас у пользователей, - это бегать по минному полю с закрытыми глазами...
    В разделе компонентов Система мне понравился компонент, переключающий языки ввода. Случается так, что индикатор языковой панели пропадает - и Вы в полном неведении, какой язык будете набирать.
    Отсюда пример утилитки, выдающей язык ввода на индикатор Scroll Lock:
    Add(KeyboardLayout,16534512,196,105)
    {
    }
    Add(BitBtn,11480063,112,105)
    {
    Left=10
    Top=10
    Color=15780518
    Caption="English"
    link(onClick,15293190:doEvent1,[(152,111)(152,83)])
    }
    Add(BitBtn,9672189,112,154)
    {
    Left=10
    Top=50
    Color=255
    Caption="Русский"
    link(onClick,9508717:doEvent1,[])
    }
    Add(LedKey,11053175,350,105)
    {
    Point(doScrollLockOff)
    }
    Add(Hub,9508717,161,154)
    {
    link(onEvent1,16534512:doRussianKbd,[(185,160)(185,118)])
    link(onEvent2,11053175:doScrollLock,[(263,167)(263,125)])
    }
    Add(Hub,15293190,161,77)
    {
    link(onEvent1,11053175:doScrollLockOff,[(252,83)(252,132)])
    link(onEvent2,16534512:doEnglishKbd,[(185,90)(185,111)])
    }

    ОтветитьУдалить
  2. Строго говоря, для включения этой лампочки нужно использовать метод doScrollLockOn, а если используется doScrollLock, то в потоке нужно передать 0 для выключения и 1 для включения. В Вашем примере ничего не передано, и это интерпретируется как 1 (так уж заведено в HiAsm). У кнопки есть параметр Data для задания данных, передаваемых в потоке.

    ОтветитьУдалить