Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-14823
Alex-F
2002-11-16 01:20
2002.12.05
Установка компонент


1-14567
Дмитрий К.К.
2002-11-26 08:16
2002.12.05
Очередной вопрос о создании компонентов в run-time


1-14604
nika_ufc
2002-11-24 17:34
2002.12.05
все хорошо НО.............


1-14496
AndreyAGSoft
2002-11-26 09:27
2002.12.05
Key generator


4-14866
Max2
2002-10-24 15:12
2002.12.05
Changing a size of window





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский