Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.05;
Скачать: CL | DM;

Вниз

Выделение области мышкой   Найти похожие ветки 

 
Андрусь ©   (2002-11-23 12:41) [0]

Привет всем!Возникла такая вот сложность:
Нужно сделать фичу для выделения области мышкой(ну вроде как в Paintе). Чего делал - взял TShape,учтановил внутреннюю обл.прозрачной,на MouseDown проявлял его,на MouseMove-изменял размер за мышкой,MouseUp - скрывал.Вроде красиво,но когда внутри есть объекты - идёт их постоянная перерисовка при движении мыши,вследствие чего - моргание.Сделал по-другому:взял 4 TShape - 4 полосы-сверху,снизу,слева,справа.Обработал по аналогии. Теперь над внутренними объектами не моргает,зато моргают линии при перерисовке.
Посоветуйте как тут сделать попроще и чтоб работало. По идее рисовать можно и на панели,правда придётся самому и перерисовку делать при наложении линий...


 
Anatoly Podgoretsky ©   (2002-11-23 12:45) [1]

DrawFocusRect предназначен именно для этих целей


 
Андрусь ©   (2002-11-23 13:17) [2]

Спасибо,но вот такая ещё вот сложнось:в качестве параметра DrawFocusRect необх. передать контекст устройства,а у панели(на которой мне нужно рисовать) канвы нет.


 
PaRL ©   (2002-11-23 14:40) [3]


> Спасибо,но вот такая ещё вот сложнось:в качестве параметра
> DrawFocusRect необх. передать контекст устройства,а у панели(на
> которой мне нужно рисовать) канвы нет.


Я думаю через HDC можно попробовать.


 
Matolch ©   (2002-11-24 12:21) [4]

Этот код можно использовать без конкретной привязки к какому-то определенному компоненту, думаю, что это как раз то, что ну;но. В примере Панел1.Хендле можно заменить на еще какой - нибудь Хендл ещё какого - нибудь компонента.


unit Main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TTestForm = class(TForm)
Panel1: TPanel;
procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
end;

procedure DrawSoftFrame(Handle: HWND; X, Y: integer; Dx, Dy: integer);

var
TestForm: TTestForm;
dwFlag: boolean;
Xst, Yst: integer;
Dx, Dy: integer;

implementation

{$R *.dfm}

{ TTestForm }

procedure DrawSoftFrame(Handle: HWND; X, Y: integer; Dx, Dy: integer);

procedure DrawFRBounds(L,T,W,H: Integer);
var
h_DC: HDC;
begin
h_DC := GetDC(Handle);
DrawFocusRect(h_DC, Bounds(L, T, W, H));
end;

begin

if Dx*Dy = 0 then begin
DrawFRBounds(X+1,Y+2,0,0);
//Почему X+1, Y+2? Это значение для crArrow.
//Иначе несколько точек по уродски так выглядывают
//из - под курсора
//Для crCross - по другому как - нибудь.

exit;
end;

if Dx*Dy > 0 then
if (Dx>0) then
DrawFRBounds(X,Y,Dx,Dy)
else
DrawFRBounds(X+Dx,Y+Dy,-Dx,-Dy)
else
if (Dx>0) then
DrawFRBounds(X,Y+Dy,Dx,-Dy)
else
DrawFRBounds(X+Dx,Y,-Dx,Dy);
end;

procedure TTestForm.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
dwFlag := True;
Dx := 0; Xst := X;
Dy := 0; Yst := Y;
DrawSoftFrame(Panel1.Handle,X,Y,0,0);
end;

procedure TTestForm.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin;;
if not dwFlag then exit;
DrawSoftFrame(Panel1.Handle,Xst,Yst,Dx,Dy);
Dx := X - Xst;
Dy := Y - Yst;
DrawSoftFrame(Panel1.Handle,Xst,Yst,Dx,Dy);
end;

procedure TTestForm.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin;;
dwFlag := false;
Dx := X - Xst;
Dy := Y - Yst;
DrawSoftFrame(Panel1.Handle,Xst,Yst,Dx,Dy);
end;

end.


Единственный вопрос, может кто подскажет. Как определить, какой курсор у компонента, используя его дескриптор?


 
Андрусь ©   (2002-11-24 13:53) [5]

Всё-равно моргает.


 
Matolch ©   (2002-11-24 14:17) [6]

Чего моргает?

> Андрусь ©



 
Microsoft-Sword   (2002-11-24 14:26) [7]

Или кто там у тя моргает? У меня ничего не моргеат. Моргеат. Слово-то какое красивое....



Страницы: 1 вся ветка

Текущий архив: 2002.12.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
3-14378
Kurt
2002-11-19 16:35
2002.12.05
А можно ли в параметеризированными ADOQuery ставить фильтр?


4-14857
^Sanya
2002-10-23 20:33
2002.12.05
Как вырубить процесс...


4-14875
Dead Stark
2002-10-24 07:57
2002.12.05
Как получить имя текущего залогиненного пользователя ?


1-14494
Vit@ly
2002-11-26 09:17
2002.12.05
Как поместить ComboBox на заголовок формы?


4-14862
DarkGreen
2002-10-24 08:01
2002.12.05
Fonts и его размеры