Форум: "Основная";
Текущий архив: 2002.12.05;
Скачать: [xml.tar.bz2];
ВнизВыделение области мышкой Найти похожие ветки
← →
Андрусь (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c