Читаем О чём не пишут в книгах по Delphi полностью

 if R.Bottom > ClientHeight — HoleDistance then

R.Bottom:= ClientHeight — HoleDistance;

 // Копируем прямоугольник R, переводя его координаты

 // обратно в экранные

PRect(Msg.LParam)^.TopLeft:= ClientToScreen(R.TopLeft);

 PRect(Msg.LParam)^.BottomRight:= ClientToScreen(R.BottomRight);

 end;

end;

Остается еще одна ситуация, когда границы "дырки" могут подойти к границам окна слишком близко: когда пользователь меняет не границы "дырки", а границы самого окна. Чтобы этого не случилось, нужно отслеживать изменения размеров окна и соответствующим образом менять размеры дырки — для этого нам потребуется изменить размеры панели и пересчитать регион. Пересчет региона необходим и в случае увеличения размеров окна: если его не пересчитать, получится, что часть окна не будет попадать в регион и будет отрезана. Все перечисленные действия выполняются в обработчике сообщения WM_SIZE окна (листинг 1.54).

Листинг 1.54. Обработчик сообщения WM_SIZE главного окна

procedure TFormHole.WMSize(var Msg: TWMSize);

begin

 inherited;

 // При уменьшении размеров окна уменьшаем размер дырки,

 // если границы окна подошли слишком близко к ней

 if PanelHole.Left + PanelHole.Width > ClientWidth — HoleDistance then

PanelHole.Width:= ClientWidth — HoleDistance — PanelHole.Left;

 if PanelHole.Top + PanelHole.Height > ClientHeight — HoleDistance then

PanelHole.Height:= ClientHeight — HoleDistance — PanelHole.Top;

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

 // иначе та часть, которая добавилась, окажется за его

 // пределами и будет отрезана SetRegion;

 // Пересчитываем координаты стрелок

 CalculateArrows;

 Invalidate;

end;

Напоследок добавим к программе один "бантик": красные стрелки по углам формы, за которые можно потянуть, чтобы изменить ее размер. Каждая стрелка будет представляться отдельным регионом. Координаты регионов должны быть привязаны к соответствующим углам окна, поэтому при изменении размеров окна эти координаты придется пересчитывать (в листинге 1.54 можно найти соответствующий вызов). Все стрелки выглядят одинаково, но являются зеркальным отражением друг друга. Чтобы рассчитывать координаты стрелок, мы зададим координаты одной нарисованной заранее стрелки в виде константы, а потом будем рассчитывать на основе этих данных координаты реальных стрелок, отражая их от нужной плоскости и добавляя требуемое смещение (листинг 1.55).

Листинг 1.55. Расчет координат стрелок

// координаты верхней левой стрелки, отсчитанные от точки

// (0,0). Для получения координат реальных стрелок эти точки

// будут смещаться и отражаться

const

 ArrowTemplate: TArrowCoords = (

(X:0; Y:0), (X:24; Y:0), (X:17; Y:7), (X:29; Y:19),

 (X:19; Y:29), (X:7; Y:17), (X:0; Y:24));

procedure TFomHole.CalculateArrows;

var

 Arrow: TArrowCoords;

 I: Integer;

begin

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

 // Координаты просто смещаются на постоянную величину

 for I:= 0 to High(Arrow) do

 begin

Arrow[I].X:= ArrowTemplate[I].X + ArrowOffset;

 Arrow[I].Y:= ArrowTemplate[I].Y + ArrowOffset;

 end;

 // При необходимости уничтожаем старый регион

 if ArrowTopLeft <> 0 then DeleteObject(ArrowTopLeft);

 ArrowTopLeft:=

CreatePolygonRgn(Arrow[0], Length(Arrow), WINDING);

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

 // Координаты по X отражаются и смещаются

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных