Хранитель экрана на visual basic


Содержание

Объект Screen для пользователей Visual Basic 6.0

Читайте также:

  1. Basic Assumptions of Relevance Theory
  2. Basic compound of any real estate
  3. Basic elements of cadastral system
  4. Basic English [ for Computing 1 страница
  5. Basic English [ for Computing 10 страница
  6. Basic English [ for Computing 11 страница
  7. Basic English [ for Computing 12 страница
  8. Basic English [ for Computing 2 страница
  9. Basic English [ for Computing 3 страница
  10. Basic English [ for Computing 4 страница
  11. Basic English [ for Computing 5 страница
  12. Basic English [ for Computing 6 страница

Основные свойства и методы объектов Screen. Примеры

Свойства объектаScreen описаны в таблице:

Свойство Описание
ActiveControl Возвращает ссылку на элемент управления, находящийся в фокусе
ActiveDatasheet Возвращает ссылку на таблицу, находящуюся в фокусе.
ActiveForm Возвращает ссылку на форму, находящуюся в фокусе.
ActiveReport Возвращает ссылку на отчет, находящийся в фокусе.
Application Возвращает ссылку на объектApplication.
MousePointer Устанавливает или возвращает значение, которое определяет тип курсора мыши, отображаемого в данный момент
Parent Возвращает ссылку на объект, содержащий объектScreen.
PreviousControl Возвращает ссылку на предыдущий находившийся в фокусе элемент управления.

При использовании объектаScreen целесообразно реализовать обработку ошибок, так как при выполнении Вашего кода в фокусе может оказаться не тот объект. Вероятно, лучше сначала применить метод SetFocus формы, отчета или элемента управления для установки фокуса ? тогда Вы будете уверены, что в фокусе находится именно тот объект, который Вам нужен. Кроме того, старайтесь не использовать объект Screen с методомOutputTo объектаDoCmd.

СвойстваActiveForm и Me не обязательно возвращают ссылку на одну и ту же форму. Свойство Me представляет форму, чей код выполняется в данный момент, а свойствоActiveForm возвращает ссылку на форму, активную на экране, и это не всегда та форма, чей код сейчас выполняется. Допустим для примера, что в неактивной форме произошло событие Timer. Тогда свойство Me позволит сделать ссылку на форму, в которой произошло событие Timer, а свойствоActiveForm ? на форму, которая активна на экране в момент возникновения (и обработки) этого события.

В следующем примере событие Timer используется для обновления данных на активной форме через регулярные интервалы. Форма, в которой происходит событие Timer, может быть (а может и не быть) активной.

Private Sub Form_Load( )
═════Me.Timer-Interval = 30000
End Sub

Private Sub Form_Timer( )
═════Const conFormNotActive As Integer =2475
═════Const conFormInDesignView As Integer = 2478

═════On Error GoTo Error_Timer
═════? периодически запрашиваем источник записей «в интересах» активной формы
═════Screen .Active Form. Requery

═════Exit_Timer;
Exit Sub

Error_Timer:
═════If Err = conFormNotActive Or Err = conFormInDesignView Then
══════════Resume Exit_Timer
═════Else
══════════MsgBox Err & «: » & Err. Description
═════End If
End Sub

В Visual Basic 6.0 объект Screen предоставляет доступ к активной форме и элементу управления приложения, предоставляет сведения об области экрана, в которой отображается приложение, и позволяет изменять внешний вид курсора.

Дата добавления: 2014-12-23 ; Просмотров: 356 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Пишем простой cкринсейвер

Скринсейвер (или хранитель экрана) — это, по сути, обычная программа, в которой определены несколько специальных процедур для обработки сообщений, посылаемых ОС, при запуске и конфигурировании скринсейвера.
Программы-скринсейверы обычно хранятся в директории %WINDIR%\System32 и обладают расширением .scr. Таким образом, при переходе на страницу выбора заставки, Windows ищет в системной директории все файлы с соответствующим расширением и формирует из них список возможных скринсейверов. Также следует упомянуть несколько важных аспектов написания.

– Скринсейвер должен экспортировать функции ScreenSaverConfigureDialog, ScreenSaverProc.
– Название скринсейвера в окне настройки определяется строковым ресурсом с идентификатором IDS_DESCRIPTION, который должен быть равен 1.
– Идентификатор диалогового окна, которое будет появляться при нажатии клавиши «Параметры», т.е. при попытке настроить скринсейвер, должен быть DLG_SCRNSAVECONFIGURE и равняться числу 2003.
– Программа также должна содержать реализацию функции RegisterDialogClasses.

В принципе, почти всё это описано в MSDN. В нашем скринсейвере будет изображена вращающаяся изометрическая проекция куба. Выглядеть результат будет следующим образом:

Экран выбора скринсейвера

Теперь рассмотрим сам код. Для начала подключим необходимые файлы, укажем lib-файлы, необходимые при линковке, и определим несколько констант.

Простой ScreenSaver на C#

Сегодня попытаемся написать простенькую заставку для ОС Windows на языке программирования C#. Прошу меня строго не судить, т.к. я не специализируюсь в программировании на данном языке. Иногда, для разнообразия, пишу по мелочам на нем ;-).

В качестве среды разработке мы воспользуемся Microsoft Visual Studio 2015. А также нам понадобятся такие файлы как изображение для нашего логотипа (например, размером 300×300 пикселей и в формате png) и любая иконка (16×16 пикселей) в формате ico.

Я не буду описывать все подробно, а остановлюсь лишь на важных моментах. Для удобства исходный код максимально покрою комментариями.

Итак, при первом запуске среды разработки создаем приложение типа Windows Forms Application. Для названия проекта и его решения я выбрал следующее название — SampleScreenSaver. Имя файла основной формы мы изменим на FormMain. Дополнительно добавим еще одну форму в наш проект и назовем ее как FormConfigure.

Свойства формы FormMain

Название свойства Значение свойства
(Name) frmMain
FormBorderStyle None
BackColor White
WindowState Maximized

Я не стал описывать подробнее указанные свойства, т.к. здесь все итак понятно. При возникновении вопросов всегда существует возможность воспользоваться справочной системой среды программирования (клавиша F1).

Рис. 1. Пример расположения элементов управления на основной форме

Свойства элемента управления PictureBox


Название свойства Значение свойства
(Name) pbLogo
BackColor Transparent
Image ваш файл с изображением
SizeMode AutoSize

Пример моего изображения см. на рис. 1.

Свойства элемента управления Label

Название свойства Значение свойства
(Name) lblCopyright
ForeColor Silver
Text Программирование и не только

Свойства элемента управления Timer

Название свойства Значение свойства
(Name) tmrTimer
Interval 300

Свойства формы FormConfigure

Название свойства Значение свойства
(Name) FormConfigure
Icon ваш файл с иконкой
ShowInTaskbar false
Text Настройки
StartPosition CenterScreen
MaximizeBox false
MinimizeBox false

Сразу скажу, насчет формы FormConfigure, я не предусматриваю какие-либо настройки для нашей заставки. При желании вы самостоятельно сможете добавить свои настройки (например, сохранять значения настроек в реестре Windows).

Пришла очередь рассмотреть исходный код форм и нашего проекта.

Файл Program.cs.

Файл FormMain.cs.

Файл FormConfigure.cs.

Сразу размещаю исходный код полного проекта SampleScreenSaver.

Последним этапом останется выполнить вашу программу и перейти в директорию с проектом, затем в папку obj, а потом в Debug. Внутри каталога Debug найти EXE-файл и переименовать его расширение в SCR (в моем случае это файл с именем SampleScreenSaver.exe).

Вот такой получился небольшой пример по созданию скринсейвера на языке программирования C#. Конечно же, я предполагаю, что многие вещи можно было бы сделать более элегантно, но не судите строго, т.к. в этом вопросе я не являюсь экспертом. В то же время постарался изложить материал так, чтобы было понятно многим.

Спасибо за внимание и до новых встреч.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Простой скринсейвер с использованием библиотеки CImg, C++

Доброго времени суток!
На этой неделе опубликовал статью, где привел краткое описание основных методов библиотеки CImg и разобрал простейший пример. Не скрою, пост был предназначен для инвайта, но тем не менее, старался сделать его как можно более информативным. Собственно говоря, как и было запланировано ранее и учитывая пожелание skor, решил попробовать написать элементарный скринсейвер с применением CImg. Стало интересно — добро пожаловать под кат!

Предисловие

Сразу оговорюсь, программа не претендует на «звание» полноценного хранителя экрана. Целью было попытаться разобрать более сложный пример использования вышеупомянутой библиотеки.

Ввод и вывод информации на языке Visual Basic

Ввод и вывод данных в процессе выполнения проекта может производиться различными способами:

1) вывод на форму методом Print, как в предыдущих программах;

2) с помощью всплывающих окон ввода и вывода информации. Для этого используются функции Окно ввода (InputBox) и Окно сообщений (MsgBox);

3) с помощью текстовых полей, применяя значения свойства Text.

Рассмотрим эти способы.

Диалоговое окно ввода информации InputBox

Это окно (рисунок 1) позволяет ввести определенную информацию, которая затем используется программой, и нажать кнопки выбора действия.

Рисунок 1 – Вид окна ввода

Функция InputBox имеет следующий синтаксис:

InputBox (prompt [, title] [, default] [, xpos] [, ypos] [, helpfile, context])


Где prompt – текст сообщения в диалоговом окне с максимальной длиной 1024 символа;

title – текст заголовка диалогового окна;

default – значение текстового поля ввода по умолчанию. Если параметр отсутствует, строка остается пустой;

xpos, ypos – позиция по горизонтали и вертикали левого верхнего угла диалогового окна относительно левого верхнего угла экрана. По умолчанию присваивается значение, соответствующее середине экрана;

helpfile, context – ссылка на файл и содержание справочной системы.

Диалоговоеокно вывода сообщения MsgBox

Диалоговое окно сообщения вызывается из программы командой MsgBox или с помощью аналогичной функции MsgBox. Отличаются они только наличием или отсутствием круглых скобок. Большинство компонентов этой функции совпадают по значению с InputBox.Функция MsgBox имеет следующий синтаксис:

MsgBox (prompt[, buttons] [, title] [, helpfile, context])

где buttons – числовое выражение, которое задает параметры для кнопок управления и значков в диалоговом окне и составлено из констант, указанных в таблице 2.2. Если значение не указано, то по умолчанию присваивается 0. Для задания нескольких параметров кнопок и значков одновременно соответствующие константы складываются.

Таблица 2 – Константы параметров для значков окна вывода MsgBox

Константа Значение Тип сообщения
vbExclamation Предупреждение
vbQuestion Запрос
vbInformation Информация
vbCritical Ошибка

В диалоговых окнах сообщения можно управлять отображаемыми в окне сообщения кнопками и реакцией на их нажатие при открытии окна. Для этого используются константы из таблицы 2.3.

Таблица 3 – Константы параметров наличия кнопок в окне вывода MsgBox

Константа Значение Кнопки в диалоговом окне
vbOkOnly OK
vbOkCancel OK, Отмена
vbAbortRetryIgnore Стоп, Повтор, Пропустить
vbYesNoCancel Да, Нет, Отмена
vbYesNo Да, Нет
vbRetryCancel Повтор, Отмена

3 Методика и порядок выполнения работы

1. Изучите теоретическое обоснование.

2. Выполните пример 1: Для любых значений х и у, введенных с клавиатуры в текстовые поля, вычислить значения функций .

Алгоритм решения задачи представлен на рисунке 2.

Для создания приложения:

· Загрузите интегрированную среду Visual Basic.

· Разместите на форме кнопку запуска перетащив с панели инструментов элемент CommandButton и в свойствах объекта Name задайте имя Сmd1 с надписью «Пуск» в свойстве Caption.

· В соответствии с рисунком 3 разместите на форме четыре элемента и задайте им имя x, y, z ,f .

Для этого: на Панели инструментовщелкните и растяните на форме окошки с меткой произвольной формы. В окне Свойства объекта установите значения свойств: BackColor (цвет фона) – серый, ForeColor (цвет надписи) – черный, Font – размер шрифта 18, Alignment (выравнивание) – Сenter.

Рисунок 3 – Вид формы для примера 1

В свойстве Caption напишите «х=» для первого элемента «у=» для второго, «Результат z=» — для третьего, «Результат F=» — для четвертого. Для фиксирования выбранных значений щелкните на свободном месте формы. Справа от созданной метки растяните на форме текстовое поле Textl, используя кнопку на Панели инструментов. В окне Свойств объекта оставьте Text1 в свойстве Name и удалите его из свойства Text для первого окна, для второго проделайте то же самое, но только оставьте Text2, для третьего – Text3, для четвертого – Text4. Можно также произвольно изменить значения свойств: ForeColor, Font, Alignment.

Аналогично разместите на форме еще два элемента TextBox и задайте им имена y, z. В результате форма примет вид, представленный на рисунке 3.

· Дважды щелкните по командной кнопке с надписью Пуск для ввода программного кода:

Private Sub Cmd1_Click()

Dim x, y, z, f As Single

z = 0.5 * Sin(x ^ 3) + 2.5 * Exp(2 * y)

f = (4 * x — z ^ (1 / 3)) / Sqr(y)

Пояснение:в роли перемененных могут выступать свойства различных объектов VB, например, свойство Text объекта Текстовое поле. Такие переменные записываются с применением точки, например: х.Text, у.Text. Тип любого свойства изменять нельзя, – он жестко закреплен за данным свойством, например, свойство Caption (надпись на объекте) имеет тип String. Тип String имеет и свойство Text объекта Текстовое поле. Поэтому «числа», которые вводятся в текстовые поля, – это не числа, а всего лишь строки цифр. Для того чтобы использовать эти «числа» в арифметических действиях, их нужно преобразовать в «настоящие» числа. Делается с помощью функции Val. Обратное преобразование (числа в строку) производится с помощью функции Str: если z1 – это число, то Str(z1) – это строка символов. При преобразовании строки в число производится ее просмотр слева направо до первого неправильного символа.

· Запустите приложение на выполнение, щелкнув по кнопке (Start) в командной строке. Исправьте ошибки. Если ошибок нет, на экране появится разработанная форма. В текстовое поле х и поле у введите любые числовые значения для вычисления по указанным формулам. Щелкните по командной кнопке Пуск, выполнится процедура Cmd1_Click и в поле z и f появится результат. Значение z и f будут выведены на форму, и в окна. Завершите работу программы с помощью кнопки (End).


3. Выполните пример 2.

Разработать проект для вычисления значения функций , для любых значений х и у, введенных с использованием Окна ввода (InputBox) . Вывести значения с использованием Окна сообщения (MsgBox).

Для создания приложения:

· Разместите на форме кнопку Сmd2_Click() с соответствующими заданием свойств нового объекта, по аналогии с кнопкой «Пуск», только с именем – Cmd2, и надписью «Пуск2».

Рисунок 4 – Вид формы для примера 2

· Создайте для командной кнопки Сmd2 программный код:

Private Sub Cmd2_Click()

Dim x, y, z, f As Single

x = InputBox(«Введите х»)

y = InputBox(«Введите y»)

z = 0.5 * Sin(x ^ 3) + 2.5 * Exp(2 * y)

f = (4*x — z^(1/3)) / sqr (y)

MsgBox z , , «Вывод значения функции z «

MsgBox f , , «Вывод значения функции f «

· Запустите приложение. Сравните результаты с примером 1.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Для студента самое главное не сдать экзамен, а вовремя вспомнить про него. 10041 — | 7504 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Настройки экранной заставки в Linux Mint

Привет, сегодня в статье мы рассмотрим основные параметры экранной заставки в операционной системе Linux Mint, а именно я покажу, как сменить экранную заставку, как полностью ее отключить, как изменить время ожидания перед запуском заставки, а также как отключить блокировку компьютера после запуска заставки.

Для начала давайте разберемся, что же такое «Экранная заставка»?

Что такое экранная заставка?

Экранная заставка (Screensaver) – это программа, которая запускается через определенное время бездействия компьютера и выводит на всем экране монитора статическую или анимированную картинку, тем самым заменяя изображение на экране, а также заставка позволяет отображать время или другую информацию, в случае необходимости можно вообще ничего не выводить, например, отображать только черный экран. У программ такого типа существуют и другие названия, например: хранитель экрана, скринсейвер или screensaver, но все это является одним и тем же, иными словами, назначение таких программ одинаковое.

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

На заметку! Если Вы обычный пользователь домашнего компьютера и хотите познакомиться с Linux поближе, рекомендую почитать мою книгу – « Linux для обычных пользователей », в ней я подробно рассказываю про основы операционной системы Linux

Экранная заставка в Linux Mint

Сразу скажу, что рассматривать настройки экранной заставки мы будем на примере версии Linux Mint 18.3 Cinnamon.

По умолчанию в Linux Mint экранная заставка настроена следующим образом: в качестве экранной заставки используется стандартный экран блокировки, на данном экране отображается время на черном фоне, запускается заставка через 15 минут бездействия компьютера, после запуска заставки компьютер блокируется немедленно. Выглядит заставка следующим образом.

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

Как открыть настройки экранной заставки в Linux Mint 18.3?

Все настройки экранной заставки в Linux Mint расположены в параметрах системы, они так и называются «Экранная заставка». Для того чтобы запустить параметры системы нажмите «Меню->Параметры системы».

Затем в разделе «Параметры» найдите пункт «Экранная заставка».


Также можно запустить параметры экранной заставки и другим способом, например, сразу в меню найти данный пункт. Он находится также в параметрах.

В итоге у Вас отобразятся настройки экранной заставки Linux Mint.

Как сменить экранную заставку в Linux Mint?

Для того чтобы сменить экранную заставку просто в настройках на первой вкладке выбирайте подходящую заставку из представленного перечня.

Как изменить время ожидания перед запуском заставки?

Для того чтобы изменить время ожидания перед запуском, в настройках экранной заставки на вкладке «Настройки», измените параметр задержки на нужное Вам значение. В случае если Вы выберите значение «Никогда», то экранная заставка запускаться не будет, т.е. будет отключена.

Как отключить блокировку компьютера после запуска заставки в Linux Mint?

Если Вы хотите, чтобы компьютер не блокировался после запуска заставки, то в настройках экранной заставки на вкладке «Настройки», в разделе «Настройки блокировки», выключите соответствующий параметр.

На вкладке «Настроить» есть еще несколько полезных параметров, например, Вы можете отобразить на стандартном экране блокировки рядом с часами свое собственное сообщение или сделать так, чтобы часы вообще не отображались.

Хранитель экрана

В этой лекции мы закрепим изученный ранее материал, создав с использованием XNA полнофункциональный хранитель экрана ( ScreenSaver ), который отображает на экране фейерверк: вращающийся круг, из которого вылетает множество разноцветных искр (рисунок 4.1).

Илон Маск рекомендует:  Что такое код components

Что такое хранитель экрана? Это приложение , автоматически запускаемое Windows по истечению определенного срока бездействия компьютера. Изначально использование хранителя экрана было обусловлено сугубо практическими соображения: первые мониторы обладали весьма ограниченным ресурсом, в результате чего длительное отображение статичного изображения приводило к выгоранию люминофора в определенных местах и, соответственно, «запоминанию» монитором этого изображения 1 Например, длительное отображение панелей Norton Commander приводило к выжиганию в люминофоре монитора «изображения» данных панелей . Современные мониторы обладают значительно более продолжительным сроком службы, поэтому в настоящее время хранитель экрана скорее выполняет декоративную роль.

Технически хранитель экрана представляет собой исполняемый exe -файл с расширением . scr . Запуская хранитель экрана, Windows предает ему один из трех параметров командной строки, перечисленных в таблице 4.1. Разработчики C++ обычно создают хранители экрана с использованием библиотеки Scrnsave.lib (или Scrnsavw.lib ), которые самостоятельно обрабатывают параметры командной строки и реализуют завершение работы хранителя экрана при перемещении мыши, нажатии клавиши и т.п. Фактически разработчику необходимо лишь переопределить обработчик события WM_PAINT и реализовать код диалогового окна.

К справедливости следует отметить, что реализация диалогового окна средствами Win32 API является далеко не самой приятной задачей.

Таблица 4.1. Параметры командой строки хранителя экрана
Параметр командной строки Описание
/s Запускает хранитель экрана в обычном режиме
/c Показывает диалоговое окно конфигурации хранителя экрана. n – дескриптор родительского диалогового окна Display Properties
/p Запускает хранитель экрана в окне предварительного просмотра с дескриптором n .
Нет параметров Показывает диалоговое окно конфигурации хранителя экрана

В настоящее время .NET Framework 2.0 не содержит аналога библиотеки Scrnsave.lib , поэтому нам придется реализовывать всю функциональность самим. Это далеко не такая тривиальная задача, как хотелось бы, но и отнюдь не архисложная. Так что в путь !

В состав Visual Studio 2005 Pro входит Screen Saver Starter Kit , позволяющий создать проект готового хранителя экрана буквально одним щелчком мыши. Но, к сожалению, Screen Saver Starter Kit имеет ряд недоделок 2 Например, не реализована возможность отображения хранителя экрана в окне предварительного просмотра и даже ошибок, поэтому мы не будем его использовать.

4.1. Реализация вращающегося диска

Учитывая сложность стоящей перед нами задачи, мы разобьем ее на несколько этапов. Начнем мы с визуализации вращающегося цветного диска. Создайте новый проект Windows Forms , установив в диалоговом окне New Project флажок Create directory for solution (в последствие мы добавим в решение проект инсталлятора). Нам придется выполнять визуализацию как в полноэкранном режиме, так и в окне предварительного просмотра, поэтому весь код визуализации будет логично разместить в отдельном классе. Добавьте в проект новый класс Firework (Project | Add Class) .

Внутри класса Firework могут возникать критические исключения (например, при инициализации графического устройства). Обрабатывать в коде, использующем класс Firework , разношерстные исключения вроде ошибки создания графического устройства дольно утомительно, поэтому класс Firework будет перехватывать низкоуровневые исключения и генерировать свое собственное исключение FireworkException с ясным описанием причины возникновения ошибки.

Глава 4. Хранитель экрана

    Алексей Дверницкий 2 лет назад Просмотров:

1 Сергей Гайдуков Глава 4. Хранитель экрана В этой главе мы закрепим изученный ранее материал, создав с использованием XNA полнофункциональный хранитель экрана (ScreenSaver), который отображает на экране фейерверк: вращающийся круг, из которого вылетает множество разноцветных искр (рисунок 4.1). Что такое хранитель экрана? Это приложение, автоматически запускаемое Windows по истечению определенного строка бездействия компьютера. Изначально использование хранителя экрана было обусловлено сугубо практическими соображения: первые мониторы обладали весьма ограниченным ресурсом, в результате чего длительное отображение статичного изображения приводило к выгоранию люминофора в определенных местах и, соответственно, запоминанию монитором этого изображения 1. Современные мониторы обладают значительно более продолжительным сроком службы, поэтому в настоящее время хранитель экрана скорее выполняет декоративную роль. Рисунок 4.1. Хранитель экрана. Технически хранитель экрана представляет собой исполняемый exe-файл с расширением.scr. Запуская хранитель экрана, Windows предает ему один из трех параметров командной строки, перечисленных в таблице 4.1. Разработчики C++ обычно разрабатывают хранители экрана с использованием библиотеки Scrnsave.lib (или Scrnsavw.lib), которые самостоятельно обрабатывают параметры командной строки и реализуют завершение работы хранителя экрана при перемещении мыши, нажатии клавиши и т.п. Фактически разработчику необходимо лишь переопределить обработчик события WM_PAINT и реализовать код диалогового окна. Примечание К справедливости следует отметить, что реализация диалогового окна средствами Win32 API является далеко не самой приятной задачей. 1 Например, длительное отображение панелей Norton Commander приводило к выжиганию в люминофоре монитора изображения данных панелей. 1

2 Параметр командной строки Таблица 4.1. Параметры командой строки хранителя экрана Описание /s Запускает хранитель экрана в обычном режиме. /c:n Показывает диалоговое окно конфигурации хранителя экрана. n дескриптор родительского диалогового окна Display Properties. /p n Запускает хранитель экрана в окне предварительного просмотра с дескриптором n. Нет параметров Показывает диалоговое окно конфигурации хранителя экрана. В настоящее время.net Framework 2.0 не содержит аналога библиотеки Scrnsave.lib, поэтому нам придется реализовывать всю функциональность самим. Это далеко не такая тривиальная задача, как хотелось бы, но и отнюдь не архисложная. Так что в путь! Примечание В состав Visual Studio 2005 Pro входит Screen Saver Starter Kit, позволяющий создать проект готового хранителя экрана буквально одним щелчком мыши. Но, к сожалению, Screen Saver Starter Kit ряд недоделок 2 и даже ошибок, поэтому мы не будем его использовать Реализация вращающегося диска. Учитывая сложность стоящей перед нами задачи, мы разобьем еѐ на несколько этапов. Начнем мы с визуализации вращающегося цветного диска. Создайте новый проект Windows Forms, установив в диалоговом окне New Project флажок Create directory for solution (в последствие мы добавим в решение проект инсталлятора). Нам придется выполнять визуализацию как в полноэкранном режиме, так и в окне предварительного просмотра, поэтому весь код визуализации будет логично разместить в отдельном классе. Добавьте в проект новый класс Firework (Project Add Class). Внутри класса Firework могут возникать критические исключения (например, при инициализации графического устройства). Обрабатывать в коде, использующем класс Firework, разношерстные исключения вроде ошибки создания графического устройства дольно утомительно, поэтому класс Firework будет перехватывать низкоуровневые исключения и генерировать своѐ собственное исключение FireworkException с ясным описанием причины возникновения ошибки. Листинг 4.1. class FireworkException : Exception public FireworkException(string message) : base(message) Для визуализации круга классу Firework необходимо загрузить и скомпилировать эффект. Только вот где его хранить? Типовой хранитель экрана обычно состоит из одного файла с расширением.scr, поэтому использование дополнительного fx-файла является далеко не самой лучшей идеей. К счастью Visual Studio позволяет легко внедрить fx-файл непосредственно в exe-файл. Для этого включите в проект файл ColorFill.fx, используемый во всех примерах этой главы, и присвойте свойству Build Action этого файла значение Embedded Resource (рисунок 4.2). 2 Например, не реализована возможность отображения хранителя экрана в окне предварительного просмотра. 2

3 Рисунок 4.2. Внедрение fx-файла в сборку. Основные фрагменты кода класса Firework приведены в листинге 4.2. Листинг 4.2. // Полный текст примера находится на CD книги в каталоге Examples\Ch04\Ex01 ; // Количество сегментов в диске const int slices = 64; // Угловая скорость вращения диска (радиан в секунду) public const float diskspeed = 3.0f; // Радиус диска public const float diskradius = 0.015f; // Текущий угол поворота float diskangle = 0; // Дескриптор окна, на которое будет осуществляться визуализация // Конструктор. Принимает: // hwnd дескриптор окна в котором осуществляется визуализация. // scintillasize размер искр (пока игнорируется) // scintillainterval интервал между искрами (пока игнорируется) public Firework(IntPtr hwnd, float scintillasize, float scintillainterval) // Сохраняем дескриптор окна this.hwnd = hwnd; presentparams = new PresentationParameters(); presentparams.backbuffercount = 1; 3

4 presentparams.swapeffect = SwapEffect.Discard; presentparams.presentationinterval = PresentInterval.One; try GraphicsDeviceCapabilities caps = GraphicsAdapter.DefaultAdapter.GetCapabilities(DeviceType.Hardware); CreateOptions options = CreateOptions.SingleThreaded; if (caps.devicecapabilities.supportshardwaretransformandlight) options = CreateOptions.HardwareVertexProcessing; else options = CreateOptions.SoftwareVertexProcessing; device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, hwnd, options, presentparams); // Это исключение обычно генерируется при отключенном аппаратном ускорении в Display // Properties catch (DeviceNotSupportedException) // Перехватываем исключение и генерируем собственное исключение с более понятным описанием // проблемы throw new FireworkException(«Не могу создать устройство Direct3D»); decl = new VertexDeclaration(device, VertexPositionColor.VertexElements); diskvertices = new VertexPositionColor[slices + 2]; // Загружаем эффект из ресурсов сборки Stream effectstream = Assembly.GetExecutingAssembly().GetManifestResourceStream( effectfilename); // Выполняем компиляцию эффекта CompiledEffect compiledeffect = Effect.CompileEffectFromFile(effectStream, null, null, CompilerOptions.None, TargetPlatform.Windows); if (!compiledeffect.success) throw new FireworkException(String.Format( «Ошибка при компиляции эффекта: \r\n0», compiledeffect.errorsandwarnings)); effect = new Effect(device, compiledeffect.geteffectcode(), CompilerOptions.NotCloneable, null); if (!effect.currenttechnique.val >

5 double currenttime = (float)stopwatch.elapsedticks / (float)stopwatch.frequency; // Переменная delta принимает очень ограниченный диапазон значений, поэтому здесь вполне // можно обойтись типом float float delta = (float)(currenttime — lasttime); // Корректируем угол поворота диска diskangle += diskspeed * delta; // Рассчитываем новые координаты вершин диска diskvertices[0] = new VertexPositionColor(new Vector3(0.0f, 0.0f, 0.0f), XnaGraphics.Color.LightGray); for (int i = 0; i

6 private vo , MessageBoxButtons.OK, MessageBoxIcon.Error); Application. >

7 Начальный цвет искры будет совпадать с цветом диска в окрестностях появившейся искры. С течением времени искра постепенно затухает посредством уменьшения коэффициента непрозрачности, пока он не достигнет нуля, после чего искра считается потухшей. Всю эту функциональность разумно инкапсулировать в отдельном классе, вложенном в класс Firework (листинг 4.4). Листинг 4.4. >

8 // Определяем начальную скорость прямолинейного движения искры tspeed = MinSpeed + (float)firework.rnd.nextdouble() * (MaxSpeed — MinSpeed); // Угловая скорость движения вершины всегда в 4 раза меньше скорости диска rspeed = Firework.diskSpeed / 4.0f; // Рассчитываем начальный цвет искры (он должен совпадать с цветом диска) byte red = (byte)(255 * Math.Abs(Math.Sin((angle — diskangle) * 3))); byte green = (byte)(255 * Math.Abs(Math.Cos((angle — diskangle) * 2))); color = new Color(red, green, 128, 255); // Задаем оставшееся время жизни искры time = StartTime; // Обновляет состояние искры. delta время, прошедшее с момента последнего вызова метода // Update public void Update(float delta) // Если искра еще не потухла if (time > 0.0f) // Уменьшаем оставшееся время жизни искры time = time — delta; // Корректируем скорости прямолинейного и вращательного движений tspeed = Math.Max(tSpeed — tslowing * delta, 0.0f); rspeed = Math.Max(rSpeed — rslowing * delta, 0.0f); // Корректируем положение искры в пространстве distance += tspeed * delta; angle += rspeed * delta; Пользователь сможет управлять видом фейерверка искр посредством двух параметров: Размер искр. Максимальное количество искр, появляющихся каждые 5 миллисекунд (дискретный шаг, с которым выполняется моделирование логики работы хранителя экрана). Так как количество искр на экране постоянно меняется, встает вопрос хранения информации об искрах. В принципе, для этой цели вполне подходит обобщенный класс List за исключением пары нюансов: 1. Удаление элементов из середины списка является очень дорогой операцией. 2. Метод DrawUserPrimitives может визуализировать вершины исключительно из массивов. Однако преобразование списка List в массив посредством метода ToArray() сопряжено с выделением памяти, что в свою очередь может привести к частым вызовам сборщика мусора и, соответственно, провалам производительности. Первый недостаток мы обойдем достаточно хитро. Потухшие искры не будут удаляться из списка вместо этого информация о новых искрах будет просто заноситься в элементы списка с потухшими искрами, затирая их, и лишь при отсутствии таковых добавляться в конец списка. Для борьбы со вторым недостатком мы будем самостоятельно копировать содержимое списка в массив, при этом выделение памяти для массива будет производиться лишь при недостаточном размере целевого массива. В листинге 4.5 приведены фрагменты обновленного класса Firework с учетом вышеприведенных требований. Листинг 4.5. >

9 // Максимальное время между вызовами Update не должно превышать 1 секунды. Большие временные // интервалы игнорируются const float maxdelta = 1.0f; // Максимальное количество искр, которое может появиться за один дискретный шаг времени (5 // миллисекунд) int maxscintillacount; // Вероятность появления следующей искры const float scintillaprobability = 0.3f; // Размер искры float scintillasize; // Время, прошедшее с момента запуска приложения double lasttime = 0; // Список искр List scintillas; // Массив вершин для визуализации искр VertexPositionColor[] scintillasvertices = null; // Количество вершин, хранящихся в массиве int scintillasvertexсount = 0; // Генератор случайных чисел, используемый классами Firework и Scintilla public static Random rnd = new Random(); // Конструктор public Firework(IntPtr hwnd, float scintillasize, float scintillainterval) this.hwnd = hwnd; // Запоминаем пользовательские настройки this.scintillasize = scintillasize; this.maxscintillacount = maxscintillacount; // Создаем список вершин scintillas = new List (16); // Создаем массив вершин scintillasvertices = new VertexPositionColor[16]; // Обновляет сцену public vo > maxdelta) lasttime = currenttime — maxdelta; // Количество дискретных шагов timestep, которые необходимо выполнить int stepcount = (int)math.floor((currenttime — lasttime) / timestep); // Интервал между двумя вызовами метода Update, с учетом дискретности времени float delta = stepcount * timestep; // Поворачиваем диск diskangle += diskspeed * delta; // Корректируем положение вершин диска 9


10 // Моделируем движение искр с дискретным шагом времени for (int i = 0; i 0) // Увеличиваем счетчик не потухших искр scintillasvertexсount++; else // Если искра является потухшей // Пока не исчерпан лимит новых искр while (scintillacount > 0) // Пробуем добавить новую искру, поэтому уменьшаем счетчик искр scintillacount—; // Генерируем новую искру с вероятностью scintillaprobability if ((Firework.rnd.NextDouble() 0) scintillacount—; if ((Firework.rnd.NextDouble() scintillasvertices.length) // Удваиваем размер массива. Если размер удвоенного массива недостаточен, используем в 10

11 // качестве размера массива текущее количество вершин (на всякий случай перестраховываемся) scintillasvertices = new VertexPositionColor[Math.Max(scintillasVertexСount, scintillasvertices.length * 2)]; // Копируем информацию о искрах в массив вершин int k = 0; for (int i = 0; i 0) scintillasvertices[k] = scintillas[i].vertex; k++; // Визуализация сцены public vo > 0) device.drawuserprimitives(primitivetype.pointlist, scintillasvertices, 0, scintillasvertexсount); // Визуализируем вращающийся диск device.drawuserprimitives(primitivetype.trianglefan, diskvertices, 0, diskvertices.length — 2); Обработчик события Load формы также нуждается в косметической правке: private vo >

12 Начнем с клавиатуры нажатие любой клавиши клавиатуры должно немедленно завершать работу приложения (листинг 4.6). Листинг 4.6. private vo > 10) (Math.Abs(e.Location.Y — mouselocation.y) > 10)) // Завершаем работу приложения Close(); В процессе работы хранителя экрана некоторое приложение может вывести на экран диалоговое окно с важной информацией (например, Internet Explorer по окончанию загрузки файла). При этом окно хранителя экран теряет фокус, который переходит к новому диалоговому окну. Хранитель экрана, поверх которого 12

13 отображается диалоговое окно, будет выглядеть, мягко говоря, несколько странно, поэтому в качестве одного из критериев завершения работы хранителя экрана логично использовать потерю фокуса формой (листинг 4.8). Листинг 4.8. // Обработчик события Deactivate полноэкранной формы хранителя экран, завершающий работу // приложения при потере формой фокуса private vo 13

14 Теперь после каждой компиляции приложения будет вызываться команда copy, создающая копию exeфайла приложения с расширением.scr. Обратите внимание на получение имени exe-файла приложения посредством встроенного макроса $(TargetFileName), благодаря чему команда copy не привязана к фиксированному exe-файлу. Рисунок 4.3. Вкладка Build Events. Для проверки работоспособности хранителя экрана откройте каталог с.scr-файлом в файловом менеджере и вызовите его контекстное меню (рисунок 4.4). Как видно, контекстное меню любого исполняемого файла хранителя экрана содержит три пункта: Test запускает хранитель экрана на выполнение с ключом /s. Configure (Настроить) открывает окно конфигурации хранителя экрана. Install (Установить) открывает вкладку Screen Saver диалогового окна Display Properties и выбирает данный хранитель экрана в качестве текущего. Немного проигравшись с нашим хранителем экрана, вы заметите ряд недоделок. Например, при попытке открыть окно конфигурации ровным счетом нечего не происходит, а в окне предварительного просмотра (маленький дисплейчик ) диалогового окна Display Properties просто выводится изображение по умолчанию. А на компьютере с несколькими мониторами выяснится, что наш хранитель экрана активируется только основном мониторе. Что ж, работы нам предстоит ещѐ много. 14

15 Рисунок 4.4. Контекстное меню исполняемого файла хранителя экрана Поддержка нескольких мониторов. В настоящее время поддержка видеокартами двух мониторов уже стала нормой, поэтому любой уважающий себя разработчик должен позаботиться о корректном функционировании приложения на компьютере с несколькими мониторами. В частности, хранитель экрана должен показывать заставку на всех мониторах. Наиболее простое решение просто отображать на всех мониторах одно и то же изображение. Так как наш хранитель экрана представляет собой форму, развернутую на весь экран, в случае нескольких мониторов мы можем просто создать несколько экземпляров формы по одному на каждый монитор. Начнем с метода Main. Информация об экранных координатах всех мониторов системы храниться в коллекции AllScreens класса Screen. Соответственно приложение должно просто перебрать элементы этой коллекции и использовать полученную информацию при создании форм (листинг 4.11). Листинг static vo )) // Перебираем все мониторы foreach (Screen screen in Screen.AllScreens) // Создаем форму размеров во весь монитор FullscreenForm form = new FullscreenForm(screen); // Отображаем форму 15

16 form.show(); // Запускаем цикл обработки сообщений. Изображение форм будет обновляться посредством // обработчиков события >

17 // Пока в приложение не запущен цикл обработки сообщений, игнорируем событие Deactivate if (Application.MessageLoop) Application.Exit(); private void FullscreenForm_MouseDown(object sender, MouseEventArgs e) // Обратите внимание на завершение приложения посредством метода Application.Exit (вместо // Form.Close) Application.Exit(); Готовое приложение можно найти на CD книги в каталоге Examples\Ch04\Ex Диалоговое окно конфигурации хранителя экрана. Настало время подумать об управлении пользовательскими настройками хранителя экрана. Работа нашего хранителя экрана управляется двумя параметрами: размером искр и максимальным числом искр, вылетающих в течение кванта времени, равного 5 миллисекунд. Второй параметр не является интуитивно понятным, ведь рядовому пользователю намного проще регулировать количество искр посредством ползунка мало много. Поэтому мы пойдем на небольшую хитрость: количество искр будет задаваться целочисленным параметром плотность искр, лежащим в диапазоне от 0 (минимальное количество искр) до 9 (максимальное количество искр), а число искр, появляющихся каждые 5 секунд, будет рассчитываться уже на основе данного целочисленного параметра. Итак, откройте вкладку настроек приложения (Properties Setting) и добавьте в него два целочисленных параметра (рисунок 4.5): scintillasize размер искр. Значение по умолчанию 2 scintilladensity плотность искр. Значение по умолчанию 5. Рисунок 4.5. Вкладка настроек приложения. 17

18 Для начала немного подкорректируйте обработчик события Load полноэкранной формы хранителя экрана, чтобы он брал настройки непосредственно из файла конфигурации приложения (листинг 4.14). Листинг public partial >

19 TrackBar Name scintillasizetrackbar Minimum 1 Maximum 4 Label Text Плотность: TrackBar Name scintilladensitytrackbar Minimum 0 Maximum 9 Button Name okbutton Text Ok Button Name cancelbutton Text Отмена Для автоматической инициализации элементов управления диалогового окна ползунки scintillasizetrackbar и scintilladensitytrackbar необходимо связать со свойствами scintillasize и scintilladensity из конфигурационного файла приложения. Это операция легко выполняется посредством свойства Application Settings Value ползунков (рисунок 4.7). Рисунок 4.7. Привязка значения ползунка scintillasizetrackbar к свойству scintillasize файла конфигурации. Следующий шаг оживление формы посредством реализации нехитрых обработчиков сообщений (листинг 4.15). Листинг public partial >

20 settings.scintilladensity = scintilladensitytrackbar.value; // Сохраняем информацию в файле settings.save(); // Закрываем форму и завершаем приложение Close(); // Обработчик нажатия кнопки Отмена private vo >= 2) && (args[1].toupper().substring(0, 3) == «/C»))) // Отображаем диалоговое окно Application.Run(new SettingsForm()); return; В принципе, подобный подход является вполне работоспособным, если не считать одной особенности: диалоговое окно может появиться на совершенно другом конце экрана (и даже на другом мониторе) относительно окна Display Properties. Для хранителя экрана, сделанного на профессиональном уровне, такое поведение не допустимо, поэтому нам необходимо решить данную проблему. 20

21 Рисунок 4.8. Начальное положение диалоговое окна Параметры не связано с текущим положением окна Display Properties Центрирование диалогового окна относительно Display Properties. Для выравнивания диалогового окна по центру окна Display Properties необходимо определить положение этого самого окна Display Properties на экране. Здесь самое время вспомнить о том, что при запуске хранителя экрана диалоговое окно Display Properties передаѐт ему в качестве параметра свой дескриптор. Ну а немного поколдовав с Win32 API над дескриптором окна, можно легко получить об этом окне практически любую информацию. Для начала мы добавим в класс диалогового окна ещѐ один конструктор, принимающий в качестве параметра дескриптор окна Display Properties (листинг 4.17). Листинг public partial >

22 // Включаем центрирование center = true; Чтобы задействовать новый конструктор в коде функции Main необходимо реализовать более детальный разбор параметров с выделением из ключа вида /C:n значения дескриптора (листинг 4.18). Листинг static vo >= 2) && args[1].toupper() == «/C»)) // Открываем диалоговое окно параметров приложения без центрирования Application.Run(new SettingsForm()); return; // Если параметр хранителя экрана имеет вид /C:n if ((args.length == 2) && (args[1].length > 3) && (args[1].toupper().substring(0, 3) == «/C:»)) // Выделяем из строки дескриптор окна и преобразуем его в значение типа IntPtr IntPtr hwnd = (IntPtr)int.Parse(args[1].ToUpper().Substring(3, args[1].length — 3)); // Открываем диалоговое окно с выравниванием по центру окна Display Properties с дескриптором // hwnd Application.Run(new SettingsForm(hWnd)); Переходим к самому интересному получению информации о положении окна по его дескриптору. Немного порывшись в MSDN или в [К.26] мы обнаружим требуемую нам функцию: BOOL GetWindowRect(HWND hwnd, LPRECT lprect); где hwnd дескриптор окна; lprect указатель на структуру RECT, в которую заносятся координаты верхнего левого и нижнего правого углов окна. К сожалению.net Framework 2.0 не содержит ни определение функции GetWindowRect, ни структуры RECT, так что нам придется определять их самим. Однако всѐ не так уж и плохо определения большинства структур и функций для платформы.net Framework, включая GetWindowRect и RECT, можно найти на сайте Так как методы Win32 API наверняка еще не один раз пригодиться нам, будет разумно вынести их в отдельный статический класс Win32 (листинг 4.19). Дополнительным плюсом подобного подхода является простая идентификация в тексте программы вызовов методов Win32, являющихся потенциальными источниками проблем при переносе приложения на другие платформы (например, на x64 или Xbox 360). Листинг // Определения функций Win32 API, написанные на основе материалов сайта using System.Runtime.InteropServices; 22

23 public static >

24 Листинг public static >

25 // Регистрирует класс окна [DllImport(«user32»)] public static extern short Register )) // Получаем дескриптор окна предварительного просмотра IntPtr parenthandle = (IntPtr)uint.Parse(args[2]); // Определяем координаты клиентской области окна предварительного просмотра Win32.RECT rect; Win32.GetClientRect(parentHandle, out rect); // Создаем и заполняем структуру с информацией о классе окна Win32.WND >

26 wnd , MessageBoxButtons.OK, MessageBoxIcon.Error); return; // Запускаем цикл обработки сообщений. Application.Run(); return; return; Оконная функция нашего окна будет обрабатывать три сообщения (листинг 4.23): WM_PAINT визуализация изображения. WM_CLOSE освобождение ресурсов и удаление окна. WM_DESTROY завершает работу приложения. Листинг // Оконная функция public static IntPtr WindowProc(IntPtr hwnd, uint umsg, IntPtr wparam, IntPtr lparam) switch (umsg) // Обработчик сообщения WM_PAINT case (uint)win32.windowsmessages.wm_paint: if (firework!= null) 26

27 // Обновляем состояние сцены firework.update(); // Визуализируем сцену firework.paint(); return IntPtr.Zero; // Обработчик сообщения WM_CLOSE case (uint)win32.windowsmessages.wm_close: if (firework!= null) // Освобождаем ресурсы firework.dispose(); firework = null; // Уничтожаем окно Win32.DestroyWindow(displayHandle); return IntPtr.Zero; // Обработчик события WM_DESTROY case (uint)win32.windowsmessages.wm_destroy: // Выходим из цикла обработки сообщений Win32.PostQuitMessage(0); return IntPtr.Zero; default: return Win32.DefWindowProc(hWnd, umsg, wparam, lparam); Для проверки функционирования окна предварительного просмотра скомпилируйте проект хранителя экрана и установите его при помощи контекстного меню. Если всѐ сделано правильно, то на мониторе в окне предварительного просмотра появится фейерверк искр (рисунок 4.9). Рисунок 4.9. Визуализация фейерверка в окне предварительного просмотра. 27

28 4.7. Создание дистрибутива. После окончания создания хранителя экрана самое время задуматься о его распространении. А именно, о создании дистрибутива, позволяющего неподготовленному пользователю легко инсталлировать и деинсталлировать хранитель экрана. Ведь как гласит народное мудрость, любое приложение встречают по одежке. В принципе, никто не мешает создать дистрибутив прямо на месте, не выходя из Visual Studio Что мы сейчас и сделаем. Итак, добавьте в решение новый проект инсталлятора (Add New Project Other Project Types Setup and Deployment Setup Project). В свойствах ProductName и Manufacture проекта инсталлятора укажите название приложения и организации, которые будет отображаться, к примеру, в окне Add or Remove Programs. Рисунок Добавление в решение проекта инсталлятора. Примечание Дистрибутив, созданный подобным образом, использует технологию Windows Installer сервис установки и конфигурирования программных продуктов, являющийся неотъемлемой частью операционных систем Windows 2000 и выше. Хотя данная технология изначально разрабатывалась для развертыванию и сопровождения корпоративного программного обеспечения, она активно используется большинством разработчиков программного обеспечения. Тем не менее корпоративные корни дают о себе знать дистрибутив, использующий Windows Installer, несколько крупнее дистрибутивов, сгенерированных альтернативными инструментами (например, Nullsoft Scriptable Install System). В прочем эпоху широкополосных каналов Internet и винчестеров объемом в сотни гигабайт лишние 500 килобайт уже не строят погоды. Всѐ что требуется от нашего инсталлятора скопировать файл хранителя экрана в каталог Windows и выбрать его в качестве текущего хранителя экрана. По умолчанию папка, в которое устанавливается приложение, расположена внутри каталога Program Files. Чтобы приложение устанавливалось в каталог Windows в окне File System (Setup) щелкните на элементе Application Folder и измените значение свойства Default Location с [ProgramFilesFolder][Manufacturer]\[ProductName] на [WindowsFolder] (рисунок 4.11). Добавьте в папку Application Folder ссылку на *.scr файл хранителя экрана из каталога \bin\release (эту операцию можно выполнить при помощи команды Add File контекстного меню элемента Application Folder). Обратите внимание, что в папку Application Folder будет автоматически добавлена и ссылка на сборку Microsoft.Xna.Framework.dll, используемую хранителем экрана. В 28

29 принципе, эту сборку вполне можно исключить из проекта, присвоив свойству Exclude значение true, однако в этом случае в описание хранителя экрана обязательно нужно указать, что для его нормального функционирования наряду с.net Framework 2.0 и свежей версией DirectX, требуется установить и Microsoft XNA Framework. Рисунок Изменение каталога по умолчанию, в которое устанавливается приложения. Полный путь исполняемого файла текущего хранителя экрана хранится в значение SCRNSAVE.EXE раздела системного реестра HKEY_CURRENT_USER\Control Panel\Desktop. Соответственно, для смены текущего хранителя экрана достаточно всего лишь исправить данное значение системного реестра. Для реализации этой функциональности в окне Solution щелкните правой кнопкой мыши на проекте инсталлятора и выполните команду контекстного меню View Registry. На экране появится окно с деревом ключей системного реестра. Выберите ключ HKEY_CURRENT_USER и создайте в нем ключ Control Panel (команда контекстного меню New Key), а в нем ключ Desktop. В ключе Desktop создайте строковое поле SCRNSAVE.EXE (команда контекстного меню New String Value) и присвойте ему значение вида [TARGETDIR]mysaver.scr (рисунок 4.12), где [TARGETDIR] встроенный макрос, указывающий на каталог, в который устанавливается приложение (в нашем случае это \Windows). mysaver.scr имя файла хранителя экрана. Рисунок Регистрация в системном реестре текущего хранителя экрана. 29

30 Все было просто замечательно, если бы не один нюанс значение поля SCRNSAVE.EXE должно быть коротким именем файла (это ограничение актуально даже для Windows XP Service Pack 2). По видимости, это пережиток, оставшийся со времен Windows 3.x, однако с ним приходится считаться. Обойти его в лоб весьма непросто, так не возможно заранее со 100% вероятностью предсказать короткое имя для заданного длинного имени файла. К счастью заботливые разработчики Windows предусмотрели альтернативный способ установки текущего хранителя экрана, не критичный к длине имени файла хранителя экрана. Этот способ основан на использовании динамической библиотеки desk.cpl, которая собственно и реализует окно Display Properties. Данная библиотека экспортирует ряд функций, предоставляющие доступ пакетным файлам, скриптам и прикладным приложениям к функциональности окна Display Properties. В частности функция InstallScreenSaver устанавливает текущий хранитель экрана. Для вызова этой функции можно воспользоваться утилитой rundll32: rundll32.exe desk.cpl,installscreensaver имя файла хранителя экрана Таким образом, нам необходимо, чтобы инсталлятор по окончанию копирования файлов в каталог Windows вызывал утилиту rundll32, с заданными параметрами Использование Custom Actions Технология Windows Installer, используемая Visual Studio, позволяет по завершению установки приложения запустить код из пользовательской сборки, выполняющий некоторые нестандартные действия. Данная функциональность получила называние Custom Actions. Итак, давайте создадим сборку, которая будет изменять текущий хранитель экрана посредством утилиты rundll32. Для начала добавьте в решение проект сборки новой библиотеки с названием SetupCustomActions (команда контекстного меню Add New Project Visual C# Class Library). Щелкните в окне Solution на узле сборки и добавьте класс инсталлятора SetCurrentScrenSaver (Add New Item Installer Class). В проект будет добавлен новый класс, наследник Installer (листинг 4.24). Листинг using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration.Install; namespace SetupCustomActions // Атрибут RunInstaller, установленный в true, указывает на то, что данный класс будет // автоматически использоваться инсталлятором при установке приложения [RunInstaller(true)] public partial class SetCurrentScrenSaver : Installer public SetCurrentScrenSaver() InitializeComponent(); Класс Installer является каркасом, обеспечивающим базовую функциональность Custom Actions. Для добавления новых действий, выполняемых при инсталляции приложения, необходимо переопределить виртуальный метод Install класса Installer (листинг 4.25). Листинг using System.Diagnostics; public override void Install(System.Collections.IDictionary statesaver) // Вызываем оригинальный метод класса Installer base.install(statesaver); 30

31 // Вызываем утилиту rundll32 Process.Start(«rundll32.exe», «desk.cpl,installscreensaver » + Context.Parameters[«ScreenSaver»]); Информация о местоположении файла получается при помощи свойства Context.Parameters, содержащего ассоциативный массив параметров, переданных данной сборке (передачу параметров в сборку мы рассмотрим чуть ниже). Скомпилируйте созданную библиотеку классов. Теперь нам необходимо включить полученную сборку в состав дистрибутива. Для этого в окне Solution щелкните правой кнопкой мыши на узле проекта установки (Setup) и выполните команду контекстного View Custom Actions. Откроется окно редактора Custom Actions, содержащее иерархический список действий, которые выполняются при инсталляции приложения, деинсталляции, откате изменений и т.п. Щелкните правой кнопке на узле Install (действия, выполняемые при установке приложения) и выполните команду контекстного меню Add Custom Action. В появившееся диалоговом окне необходимо выбрать папку, в которую будет скопирована сборка, реализующая Custom Actions. В нашем случае просто выберите в выпадающем списке в верхней части окна папку Application Folder (каталог, в который устанавливается приложение). Затем нажните кнопку Add Output, и в выпадающем списке Project открывшегося окна выберите проект, содержащий сборку с Custom Actions (как вы помните, мы еѐ назвали SetupCustomActions). Наконец, в списке в центральной области окна выберите элемент Primary output (файл, полученный после компиляции указанного проекта) и нажмите Ok (рисунок 4.13). Рисунок Добавление в дистрибутив сборки, реализующей Custom Actions. После выполнения вышеперечисленных действий в окне Custom Actions у элемента Install появится дочерний узел Primary output from SetupCustomActions (Active). Ну а так как сборка SetupCustomActions содержит класс, производный от Installer, объявленный с атрибутом [RunInstaller(true)], данный класс будет автоматически использоваться при инсталляции приложения. Правда, просто вызвать класс ещѐ не достаточно как вы помните, необходимо еще передать сборке параметр ScreenSaver с полным именем файла хранителя экрана. Для этого свойству CustomActionData узла Primary output from SetupCustomActions (Active) достаточно присвоить значение /ScreenSaver=»[TARGETDIR]Firework XNA.scr» (рисунок 4.14). 31

32 Рисунок Задание параметров, передаваемых в сборку Интеграция дистрибутивов Windows Installer 3.1,.NET Framework 2.0 и XNA Framework 1.0. Наш хранитель экрана не является вещью в себе и зависит от ряда компонентов, которых может не оказаться на компьютерах потенциального пользователя. Это 1..NET Framework XNA Framework 1.0. Если хотя бы один из этих компонентов не будет установлен на компьютере пользователя, работоспособность хранителя экрана окажется под вопросом. Конечно, можно разместить на диске (или сайте) хранителя экрана дистрибутивы данных компонентов. Однако, ручная установка нескольких компонентов весьма утомляет, кроме того пользователь может банально забыть установить требуемый компонент. В Visual Studio 2005 эта задача решается путем интеграции необходимых компонентов непосредственно в дистрибутив приложения. В этом случае, при запуске программы установки приложения производится проверка наличия требуемых компонентов с последующей доустановкой недостающих частей. Данная функциональность реализуется очень просто. Достаточно открыть свойства проекта инсталлятора (команда контекстного меню Properties), нажать кнопку Prerequisite и в появившемся диалоговом окне выбрать компоненты, которые должны быть установлены на компьютер пользователя (рисунок 4.15). Чтобы поместить выбранные компоненты непосредственно в дистрибутив необходимо установить переключатель Specify the install location for prerequisites в значение Download prerequisites from the same location as my application. 32

33 Рисунок Интеграция компонентов в дистрибутив приложения. Единственная загвоздка заключается в том, что в состав XNA Game Studio 1.0 Express не входит компонент Prerequisite для Visual Studio Поэтому вам придется установить его с CD с книги. Для этого откройте каталог \Tools\XNA Game Studio Express 1.0\VS 2005 Prerequisite и запустите файл install.bat, после чего в списке диалогового окна Prerequisite появится элемент Microsoft XNA Framework. Если файл install.bat вдруг не сможет обнаружить местоположение Visual Studio, скопируйте вручную подкаталог XNAFramework в \Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\. Дополнительная информация Каталог XNAFramework содержит три файла: xnafx_redist.msi дистрибутив XNA Framework из XNA Game Studio Express 1.0 (каталог \XNA Game Studio Express\v1.0\Redist\XNA FX Redist). product.xml описание условий, при которых устанавливается пакет xnafx_redist.msi. \En\package.xml локализация для английского языка Информацию о создании Prerequisite для XNA Framework можно найти в [С.12]. Ну что ж, осталось только создать инсталлятор (команда контекстного меню Build), после чего в каталоге \Setup\Release появится проект готового инсталлятора, который можно смело раздавать своим знакомым без риска быть заваленным вопросами наподобие что такое XNA Framework и где его взять?. 33

34 Рисунок Установка хранителя экрана на компьютер. Рисунок Предложение установить на компьютер недостающие компоненты. Заключение В этой главе были подробно рассмотрены все нюансы создания полноценного хранителя экрана, начиная с написания обычного полноэкранного приложения, завершающего работу при активности пользователя, и заканчивая выводом изображения на все мониторы компьютера, реализацией диалогового окна конфигурации хранителя экрана и визуализацией в окне предварительного просмотра. Так же было продемонстрировано применение технологии Windows Installer для создания дистрибутива хранителя экрана, содержащего все необходимые компоненты, включая.net Framework 2.0 и XNA Framework

Хранитель экрана на visual basic

Ваш голос отсылается по E-mail владельцу сайта, после чего голоса анализируются и на отдельной странице выводятся результаты.

  • Улицы VB
  • Использование VB
  • Азбука VB
  • VB на русском

  • Улицы VB
  • Кирпичики VB
  • CообЧа VB
  • Snoozex Design
  • IgorykSoftГоспода. читайте MSDN.

    Несколько слов от автора:

    Эта книга была задумана как одна из первых книг о.NET, которая ознакомит читателя с основными идеями новой архитектуры и подготовит его к знакомству с более детальной литературой, например документацией Microsoft и ее толкованиями, которая неизбежно появится на рынке. Она поможет вам взглянуть на эту технологию с позиций ваших собственных рабочих планов и быстро освоить те концепции, которые покажутся необычными для большинства прогр.

    Автор(ы): Дан Эпплман, Издательство: Питер, 2002 г.

    Эта книга является вводным курсом по изучению языка программирования Visual Basic .NET. Даны основные принципы объектно-ориентированного программирования в контексте языка VB .NET, поскольку без хорошей подготовки в этой области невозможно в полной мере пользоваться всеми преимуществами VB .NET.
    Изложены азы всех аспектов языка, которыми должен владеть любой профессиональный разработчик VB .NET

    Автор(ы): Г. Корнелл, Дж. Моррисон, Издательство: Питер, 2002 г.

    Основная задача книги — быстро ознакомить разработчиков Visual Basic с изменениями в .NET Framework. Программисты, использующие Java, C++, Delphi или другие инструменты разработки приложений и интересующиеся Visual Basic или технологией .NET Framework, также найдут эту книгу полезной. Хотя книга посвящена Visual Basic.NET, ее основная цель — продемонстрировать взаимодействие Visual Basic и .

    Автор(ы): Кит Франклин, Издательство: Вильямс, 2002 г.

    Остальные книги о VB можно найти здесь.

    Положите на форму 1 CommandButton

    Private Declare Sub keybd_event Lib «user32» (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    Const VK_LWIN = &H5B
    Const KEYEVENTF_KEYUP = &H2
    Private Sub Command1_Click()
    Call keybd_event(VK_LWIN, 0, 0, 0)
    Call keybd_event(&H4D, 0, 0, 0)
    Call keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0)
    End Sub

    Данный пример покажет, как можно определить «Загружен ли в данный момент хранитель экрана», а также запустить хранитель экрана. Данный пример еще можно дополнить ответом на вопрос «А как программно отключить хранитель экрана?». Я пока ответа не знаю. Если вы знаете ответ, напишите мне

    Расположите на форме 3 элемента CommandButton, элемент Timer.

    Нажмите на кнопку 2. Через несколько секунд запустится хранитель экрана. Через 6 секунд пошевелите мышкой, хранитель экрана закроется. И вы увидите на форме MsgBox с сообщением, была загружена заставка. При нажатии на кнопку 3 вы получите время, через которое запускается хранитель экрана.

    Const SPI_GETSCREENSAVEACTIVE = 16
    Const SPI_GETSCREENSAVETIMEOUT = 14
    Private Declare Function SystemParametersInfo Lib «user32» Alias «SystemParametersInfoA» (ByVal uAction As Long, ByVal uParam As Long, lpvParam As Any, ByVal fuWinIni As Long) As Long

    ‘6 нижеследующих строчек нужны для запуска хранителя экрана
    Const WM_SYSCOMMAND = &H112&
    Const SC_SCREENSAVE = &HF140&
    Private Declare Function SendMessage Lib «user32» Alias «SendMessageA» (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Sub Command2_Click()
    Call SendMessage(Me.hWnd, WM_SYSCOMMAND, SC_SCREENSAVE, 0&)
    End Sub

    ‘нажав на кнопку при незапущенном хранителе экрана вы получите сообщение «False»
    Private Sub Command1_Click()
    Dim blnReturn As Boolean
    Dim blnActive As Boolean
    Call SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, vbNull, blnReturn, 0)
    blnActive = blnReturn
    MsgBox blnActive
    Timer1.Enabled = False ‘выключить таймер
    End Sub

    Private Sub Form_Load()
    Timer1.Interval = 5000 ‘установить временной интервал таймера 5 секунд
    Timer1.Enabled = True ‘включить таймер
    End Sub

    Private Sub Timer1_Timer()
    Command1_Click ‘имитурем нажатие на клавишу 1
    End Sub

    Private Sub Command3_Click()
    Dim intValue As Integer
    Call SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, vbNull, intValue, 0)
    MsgBox («Скринсэйвер включается через » & intValue & » секунд.»)
    End Sub

    Данный пример позволяет узнать о всех зарегистрированных типов файлов в системе, а также получить рисунок иконки, присущий данному типу файлов

    Расположите на форме элемент ListBox и элемент PictureBox. Для более наглядного отображения информации установите свойство .Sorted элемента ListBox как True.

    Option Explicit
    ‘Aaron Young http://www.pressenter.com/

    ajyoung
    Private Declare Function RegCloseKey Lib «advapi32.dll» (ByVal hKey As Long) As Long
    Private Declare Function RegEnumKey Lib «advapi32.dll» Alias «RegEnumKeyA» (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
    Private Declare Function RegOpenKey Lib «advapi32.dll» Alias «RegOpenKeyA» (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Private Declare Function RegQueryValueEx Lib «advapi32.dll» Alias «RegQueryValueExA» (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
    Private Declare Function DrawIconEx Lib «user32» (ByVal hdc As Long, ByVal xLeft As Long, ByVal yTop As Long, ByVal hIcon As Long, ByVal cxWidth As Long, ByVal cyWidth As Long, ByVal istepIfAniCur As Long, ByVal hbrFlickerFreeDraw As Long, ByVal diFlags As Long) As Long
    Private Declare Function ExtractIcon Lib «shell32.dll» Alias «ExtractIconA» (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long
    Private Const HKEY_ > Private aIcons() As String

    Private Sub Form_Load()
    Dim sType As String
    Dim sName As String
    Dim sFile As String
    Dim iIndex As Integer
    Dim lRegKey As Long
    Dim iFoundCount As Integer
    iIndex = 1
    iFoundCount = 1
    sType = Space(255)
    ‘Перечисление всех расширений
    Do While RegEnumKey(HKEY_ > If Left(sType, 1) <> «.» Then
    Else
    ‘Сохранение информации об иконке
    ReDim Preserve aIcons(iIndex — 1)
    sType = Left(sType, InStr(sType, Chr(0)) — 1)
    ‘Получить имя расширения, (к примеру — .zip = WinZip)
    If RegOpenKey(HKEY_ > sName = Space(255)
    Call RegQueryValueEx(lRegKey, ByVal «», 0&, 1, ByVal sName, 255)
    If InStr(sName, Chr(0)) Then sName = Left(sName, InStr(sName, Chr(0)) — 1)
    Call RegCloseKey(lRegKey)
    If Len(Trim(sName)) Then
    ‘Поиск иконки по умолчанию для расширения
    If RegOpenKey(HKEY_ > sFile = Space(255)
    Call RegQueryValueEx(lRegKey, ByVal «», 0&, 1, ByVal sFile, 255)
    If InStr(sFile, Chr(0)) Then sFile = Left(sFile, InStr(sFile, Chr(0)) — 1)
    Call RegCloseKey(lRegKey)
    aIcons(iFoundCount — 1) = sFile
    End If
    End If
    End If
    List1.AddItem Left(sType & Space(10), 10) & » — » & sName
    iFoundCount = iFoundCount + 1
    End If
    sType = Space(255)
    iIndex = iIndex + 1
    Loop
    End Sub

    Private Sub List1_Click()
    Dim sFile As String
    Dim iIndex As Integer
    Dim lIcon As Long
    Picture1.Cls
    On Error GoTo IconErr
    ‘Получить иконку для данного типа расширения
    sFile = Left$(aIcons(List1.ListIndex), InStr(aIcons(List1.ListIndex), «,») — 1)
    iIndex = Val(Mid$(aIcons(List1.ListIndex), InStr(aIcons(List1.ListIndex), «,») + 1))
    lIcon = ExtractIcon(App.hInstance, sFile, iIndex)
    Call DrawIconEx(Picture1.hdc, 0, 0, lIcon, 32, 32, 0, 0, 3)
    IconErr:
    End Sub

    Данный пример выведет в ваш ComboBox список всех расширений файлов, зарегистрированных в системе

    Private Declare Function RegOpenKey Lib «advapi32.dll» Alias «RegOpenKeyA» (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Private Declare Function RegEnumKey Lib «advapi32.dll» Alias «RegEnumKeyA» (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
    Function GetAllExts() As Variant
    Dim lRegResult As Long
    Dim lCounter As Long
    Dim hCurKey As Long
    Dim strBuffer As String
    Dim lDataBufferSize As Long
    Dim intZeroPos As Integer
    lCounter = 0
    lRegResult = RegOpenKey(&H80000000, «», hCurKey)
    Do
    lDataBufferSize = 255
    strBuffer = String(lDataBufferSize, » «)
    lRegResult = RegEnumKey(hCurKey, lCounter, strBuffer, lDataBufferSize)
    If lRegResult = 0& Then
    intZeroPos = InStr(strBuffer, Chr$(0))
    If Left(strBuffer, 1) = «.» Then
    Form1.Combo1.AddItem LCase(Right(strBuffer, Len(strBuffer) — 1))
    End If
    lCounter = lCounter + 1
    Else
    Exit Do
    End If
    Loop
    End Function

    Private Sub Form_Load()
    GetAllExts
    End Sub


    или любого файла, если, конечно, вы сможете получить описание.

    Тестирование данного примера я провел на нескольких exe-файлах, некоторых системных библиотеках и даже обычных текстовых файлах. Для простоты проверки примера добавьте на форму элемент TextBox и элемент CommandButton. Естественно, в текстовое окно вы должны вставлять полный путь к проверяемому файлу.

    Но вот где хранятся эти описания, осталось для меня загадкой. Поиск в реестре ничего не дал.

    Вам понадобится дополнительный модуль.

    Private Sub Command1_Click()
    MsgBox GetFileDescription(«c:\win\system\shell32.dll»)
    ‘MsgBox GetFileDescription(Text1.Text)
    End Sub

    Option Explicit
    Private Declare Function GetLocaleInfoA Lib «kernel32.dll» (ByVal lLCID As Long, ByVal lLCTYPE As Long, ByVal strLCData As String, ByVal lDataLen As Long) As Long
    Private Declare Sub lstrcpyn Lib «kernel32.dll» (ByVal strDest As String, ByVal strSrc As Any, ByVal lBytes As Long)
    Private Declare Function GetFileVersionInfoSize Lib «version.dll» Alias «GetFileVersionInfoSizeA» (ByVal sFile As String, lpLen As Long) As Long
    Private Declare Function GetFileVersionInfo Lib «version.dll» Alias «GetFileVersionInfoA» (ByVal sFile As String, ByVal lpIgnored As Long, ByVal lpSize As Long, ByVal lpBuf As Long) As Long
    Private Declare Function VerQueryValue Lib «version.dll» Alias «VerQueryValueA» (ByVal lpBuf As Long, ByVal szReceive As String, lpBufPtr As Long, lLen As Long) As Long
    Private Declare Sub CopyMemory Lib «kernel32.dll» Alias «RtlMoveMemory» (pDest As Any, pSource As Any, ByVal ByteLen As Long)
    Private Declare Function GetUserDefaultLCID Lib «kernel32.dll» () As Long

    Public Function StringFromBuffer(buffer As String) As String
    Dim nPos As Long
    nPos = InStr(buffer, vbNullChar)
    If nPos > 0 Then
    StringFromBuffer = Left$(buffer, nPos — 1)
    Else
    StringFromBuffer = buffer
    End If
    End Function

    Public Function GetFileDescription(ByVal sFile As String) As String
    Dim lVerSize As Long
    Dim lTemp As Long
    Dim lRet As Long
    Dim bInfo() As Byte
    Dim lpBuffer As Long
    Dim sDesc As String
    Dim sKEY As String
    lVerSize = GetFileVersionInfoSize(sFile, lTemp)
    ReDim bInfo(lVerSize)
    If lVerSize > 0 Then
    lRet = GetFileVersionInfo(sFile, lTemp, lVerSize, VarPtr(bInfo(0)))
    If lRet <> 0 Then
    sKEY = GetNLSKey(bInfo)
    lRet = VerQueryValue(VarPtr(bInfo(0)), sKEY & «\FileDescription», lpBuffer, lVerSize)
    If lRet <> 0 Then
    sDesc = Space$(lVerSize)
    lstrcpyn sDesc, lpBuffer, lVerSize
    GetFileDescription = StringFromBuffer(sDesc)
    End If
    End If
    End If
    End Function

    Public Function GetNLSKey(byteVerData() As Byte) As String
    Static strLANGCP As String
    Dim lpBufPtr As Long
    Dim strNLSKey As String
    Dim fGotNLSKey As Integer
    Dim intOffset As Integer
    Dim lVerSize As Long
    Dim lTmp As Long
    Dim lBufLen As Long
    Dim lLCID As Long
    Dim strTmp As String
    On Error GoTo GNLSKCleanup
    If VerQueryValue(VarPtr(byteVerData(0)), «\VarFileInfo\Translation», lpBufPtr, lVerSize) <> 0 Then
    If Len(strLANGCP) = 0 Then
    lLC > If lLCID > 0 Then
    strTmp = Space$(8)
    GetLocaleInfoA lLCID, 11, strTmp, 8
    strLANGCP = StringFromBuffer(strTmp)
    Do While Len(strLANGCP) 0 Then
    strNLSKey = strLANGCP
    Else
    For intOffset = 0 To lVerSize — 1 Step 4
    CopyMemory lTmp, ByVal lpBufPtr + intOffset, 4
    strTmp = Hex$(lTmp)
    Do While Len(strTmp) 0 Then
    fGotNLSKey = True
    Exit For
    End If
    Next
    If Not fGotNLSKey Then
    strNLSKey = «\StringFileInfo\040904E4»
    If VerQueryValue(VarPtr(byteVerData(0)), strNLSKey, lTmp, lBufLen) <> 0 Then
    fGotNLSKey = True
    End If
    End If
    End If
    End If
    GNLSKCleanup:
    If fGotNLSKey Then
    GetNLSKey = strNLSKey
    End If
    End Function

    На многих клавиатурах есть специальная кнопка со значком WINDOWS. Данный пример с помощью API функции эмулирует нажатие на эту клавишу и дополнительную клавишу, вызывая определенную процедуру в системе.

    В событии Form_Load() показан один пример: эмулирование нажатие клавиши ПУСК. В качестве параметра функции Launch вы можете использовать любую константу из StartMenuItems.

    Private Declare Sub keybd_event Lib «User32» (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    Const VK_LWIN = &H5B, KEYEVENTF_KEYUP = &H2, VK_APPS = &H5D

    Public Enum StartMenuItems
    strtExplorer ‘запустить ПРОВОДНИК
    strtFind ‘окно «ПОИСК ФАЙЛОВ»
    strtMinimize ‘минимизировать все окна
    strtRun ‘вызвать окно «ЗАПУСК ПРОГРАММ» (ПУСК | ВЫПОЛНИТЬ. )
    strtStartMenu ‘эмулировать нажатие клавиши ПУСК
    strtHelp ‘вызвать справочную систему
    End Enum

    Public Sub Launch(func As StartMenuItems)
    Dim VK_ACTION As Long
    Select Case func
    Case strtExplorer: VK_ACTION = &H45
    Case strtFind: VK_ACTION = &H46
    Case strtMinimize: VK_ACTION = &H4D
    Case strtRun: VK_ACTION = &H52
    Case strtStartMenu: VK_ACTION = &H5B
    Case strtHelp: VK_ACTION = &H70
    End Select
    Call keybd_event(VK_LWIN, 0, 0, 0)
    Call keybd_event(VK_ACTION, 0, 0, 0)
    Call keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0)
    End Sub

    Private Sub Form_Load()
    Call Launch(strtStartMenu)
    End Sub

    BalloonMessage for MS Agent

    Здесь Вы можете задать вопрос, или ответить на уже имеющиеся вопросы.

    Такой код для добавления hotkey:

    Private Declare Function SendMessage Lib «user32» Alias «SendMessageA» (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
    Private Declare Function DefWindowProc Lib «user32» Alias «DefWindowProcA» (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Const WM_SETHOTKEY = &H32
    Private Const WM_SHOWWINDOW = &H18
    Private Const HK_SHIFTA = &H141 ‘Shift + A
    Private Const HK_SHIFTB = &H142 ‘Shift + B
    Private Const HK_CONTROLA = &H241 ‘Control + A
    Private Const HK_ALTZ = &H45A
    Private Sub Form_Load()
    ‘Позволить узнать windows какая горячая клавиша в вашем приложении
    erg& = SendMessage(Me.hwnd, WM_SETHOTKEY, HK_ALTZ, 0)
    If erg& <> 1 Then MsgBox «You need another hotkey», vbOKOnly, «Error»
    ‘Сказать windows что делать при нажатии на hotkey
    ‘в данном случае — показать окно программы
    erg& = DefWindowProc(Me.hwnd, WM_SHOWWINDOW, 0, 0)
    End Sub

    Так вот, я прячу программу через form.hide и показываю значок в трее, и этот hotkey не работает. А просто так, когда форма не спрятана, а просто неактивна, то какое сообщение не пиши в DefWindowProc, форма просто становится активной. Объясните, пожалуйста, что здесь можно исправить или подскажите другой способ.

    В Delphi есть Qreport есть ли что-то подобное в VB?

    Подскажите ,при создании нового проекта, ASP.NET WEBApplication указываю адрес http://localhost/WebApplication1 ,но NET выдает сообщение «Web Access Failed, » вобщем не может создать проект, может кто-то сталкивался с подобным ?

    Подскажите, как сделать чтобы на одной вкладке TabStrip была например кнопка, а на другой вкладке TextBox?

    Kак добавить ярлык в деректорию «Создать» в меню Windows.

    ПОМОГИТЕ РАЗОБРАТЬСЯ С MSDN .
    У меня Visual Basic 6.0 и при попытке вызвать Справку выдает, что надо типа установить MSDN Library. Долго искал всеми расхваливаемый MSDN на CD-дисках и, наконец, купил на 3-х дисках. И что же. Они друг друга НЕ ВИДЯТ. VB6.0 при попытке установить ему МСДН говорит, что это не тот диск. А запуская Setup с дисков MSDN (даже после полной установке! — это около 2-х гигов), этот «товарищ» к VB не цепляется! Как мне их установить, чтоб в VB нормально справка работатала.

    как при помоши BitBlt вставить рисунок не в picture a в image или как в Picture увеличить или уменьшить рисунок.

    Как яяделать библеотеку так чтобы я набрав слово например abs. после точки выскочило меню с всеми процедурами и функциями. У меня получается так только когда я делаю Public классу и функции. Но мне не надо что бы это было Public , а только после набратия слова abs.

    В SysTray создал иконку, нужно, чтобы когда я форму сворачиваю, она исчезала с экрана и панели задач, а оставалась лишь иконка в SysTray. А как .

    В SysTray создал иконку, нужно, чтобы когда я форму сворачиваю, она исчезала с экрана и панели задач, а оставалась лишь иконка в SysTray. А как .

    Это можно сделать отслеживая состояние формы. Ниже описан пример, когда форма сварачивается, то она станоовиться невидимой в Tra-e. вставьте в форму Timer и напишите следующий код:

    Private Sub Timer1_Timer()
    Timer1.Interval = 100
    If Form1.WindowState = 1 Then Form1.Visible = False
    End Sub

    В SysTray создал иконку, нужно, чтобы когда я форму сворачиваю, она исчезала с экрана и панели задач, а оставалась лишь иконка в SysTray. А как .

    Public Declare Function Shell_NotifyIcon Lib «shell32.dll» Alias «Shell_NotifyIconA» (ByVal dwMessage As dwMess, lpData As NOTIFYICONDATA) As Long


    Public Declare Function GetModuleHandle Lib «kernel32» Alias «GetModuleHandleA» (ByVal lpModuleName As String) As Long

    Public Enum dwMess
    NIM_ADD = &H0 ‘ Добавление иконки
    NIM_DELETE = &H2 ‘ Удаление иконки
    NIM_MODIFY = &H1 ‘ Изменение параметров иконки
    End Enum

    Type NOTIFYICONDATA
    cbSize As Long ‘ Размер переменной типа NOTIFYICONDATA
    hwnd As Long ‘ Указатель окна создающего иконку
    uID As Long ‘ Указатель на иконку в пределах приложения
    uFlags As uF ‘ Маска для следующих параметров
    uCallbackMessage As CallMess ‘ Возвращаемое событие
    hIcon As Long ‘ Указатель на изображение для иконки
    szTip As String * 64 ‘ Всплывающий над иконкой текст
    End Type

    Public Enum uF
    NIF_MESSAGE = &H1 ‘ Значение имеет uCallbackMessage
    NIF_ICON = &H2 ‘ Значение имеет hIcon
    NIF_TIP = &H4 ‘ Значение имеет szTip
    End Enum

    Public Enum CallMess
    WM_MOUSEMOVE = &H200
    WM_LBUTTONDOWN = &H201
    WM_LBUTTONUP = &H202
    WM_LBUTTONDBLCLK = &H203
    WM_RBUTTONDOWN = &H204
    WM_RBUTTONUP = &H205
    WM_RBUTTONDBLCLK = &H206
    WM_MBUTTONDOWN = &H207
    WM_MBUTTONUP = &H208
    WM_MBUTTONDBLCLK = &H209
    WM_SETFOCUS = &H7
    WM_KEYDOWN = &H100
    WM_KEYFIRST = &H100
    WM_KEYLAST = &H108
    WM_KEYUP = &H101
    End Enum

    Код формы:
    Необходимо добавить кнопку

    Dim NID As NOTIFYICONDATA
    Sub AddIcon()
    Dim IDLib As Long ‘ Указатель на библиотеку
    Dim IDIcon As Long ‘ Указатель на иконку
    Const > Dim AddResult As Long ‘ Результат добавления иконки
    ) ‘ Получаем hInstanse
    > ‘ Заполняем структуру NID типа NOTIFYICONDATA
    N > N > N > N > N > N > N , при этом обрезаем ее до 63 символов и добавляем 64-й символ с кодом ноль
    AddResult = Shell_NotifyIcon(NIM_ADD, NID) ‘ Вызываем функцию, через параметр dwMessage указываем, что следует добавить иконку, и передаем заполненный NID
    Me.Visible = False
    End Sub

    Sub DeleteIcon()
    Dim DeletResult As Long
    DeleteResult = Shell_NotifyIcon(NIM_DELETE, NID) ‘ Вызываем функцию, через dwMessage указываем, что следует удалить иконку, при этом, раз переменная NID описана на уровне модуля, не следует заполнять ее заново
    End Sub

    Private Sub Command1_Click()
    Call AddIcon
    End Sub

    Private Sub Form_Mousedown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Static bPressed As Boolean
    If X = 7695 Then ‘ SysTray Icon Events
    Shell_NotifyIcon NIM_DELETE, NID
    Form1.Visible = True
    End If
    End Sub

    В SysTray создал иконку, нужно, чтобы когда я форму сворачиваю, она исчезала с экрана и панели задач, а оставалась лишь иконка в SysTray. А как .

    Для свойства ShowInTaskbar в форме задай значение False. А если нужно чтобы при старте форма на экране не отображалась то:

    Private Sub Form_Load()
    Me.Hide
    ‘ и помещаем иконку в SysTray
    .
    End Sub

    Есть два TextBox. В каждом яаписывается какое-либо время. Например:
    TextBox1.text = «01:30:25»
    TextBox2.text = «02:01:30»
    Как вычислить TextBox2.text — TextBox1.text
    Может кто сталкивался с таким, подкиньте код пожалуйста. Бывает ли переменная типа Time (не timer) и каким обраяом проияводятся вычисления со временем?

    1. конвертировать время в формат datetime (1990.01.01 02.01.30 — 1990.01.01 01.30.25) получишь искомый результат

    2. перевод в минуты(секунды если есть сек.) после разницы обратно. например
    Time1 = «01:30»
    Time2 = «02:01»

    time2=(int(time2)*60 + (time2-int(time2) ) — перевод в минуты,
    time1=(int(time1)*60 + (time1-int(time1) )
    result=time2-time1
    result=int(result/60)+ (result-int(result/60)*60) /100

    Есть два TextBox. В каждом яаписывается какое-либо время. Например:
    TextBox1.text = «01:30:25»
    TextBox2.text = «02:01:30»
    Как вычислить TextBox2.text — TextBox1.text
    Может кто сталкивался с таким, подкиньте код пожалуйста. Бывает ли переменная типа Time (не timer) и каким обраяом проияводятся вычисления со временем?

    Вообще есть в ВБ6.0 функция TimeValue которая преобразовывает строку в формат времени. Вот ниже код который, который вычисляет сколько времени прошло.

    a=»01:00:25″
    b=»20:00:25″
    c= -TimeValue(b)+TimeValue(a)
    Msgbox c

    Внимание. Ни в коем случае в 3 строке не меняйте значенеия TimeValue местами,например, следующий код уже небудет работать

    Есть два TextBox. В каждом яаписывается какое-либо время. Например:
    TextBox1.text = «01:30:25»
    TextBox2.text = «02:01:30»
    Как вычислить TextBox2.text — TextBox1.text
    Может кто сталкивался с таким, подкиньте код пожалуйста. Бывает ли переменная типа Time (не timer) и каким обраяом проияводятся вычисления со временем?

    Лови примерчик. На форме — две кнопки и текстбокс. Давишь сначала первую, с каким-то интервалом — вторую. В текстбоксе — интервал в секундах.

    Private Sub Command1_Click()
    t = Time
    End Sub

    Private Sub Command2_Click()
    Text1 = Str((Time — t1) / 1000)
    End Sub

    В ListBox выбираю строку, в которой прописан путь к картинке, и Image.Picture присваиваю ее значение. Но программа пишет: несоответствие типа. Есть ли другой путь изменения картинки объекта Image?

    Просто ты неправильно присваиваешь путь к файлу.
    Надо не так:

    В ListBox выбираю строку, в которой прописан путь к картинке, и Image.Picture присваиваю ее значение. Но программа пишет: несоответствие типа. Есть ли другой путь изменения картинки объекта Image?

    Image1.Picture = LoadPicture( ) End Sub

    Где в Инете можно скачать учебник для начинающего програмиста?

    Учебник целиком вряд ли, а вот почитать и поизучать исходники можно где угодно.
    Сходи сюда:
    http://vbrussian.com/VBR_Sites.asp

    1)как можно в одном окне просматривать и каталоги и файлы? Типа Dir и FileBox в одном. И вообще, кто-нибудь знает где можно найти исходники простенького файл-менеджера, а то изобретать велосипед нехота, устал я что-то :-)
    2)Как можно просматривать иконки из dll-файлов?

    FileView X v1.0.0.7 For Visual Basic 6


    FolderView X v1.0.0.10 For Visual Basic 6

    это почти полный аналог (даже лучше:) виндового эксплорера и браузера, но в кодах (правда, с привлечением ocx их собственной разработки). Если не найдешь где скачать — пиши, я намылю. Они в развернутом состоянии кил по 700. А если ужать.

    Подскажите код как в VBA на форме поместить ссылку на E-mail или страничку.

    http://progs.biz/vb/samples/axlink/axlink01.shtml
    http://progs.biz/vb/samples/axlink/lessons/001.shtml
    .
    http://progs.biz/vb/samples/axlink/lessons/006.shtml

    Там как раз подробно обсуждается, как написать ActiveX, кооторый будет действовать как гиперссылка.
    Если же создаветь ActiveX не хочется, то см.

    Там о создании гиперссылки с помощью API-функции ShellExecute.

    Можете заполнить эту форму, либо отослать вопрос ?Subject=Question_To_QA»>СЮДА

    лабы по информатике, егэ

    лабораторные работы и задачи по программированию и информатике, егэ по информатике

    VB 2. Элементы управления Button (кнопка) и Label (надпись)

    Лабораторная работа №2

    Инструментарий:

    объект свойство name
    форма frmHello
    кнопка (button) btnExit
    кнопка (button) btnHello
    метка (label) lblHello

    Выполнение:

    1. Создайте новый проект на VB2008 и назовите его Hello.
    2. На новой форме (назовите ее frmHello, изменив значение свойства Name) создайте следующие элементы управления:
      • Кнопку – для выхода из программы,
      • Метку – для вывода надписи «Привет!»,
      • Кнопку для подачи команды к выводу надписи на метке:

    Для этого на панели Toolbox (Панель элементов) в левой части экрана нажмите плюсик рядом с надписью All Windows Forms (Все формы Windows Forms). И дважды щелкните на элементе Button (Кнопка). На рабочей форме появилось изображение кнопки.

    Перейдите на панель Properties (Свойства) и в поле Name задайте имя кнопки – btnExit.

    Аналогичным образом добавьте Метку, на панели Toolbox (Панель элементов) нажав дважды на Label (Метка), задайте свойству Name Метки – lblHello. Разместите метку на форме выше кнопки.

    Затем добавьте еще одну кнопку и задайте ее свойству Name значение btnHello. Расположите ее на форме.

    1. Измените свойство Text созданных элементов управления:
      • для Кнопки btnHelloСказать Привет!,
      • для Кнопки btnExitВыход,
      • для Метки lblHello – сделать пустым.
    2. Расположите элементы управления, как показано на рис «форма Привет».

    На видео можно просмотреть варианты работы со свойствами объектов в Visual Basic:

    Когда Вы создаете приложение, VB автоматически генерирует для него определенный код. Например, для формы генерируется следующий код:

    Public Class Form1 ‘Код основной программы End Class

    Главный элемент в этом фрагменте это Class: организующая единица, которая группирует и связывает родственный код. Проекты состоят из классов.

    1. Запрограммируйте событие Click для Кнопки btnExit оператором End . Для этого сделайте двойной щелчок на Кнопке btnExit и в открывшемся окне кода наберите на клавиатуре оператор End . В итоге должно получиться:

    Private Sub btnExit_Click(… ‘здесь часть кода отсутствует End End Sub

    В этом фрагменте главным элементом является Sub: это инструкция выполнения задания, которая называется методом. В данном случае это метод кнопки btnExit, который генерируется по щелчку на кнопке (событие Click – по щелчку).

    1. Запустите приложение. Используйте для этого кнопку Start на панели инструментов (можно использовать горячую клавишу F5).
    2. Нажмите на кнопку Сказать Привет! — ничего не происходит. Затем нажмите на кнопку Выход и убедитесь, что при нажатии приложение закончит свою работу.
    3. Запрограммируйте событие Click(по щелчку) для Кнопки btnHello следующим образом (см. пункт 5) (предварительно перейдите на вкладку дизайна формы, затем дважды щелкните на кнопке Сказать Привет!):

    Private Sub btnhello_Click(… lblhello.Text = “Привет” End Sub

    1. Повторите действия из пунктов 6 и 7.
    2. Сохраните приложение.

    Если у Вас возникли вопросы, предлагаем просмотреть видео урок visual basic по выполнению данной лабораторной работы.

    Вопросы для самоконтроля.

    1. Что такое элемент управления?
    2. Что такое событие?
    3. Назовите основную функцию элемента управления Button.
    4. Каково основное предназначение элемента управления Label?
    5. Какой оператор VB прекращает выполнение программы?
    6. Когда генерируется событие Click для элемента управления Button?
  • Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL