Цитата:
Сообщение от Страдалецъ
С чего вы взяли, что такого кроме GLScene нет? Полно компонент в которых есть аналогичная реализация. Например ImageList,TreeView и т.д. Компонент, это та-же программа, только со своей спецификой и как вы реализуете его свойства это зависит от вашей фантазии.
|
Ну вот захотелось мне привести GLScene. Вот я и спрашиваю, как создать эти форточки?
"как вы реализуете его свойства это зависит от вашей фантазии" - дык я же понятно выразился что конкретно нужно сделать! Нужно чтобы по клику на свойство Image.Material в design time сейчас (на пепрвом этапе) вызывалась пустая форма, где потом можно будет параметры компонентра.
Пишите, пожалуйста, по теме. *-Image приведён для примера. Выглядит объявление в ImageList вот так:
Код:
TImageList = class(TDragImageList)
published
property BlendColor;
property BkColor;
property AllocBy;
property DrawingStyle;
property Height;
property ImageType;
property Masked;
property OnChange;
property ShareImages;
property Width;
end;
Насколько я понимаю, здесь указываются лишь те свойства, которыфе должны остаться от
наследника:
Код:
TDragImageList = class(TCustomImageList)
private
FDragCursor: TCursor;
FDragging: Boolean;
FDragHandle: HWND;
FDragHotspot: TPoint;
FDragIndex: Integer;
procedure CombineDragCursor;
procedure SetDragCursor(Value: TCursor);
protected
procedure Initialize; override;
public
function BeginDrag(Window: HWND; X, Y: Integer): Boolean;
function DragLock(Window: HWND; XPos, YPos: Integer): Boolean;
function DragMove(X, Y: Integer): Boolean;
procedure DragUnlock;
function EndDrag: Boolean;
function GetHotSpot: TPoint; override;
procedure HideDragImage;
function SetDragImage(Index, HotSpotX, HotSpotY: Integer): Boolean;
procedure ShowDragImage;
property DragCursor: TCursor read FDragCursor write SetDragCursor;
property Dragging: Boolean read FDragging;
end;
Сдаётся мне, что процедура SetDragCursor является обработчиком клика по компоненту:
Код:
procedure TDragImageList.SetDragCursor(Value: TCursor);
begin
if Value <> DragCursor then
begin
FDragCursor := Value;
if Dragging then CombineDragCursor;
end;
end;
Ну вот начинается хождение по модулям, но в итоге всё равно это не объясняет как сделана форточка. CombineDragCursor:
Код:
procedure TDragImageList.CombineDragCursor;
var
TempList: HImageList;
Point: TPoint;
begin
if DragCursor <> crNone then
begin
TempList := ImageList_Create(GetSystemMetrics(SM_CXCURSOR),
GetSystemMetrics(SM_CYCURSOR), ILC_MASK, 1, 1);
try
ImageList_AddIcon(TempList, Screen.Cursors[DragCursor]);
ImageList_AddIcon(TempList, Screen.Cursors[DragCursor]);
ImageList_SetDragCursorImage(TempList, 0, 0, 0);
ImageList_GetDragImage(nil, @Point);
ImageList_SetDragCursorImage(TempList, 1, Point.X, Point.Y);
finally
ImageList_Destroy(TempList);
end;
end;
end;