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

Примечание

Для рисования на поверхности панели, вообще говоря, существует более простой и правильный способ: нужно положить на панель компонент TPaintBox, растянуть его на всю область панели и рисовать в его событии OnPaint. Мы здесь используем более сложный способ перехвата сообщения WM_PAINT только в учебных целях.

При перехвате сообщения WM_PAINT любого компонента, на котором расположены неоконные визуальные компоненты, может возникнуть проблема с перерисовкой этих компонентов. Чтобы продемонстрировать способ решения этих проблем, разместим на панели компонент TLabel, который заодно будет показывать пользователю реакцию на двойной щелчок правой кнопкой мыши. В результате получается окно, показанное на рис. 1.9. При двойном щелчке правой кнопкой мыши на панели надпись Сделайте двойной щелчок правой кнопкой перемещается в то место, где находится курсор. Чтобы перехватить оконную процедуру панели, следует написать метод, который ее подменит, а адрес старого метода сохранить в предназначенном для этого поле. Сам перехват будем осуществлять в обработчике события OnCreate формы (листинг 1.29).

Рис. 1.9. Окно программы PanelMsg

Листинг 1.29. Перехват обработчика сообщений панели

type

 TForm1 = class(TForm)

 Panel: TPanel;

 Label1: TLabel;

procedure FormCreate(Sender: TObject);

 private

// Здесь будет храниться исходный обработчик сообщений

 // панели

FOldPanelWndProc: TWndMethod;

// Этот метод будет перехватывать сообщения,

// предназначенные панели

procedure NewPanelWndProc(var Msg: TMessage);

 end;

procedure TForm1.FontCreate(Sender: TObject);

begin

 FOldPanelWndProc:= Panel.WindowProc;

 Panel.WindowProc:= NewPanelWndProc;

end;

Сам перехватчик выглядит так, как показано в листинге 1.30.

Листинг 1.30. Метод-перехватчик сообщений панели

procedure TForm1.NewPanelWndProc(var Msg: TMessage);

var

 NeedDC: Boolean;

 PS: TPaintStruct;

 PanelCanvas: TCanvas;

begin

 if Msg.Msg = WM_RBUTTONDBLCLK then

 begin

Label1.Left:= Msg.LParamLo;

 Label1.Top:= Msg.LParamHi;

 Msg.Result:= 0;

 end

 else if Msg.Msg = WM_PAINT then

 begin

// Проверяем, был ли запрошен контекст устройства

 // обработчиком, стоящим раньше по цепочке, и если не

 // был, то запрашиваем его.

 NeedDC:= Msg.WParam = 0;

 if NeedDC then Msg.WParam:= BeginPaint(Panel.Handle, PS);

 // Вызываем старый обработчик WM_PAINT. Его нужно

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

 // на поверхности что-то свое, т. к. в противном случае

 // это что-то будет закрашено стандартным обработчиком.

 POldPanelWndProc(Msg);

// При использовании графических функций API самое

 // неудобное — это вручную создавать и уничтожать кисти,

 // карандаш и т. п. Поэтому здесь создается экземпляр

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

 // с дескриптором, полученным при вызове BeginPaint.

 PanelCanvas:= TCanvas.Create;

 try

PanelCanvas.Handle:= Msg.WParam;

 FanelCanvas.Pen.Style:= psClear;

 PanelCanvas.Brush.Style:= bsSolid;

 PanelCanvas.Brush.Color:= clWhite;

PanelCanvas.Ellipse(10, 10, Panel.Width — 10, Panel.Height — 10);

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

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

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

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

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

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

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

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

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