Форум: "Media";
Текущий архив: 2002.10.17;
Скачать: [xml.tar.bz2];
ВнизОпять регионы. Найти похожие ветки
← →
.: 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 вся ветка
Форум: "Media";
Текущий архив: 2002.10.17;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c