Я пытаюсь создать пользовательский элемент управления Combobox, который отображает Treeview. Все выглядит хорошо. Но когда я пытаюсь добавить функциональность изменения времени выполнения для этого элемента управления, всплывающее окно (Treeview) просто перемещается и не изменяет его размер.Как динамически изменять всплывающее окно во время выполнения?
Любое предложение будет оценено.
Snippets для всплывающего окна:
On Создать:
ControlStyle := ControlStyle + [csNoDesignVisible, csReplicatable, csDoubleClicks];
На Создать Params:
begin
inherited CreateParams(Params);
with Params do
begin
Style := Style or WS_POPUP or WS_VSCROLL or WS_BORDER;
ExStyle := WS_EX_TOOLWINDOW;
AddBiDiModeExStyle(ExStyle);
//WindowClass.Style := CS_SAVEBITS; {this would prevent ondoubleclick event}
end;
На мышь Move:
var
ARect, RR: TRect;
DragStyle: TDragStyle;
Procedure SetDragStyle(ds:TDragStyle; c:TCursor);
begin
FDragStyle:=ds;
Cursor:=c;
end;
begin
inherited;
FMouseMoveSelected := GetNodeAt(x, y);
if FDragged then begin
case FDragStyle of
dsSizeLeft :begin
SetWindowPos(Handle, HWND_TOP, Left+(x-FDragPos.X), Top, Width, Height,
SWP_NOACTIVATE or SWP_SHOWWINDOW);
//Left:=Left+(x-FDragPos.X); {alternate code that doesn't work either}
end;
end;
FDragPos:=Point(x,y);
end else begin
SetDragStyle(dsMove,crDefault);
ARect := GetClientRect;
RR:=ARect;
InflateRect(RR,-2,-2);
if (x>=0) and (x<=Width) and (y>=0) and (y<=Height) and (not PtInRect(RR,Point(x,y))) then begin
if (x<=RR.Left) then begin
//if (y<=RR.Top) then SetDragStyle(dsSizeTopLeft,crSizeNWSE)else
if (y>=RR.Bottom) then SetDragStyle(dsSizeBottomLeft,crSizeNESW)
else SetDragStyle(dsSizeLeft,crSizeWE);
end else if (x>=RR.Right) then begin
//if (y<=RR.Top) then SetDragStyle(dsSizeTopRight,crSizeNESW) else
if (y>=RR.Bottom) then SetDragStyle(dsSizeBottomRight,crSizeNWSE)
else SetDragStyle(dsSizeRight,crSizeWE);
end else begin
//if (y<=RR.Top) then SetDragStyle(dsSizeTop,crSizeNS) else
if (y>=RR.Bottom) then SetDragStyle(dsSizeBottom,crSizeNS)
else SetDragStyle(dsMove,crDefault);
end;
end;
end;
end;
end;
На мышь вниз:
begin
inherited;
if FDragStyle<>dsMove then begin
FDragPos:=point(x,y);
FDragged:=true;
end;
end;
На Mouse Up:
begin
inherited;
FDragged:=false;
end;
Почему вы не установить стиль WS_THICKFRAME и сделать с ним? –
Да, правильно. Очень хорошее предложение. Он менял размер без необходимости моего кода на события мыши. Я пробовал это. Теперь проблема в том, что она изменяет размеры всего направления, поэтому я должен реализовать дополнительные процедуры, чтобы предотвратить изменение размера слева и сверху. **Благодаря**. – theodorusap
Добро пожаловать. Используете ли вы это или нет, я отправил ответ за то, что, по моему мнению, было неправильным. –