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

Вниз

Опять регионы.   Найти похожие ветки 

 
.: Joiro :. ©   (2002-06-15 13:31) [0]

Ну так – всё ещё бьюсь с регионами. Создание, обработка на присутсвие мыши, более правильная перерисовка, итд. С этим я скорее всего разберусь сам, но вот одну вещь никак не могу придумать:

Как работая с регионами определть что мышь ПОКИНУЛА данный регион. На присутсвие и отсутсвие можно проверять их пачками, но если речь идёт о одном конкретном регионе?

Тестовую программу куда я напихал несколько регионов и сделал разные проверки можно скачать здесь: http://www.ltn.lv/~joiro/REGIONS.zip

Там также можно видеть нароботки изменяемого интерфейса, но так как это тест регионов там нет никаких быстрых функцый для графики (для примера и не надо). Также видно как планируется реализовать перемещение (на W2K или XP будет лучще выглядеть). Это соурс и только 9Кб так что можете смело посмотреть.


 
.: Joiro :. ©   (2002-06-16 11:13) [1]

Похоже что вопрос попался слишком брутальный... окей...

Часть этого можно добится используя переменную, которая следит за тем в котором регионе мышь находилась в последния раз и если есть изменения то делает перерисовку: (Last)

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
var
HR: HRGN;
I: Integer;
begin
T.StartTimer;
for I:=0 to List.Count-1 do begin
HR:=HRGN(List[I]);
if PtInRegion(HR,X,Y) then begin
if Last <> I then Canvas.Draw(1,1,B);
PaintRgn(Canvas.Handle,HR);
Last := I;
end;
end;


Но тут это работает только между регионами – если мышь не над кнопкой то перерисовка не пройзойдёт и останется засвеченая кнопка хотя курсор уже в соверщенно другом месте.

Как реализовать полноценную проверку?

А также – может я ошыбся (да, бывает) и есть мэтод получще? Сейчас с тестами проверил – встроенные компоненты (Button,Shape) реагируют на мышь очень быстро, но всё равно не нравится то что они занимают место у них кучи ненужных параметров.

У самого с созданием собственных компонентов опыта нет, так что и создать что-то я не в силах. (Может есть ссылки на полноценный туториал (язык не важен) по созданию своих компонентов?)

Значит нужны прозрачные регионы, которые могут реагировать на MouseIn, MouseOut и MouseDown (примерно так) и которые более-менее легко создавать на форме и получить координаты/размеры. Есть предложения?


 
.: Joiro :. ©   (2002-06-16 16:15) [2]

Хммм... монолог получился... Anyway...

Ну так - покопался в FAQах, подумал немножко и сделал примочку к стандартному Shape для определения MouseEnter и MouseLeave. Выглядит вот так:

unit ShapeEx;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, ExtCtrls;

type
TShapeEx = class(TShape)
private
{ Private declarations }
FOnMouseLeave: TNotifyEvent;
FOnMouseEnter: TNotifyEvent;
FDoHighlight: Boolean;
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property DoHighlight: Boolean read FDoHighlight write FDoHighlight;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents("Additional", [TShapeEx]);
end;

procedure TShapeEx.CMMouseEnter(var Message: TMessage);
begin
if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
end;

procedure TShapeEx.CMMouseLeave(var Message: TMessage);
begin
if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
end;

end.


Вроде всё правильно и работает прилично.

Тогда последний вопрос - во время експериментов я ставил ShapeEx в папку Samples, но когда более-менее закончил это дело решил ставить в Additional, но Delphi всё равно ставит в Samples. Похоже что где-то записывается куда ставился новый компонент. Как справится с этим?



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

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

Наверх




Память: 0.48 MB
Время: 0.015 c
4-56411
NAlexey
2002-09-03 13:33
2002.10.17
Как узнать нажат ли CTRL


1-56060
Keplin Sergey
2002-10-04 16:09
2002.10.17
Как можно проверить строку на наличие хотябы одной буквы?


14-56271
Igor_thief
2002-09-20 14:58
2002.10.17
ListBox


1-56123
Freeze
2002-10-09 11:46
2002.10.17
Как сделать random в radiogroup.items


1-56091
HinderEvil
2002-10-07 19:30
2002.10.17
Как выполнить код из строки...