Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как обрисовать выделенный регион штриховой (пунктирной) линией? [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо