Михаил Краснов - Графика DirectX в Delphi

Тут можно читать онлайн Михаил Краснов - Графика DirectX в Delphi - бесплатно ознакомительный отрывок. Жанр: comp-programming. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Графика DirectX в Delphi
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    3.56/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Михаил Краснов - Графика DirectX в Delphi краткое содержание

Графика DirectX в Delphi - описание и краткое содержание, автор Михаил Краснов, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Графика DirectX в Delphi - читать онлайн бесплатно ознакомительный отрывок

Графика DirectX в Delphi - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Михаил Краснов
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

TextConsoleS := '>_';

OutText (5, 50, TextConsoleS);

end;

for i := DIK_Q to DIK_M do // Просматриваем буквенные клавиши

if diks [i] and $80 <> 0 then begin // Нажата какая-то клавиша с буквой

if length (TextConsoleS) < 20 then begin // Ограничение длины строки

// Перед символом подчеркивания вставляем букву нажатой клавиши

TextConsoleS := Copy (TextConsoleS, I, length (TextConsoleS) - 1) +

ScanToChar (i) +'_';

OutText (5, 50, TextConsoleS); // Вывод получившейся строки

Sleep(100);

end;

end;

end;

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

Диалоговые окна

Многие приложения нуждаются в диалоговых окнах, поэтому уделим немного внимания этому вопросу. Пример данного раздела (проект каталога Ех10) представляет собой окончательную реализацию нашего хранителя экрана с плавающими рыбками. В развитие предыдущего состояния добавлена поддержка пароля для входа в систему.

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

Следующая процедура предназначена для вызова системного диалога задания нового пароля:

procedure TfrmDD.RunSetPassword;

type // Специальный тип функции, используется только в этой ситуации

TPCPAFunc = function(A : PChar; Parent : hWnd; В, С : Integer) :

Integer; stdcall;

var

Lib : THandle; // Ссылка на DLL

PCPAFunc : TPCPAFunc; // Загружаемая функция

begin

Lib := .LoadLibrary('MPR.DLL1); // Динамическая загрузка DLL

if Lib > 32 then begin // Проверка успешности загрузки

// Получаем адрес точки входа нужной функции

@PCPAFunc := GetProcAddress(Lib, 'PwdChangePasswordA');

// Задаем пароль хранителей экрана

if @PCPAFunc о nil then PCPAFunc('SCRSAVE', StrToInt(ParamStr(2)),

0, 0);

FreeLibrary(Lib); // Выгружаем библиотеку

end;

end;

В нашей программе эта процедура вызывается, если приложение запущено с параметром /а, т. е. в ситуации, когда пользователь нажал кнопку Изменить на вкладке Заставка (см. рис. 4.3).

При нажатии клавиши или движении курсора программа должна сама определить, установлен ли пароль для хранителя экрана, и запустить системный диалог ввода пароля:

function TfrmDD.TestPassword : BOOL;

type

// Специальный тип, тоже используется только в этом, особом случае

TVSSPFunc = function(Parent : hWnd) : BOOL; stdcall;

var

Key : hKey;

D1,D2 : Integer;

Value : Integer;

Lib : THandle;

VSSPFunc : TVSSPFunc;

begin

Result := True;

// Загружаем информацию из реестра, используя функции API

if RegOpenKeyEx(hKey_Current_User, 'Control Panei\Desktop', 0,

Key_Read, Key) = Error_Success then begin

D2 := SizeOf(Value);

// Определяем, установлен ли пароль

if RegQueryValueEx(Key, 'ScreenSaveUsePassword', nil, @D1,

@Value,@D2) = Error_Success then begin if Value <> 0 then begin

// Динамически загружаем библиотеку ввода пароля

Lib := LoadLibraryf'PASSWORD.CPL');

if Lib > 32 then begin

// Получаем адрес точки входа

SVSSPFunc := GetProcAddress(Lib, 'VerifyScreenSavePwd');

// На время работы диалога включаем курсор

ShowCursor (True) ;

// Запускаем системный диалог

if @VSSPFunc <> nil then Result := VSSPFunc(Handle);

ShowCursor(False); // Это можно, в принципе, не делать

FreeLibrary(Lib); // Освобождаем память

end;

end;

end;

RegCloseKey(Key);

end;

end;

И теперь самое главное: диалоговое окно должно работать "поверх" первичной поверхности (рис. 5.10).

Чтобы пользователь увидел его перед вызовом нашей пользовательской функции - фото 36

Чтобы пользователь увидел его, перед вызовом нашей пользовательской функции TestPassword нужно переключиться на воспроизведение в режиме GDI:

FDD.FlipTcGDISurface;

To есть в такой ситуации обязан вызываться метод главного объекта FlipToGDisurface, а перерисовка экрана не должна осуществляться. К сожалению, мне встречались хранители экрана, написанные профессионалами, авторы которых не позаботились о корректной работе системного диалога: пароль приходится вводить "вслепую", не видя окно ввода пароля, закрытое картинкой первичной поверхности. Памятуя об этом, я многократно проверял работу своего хранителя на самых разных видеокартах, и могу сказать, что не встретил ничего подобного.

Чтобы отключить клавиатуру, точнее, запретить работу комбинаций клавиш + и ++, на время работы приложения информируем систему о том, что работает хранитель экрана, при запуске приложения выполняется следующая строка кода:

SystemParametersInfo(SPI SCREENSAVERRUNNING, 1, nil, 0);

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

Переключение на GDI-воспроизведение, надеюсь, сделает видимым диалоговое окно у каждого читателя книги, но полноценным такое решение назвать нельзя. При перемещении окна по экрану оно оставляет следы, расчищая первичную поверхность и обнажая окно приложения (поэтому экран становится серым).

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

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

Использование отсечения в полноэкранном приложении

Имея дело с Delphi, вам наверняка жалко будет потерять все ее прелести и мощь разработки диалоговых средств, расстаться с визуальными компонентами только потому, что при перемещении окна могут остаться серые пятна.

Специально для этого случая я подготовил пример, иллюстрирующий, как можно эффектно комбинировать обычный вывод средствами GDI и DirectDraw. Это проект каталога Ex11, где посередине экрана отображается репродукция самого популярного шедевра живописи, а по бокам разбросаны стандартные интерфейсные элементы (рис. 5.11).

В программе задается режим 800x600 пикселов уровень доступа исключительный - фото 37

В программе задается режим 800x600 пикселов, уровень доступа - исключительный. При воспроизведении происходит блиттинг на первичную поверхность содержимого вспомогательной поверхности, а для того, чтобы воспроизведение осуществлялось только в пределах центральной области экрана, я использую отсечение, знакомое нам по оконным приложениям. Но теперь оно ограничивает строго определенную область экрана, а не связывается с окном приложения. Если ранее для связывания отсечения с окном использовался метод SetHWnd, то в этом примере вызывается метод SetciipList. В общем случае последний метод может применяться для создания и непрямоугольных областей вывода, для описания их служат регионы:

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Михаил Краснов читать все книги автора по порядку

Михаил Краснов - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Графика DirectX в Delphi отзывы


Отзывы читателей о книге Графика DirectX в Delphi, автор: Михаил Краснов. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x