А. Григорьев - О чём не пишут в книгах по Delphi

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

А. Григорьев - О чём не пишут в книгах по Delphi краткое содержание

О чём не пишут в книгах по Delphi - описание и краткое содержание, автор А. Григорьев, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Рассмотрены малоосвещённые вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные механизмы их работы, особенности для протоколов TCP и UDP и др. Большое внимание уделено разбору ситуаций возникновения ошибок и получения неверных результатов в "простом и правильном" коде. Отдельно рассмотрены особенности работы с целыми, вещественными и строковыми типами данных, а также приведены примеры неверных результатов, связанных с ошибками компилятора, VCL и др. Для каждой из таких ситуаций предложены методы решения проблемы. Подробно рассмотрен синтаксический анализ в Delphi на примере арифметических выражений. Многочисленные примеры составлены с учётом различных версий: от Delphi 3 до Delphi 2007. Прилагаемый компакт-диск содержит примеры из книги.

Для программистов

О чём не пишут в книгах по Delphi - читать онлайн бесплатно ознакомительный отрывок

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

Интервал:

Закладка:

Сделать

Для начала объявим несколько констант, которые нам потребуются при вычислении размеров дырки и т.п. (листинг 1.51).

Листинг 1.51. Константы примера WndHole

const

// минимальное расстояние от дырки до края окна

HoleDistance = 40;

// Зона чувствительности рамки панели - на сколько пикселов

// может отстоять курсор вглубь от края панели, чтобы его

// положение расценивалось как попадание в рамку.

BorderMouseSensivity = 3;

// Зона чувствительности угла рамки панели - на сколько пикселов

// может отстоять курсор от угла панели, чтобы его

// положение расценивалось как попадание в угол рамки.

CornerMouseSensivity = 15;

// Толщина рамки дырки, использующаяся при вычислении региона

HoleBorder = 3;

// Минимальная ширина и высота дырки

MinHoleSize = 10;

// Смещение стрелки относительно соответствующего угла

ArrowOffset = 8;

Теперь приступаем к созданию программы. На форму "кладем" панель. С помощью функции SetWindowRgnустанавливаем такую форму окна, чтобы от панели была видна только рамка, а на всю внутреннюю часть панели пришлась дырка. Рамку выбираем такую, чтобы панель выглядела утопленной, так края дырки будут выглядеть естественней. Для расчета региона используется метод SetRegion(листинг 1.52), он вызывается всегда, когда нужно изменить регион окна.

Листинг 1.52. Метод SetRegion, устанавливающий регион окна

procedure TFormHole.SetRegion;

var

Rgn1, Rgn2: HRGN;

R, R2: TRect;

begin

// Создаем регион, соответствующий прямоугольнику окна

Rgn1 := CreateRectRgn(0, 0, Width, Height);

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

// верхнего угла окна (а не относительно левого верхнего

// угла клиентской области, как это задается свойствами

// Left и Тор). Функций для получения смещения клиентской

// области относительно левого верхнего угла окна нет.

// Придется воспользоваться сообщением WM_NCCalcRect

R2 := Rect(Left, Top, Left + Width, Top + Height);

Perform(WM_NCCALCSIZE, 0, LParam(@R2));

// Переводим координаты полученного прямоугольника из

// экранных в координаты относительно левого верхнего

// угла окна

OffsetRect(R2, -Left, -Top);

// получаем координаты панели относительно левого

// верхнего угла клиентской области и пересчитываем их

// в координаты относительно верхнего левого угла окна

R := Rect(0, 0, PanelHole.Width, PanelHole.Height);

OffsetRect(R, PanelHole.Left + R2.Left, PanelHole.Top + R2.Top);

// уменьшаем прямоугольник на величину рамки и создаем

// соответствующий регион

InflateRect(R, -HoleBorder, -HoleBorder);

Rgn2 := CreateRectRgnIndirect(R);

// вычитаем один прямоугольный регион из другого, получая

// прямоугольник с дыркой

CombineRgn(Rgn1, Rgn1, Rgn2, RGN_DIFF);

// уничтожаем вспомогательный регион

DeleteObject(Rgn2);

// Назначаем регион с дыркой окну

SetWindowRgn(Handle, Rgn1, True);

// обратите внимание, что регион, назначенный окну, нигде

// не уничтожается. После выполнения функции SetWindowRgn

// регион переходит в собственность системы, и она сама

// уничтожит его при необходимости

end;

Сообщения, поступающие с панели, перехватываются через ее свойство WindowProc(подробно эта технология описана в первой части данной главы, здесь мы ее касаться не будем). Сообщение WM_NCHITTESTбудем обрабатывать так, чтобы при попадании мыши на рамку панели возвращались такие значения, чтобы за эту рамку можно было тянуть. В обработчике сообщения WM_SIZEпанели изменяем регион так, чтобы он соответствовал новому размеру панели. Все, дырка с изменяемыми размерами готова. Теперь нужно научить "дырку" менять размеры при изменении размеров окна, если окно стало слишком маленьким, чтобы вместить в себя дырку. Осталось только немного "навести красоту". "Красота" заключается в том, чтобы пользователь не мог уменьшить размеры дырки до нуля и увеличить так, чтобы она вышла за пределы окна, а также уменьшить окно так. чтобы дырка оказалась за пределами окна. Первая из этих задач решается просто: добавляется обработчик сообщения WM_SIZINGдля дырки таким образом, чтобы ее размеры не могли стать меньше, чем MinHoleSizeна MinHoleSizeпикселов, а границы нельзя было придвинуть к границам окна ближе, чем на HoleDistanceпикселов. Вторая задача решается еще проще: в обработчике WM_SIZEдырки меняем свойство Constraintsформы таким образом, чтобы пользователь не мог слишком сильно уменьшить окно. Теперь окно с дыркой ведет себя корректно при любых действиях пользователя с дыркой. Получившийся в результате код обработчика сообщений панели приведен в листинге 1.53.

Листинг 1.53. Обработчик сообщений панели, образующей "дырку"

procedure TFormHole.PanelWndProc(var Msg: TMessage);

var

Pt: TPoint;

R: TRect;

begin

POldPanelWndProc(Msg);

if Msg.Msg = WM_NCHITTEST then

begin

// Вся хитрость обработки сообщения WM_NCHITTEST

// заключается в правильном переводе экранных координат

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

// мыши на сторону рамки или в ее угол. Дело упрощается

// тем, что у панели нет неклиентской части, поэтому

// верхний левый угол окна и верхний левый угол клиентской

// части совпадают.

Pt := PanelHole.ScreenToClient(Point(Msg.LParamLo, Msg.LParamHi));

if Pt.X < BorderMouseSensivity then

if Pt.Y < CornerMouseSensivity then Msg.Result := HTTOPLEFT

else

if Pt.Y >= PanelHole.Height - CornerMouseSensivity then

Msg.Result := HTBOTTOMLEFT

else Msg.Result := HTLEFT

else

if Pt.X >= PanelHole.Width - BorderMouseSensivity then

if Pt.Y < CornerMouseSensivity then Msg.Result := HTTOPRIGHT

else

if Pt.Y >= PanelHole.Height - CornerMouseSensivity then

Msg.Result := HTBOTTOMRIGHT

else Msg.Result := HTRIGHT

else

if Pt.Y < BorderMouseSensivity then

if Pt.X < CornerMouseSensivity then Msg.Result := HTTOPLEFT

else

if Pt.X >= PanelHole.Width - CornerMouseSensivity then

Msg.Result := HTTOPRIGHT

else Msg.Result := HTTOP

else

if Pt.Y >= PanelHole.Height - BorderMouseSensivity then

if Pt.X < CornerMouseSensivity then

Msg.Result := HTBOTTOMLEFT

else

if Pt.X >= PanelHole.Width - CornerMouseSensivity then

Msg.Result := HTBOTTOMRIGHT

else Msg. Result := HTBOTTOM;

end

else if Msg.Msg = WM_SIZE then

begin

// Пересчитываем регион SetRegion;

// Устанавливаем новые ограничения для размеров окна.

// учитывающие новое положение дырки

Constraints.MinWidth :=

Width - ClientWidth + PanelHole.Left + MinHoleSize + HoleDistance;

Constraints.MinHeight :=

Height - ClientHeight + PanelHole.Top + MinHoleSize + HoleDistance;

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

Интервал:

Закладка:

Сделать


А. Григорьев читать все книги автора по порядку

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




О чём не пишут в книгах по Delphi отзывы


Отзывы читателей о книге О чём не пишут в книгах по Delphi, автор: А. Григорьев. Читайте комментарии и мнения людей о произведении.


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

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