![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как обрисовать выделенный регион штриховой (пунктирной) линией? [D7, WinXP]
Dr. Andrew © (2007-07-31 03:56:00)Доброй ночи, Мастера! Функция FrameRgn обрисовывает регион сплошной линией, а как обрисовать выделенный регион штриховой (пунктирной) линией с использованием региона?
Инс (2007-07-31 10:37:00) [1]Может подойдет это?
procedure DrawFocusRgn(DC: HDC; Reg: HRGN; x,y: integer; Width: integer);
var
Bitmap, MaskField: TBitmap;
RgnBox: TRect;
begin
GetRgnBox(Reg,RgnBox);
Bitmap:=TBitmap.Create;
Bitmap.Width:=RgnBox.Right;
Bitmap.Height:=RgnBox.Bottom;
Bitmap.Canvas.Brush.Color:=clBlack;
Bitmap.Canvas.Rectangle(0,0,Bitmap.Width,Bitmap.Height);
Bitmap.Canvas.Brush.Color:=clWhite;
FrameRgn(Bitmap.Canvas.Handle,Reg,Bitmap.Canvas.Brush.Handle,Width,Width);
MaskField:=TBitmap.Create;
MaskField.Width:=Bitmap.Width;
MaskField.Height:=Bitmap.Height;
MaskField.Canvas.Brush.Bitmap:=Mask;
MaskField.Canvas.FillRect(Rect(0,0,MaskField.Width,MaskField.Height));
BitBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height,
MaskField.Canvas.Handle,0,0,SRCAND);
BitBlt(DC,x,y,Bitmap.Width,Bitmap.Height,Bitmap.Canvas.Handle,0,0,SRCINVERT);
MaskField.Free;
Bitmap.Free;
end;
Инс (2007-07-31 10:18:00) [2]1. Может вместо региона записать Path?
2. Может вместо того, чтобы очертить регион пунктиром, очертите его инвертирующей кистью? Тоже будет выделяться и смотрится не так плохо.
3. Придумать (найти) хитрый алгоритм для выделения границы региона (в виде Path, например). Правда в общем случае граница региона может быть сложной (дырки внутри), это нужно учесть.
MBo (2007-07-31 09:24:00) [3]
var
hr1, hr2: HRGN;
br: HBRUSH;
begin
hr1 := CreateEllipticRgn(100, 100, 300, 300);
hr2 := CreateRectRgn(150, 250, 250, 400);
CombineRgn(hr1, hr1, hr2, RGN_OR);
br := CreateHatchBrush(HS_DIAGCROSS, 0);
FrameRgn(Canvas.Handle, hr1, br, 1, 1);
DeleteObject(br);
DeleteObject(hr1);
DeleteObject(hr2);
MBo (2007-07-31 09:20:00) [4]>а что-то типа HS_CROSS
Я пробовал, для прямоугольных - нормально, для округлых - убого получается
Однокамушкин (2007-07-31 08:48:00) [5]
> Функция FrameRgn обрисовывает регион сплошной линией
А если использовать не сплошную кисть, а что-то типа HS_CROSS? Это, конечно, не совсекм пунктир получится, но для вашего случая, возможно, подойдёт...
MBo (2007-07-31 06:09:00) [6]Для регионов нет функций рисования границы пером
Так что траекторию создай (Path) и StrokePath