с визуальной точки зрения, по умолчанию, если окно имеет значительные границы, то все края рисуются значительными, в противном случае ни из них, не существует в промежутке между как Win32 API не имеет концепция стилей границ границ, только стили границ всего окна. Если вы хотите, чтобы различные границы выглядели по-разному, вам, скорее всего, придется вручную нарисовать границы, обратив непосредственно сообщения и WM_NCPAINT
.
От функциональный точки зрения, довольно легко предотвратить изменение размера окна на конкретных краях. Самый простой способ состоит в том, чтобы панель обрабатывала сообщение WM_NCHITTEST
. Дайте панели нормальные размеры границ (при необходимости нарисованные на заказ), а затем сначала передайте полученное сообщение WM_NCHITTEST
обработчику по умолчанию, а затем отредактируйте результат по мере необходимости. Преимущество этого подхода заключается в том, что ОС не позволит пользователю захватывать любой край, который сообщается как HTBORDER
(несущественная граница), и не будет визуальной обратной связи, что край может быть изменен (даже если это действительно так).
Например, давайте воспользуемся примером панели с выравниванием по левому краю. Если обработчик по умолчанию возвращает HTBOTTOM
, HTBOTTOMLEFT
, HTLEFT
, HTTOPLEFT
, или HTTOP
, вместо этого возвращает HTBORDER
. Если обработчик по умолчанию возвращает HTBOTTOMRIGHT
или HTTOPRIGHT
, вместо этого возвращает HTRIGHT
. В противном случае возвратите возвращаемый обработчик по умолчанию.
Отрегулируйте значения по мере необходимости, исходя из того, на каком краю панели вы хотите быть значительными.
Например:
type
TMyPanelForm = class(TForm)
private
fWhichSideCanBeResized: TAlign;
procedure WMNCHitTest(var Message: TMessage); message WM_NCHITTEST;
end;
procedure TMyPanelForm.WMNCHitTest(var Message: TMessage);
begin
inherited;
case fWhichSideCanBeResized of
alLeft:
begin
case Message.Result of
HTBOTTOM, HTBOTTOMRIGHT, HTRIGHT, HTTOPRIGHT, HTTOP:
Message.Result := HTBORDER;
HTBOTTOMLEFT, HTTOPLEFT:
Message.Result := HTLEFT;
end;
end;
alRight:
begin
case Message.Result of
HTBOTTOM, HTBOTTOMLEFT, HTLEFT, HTTOPLEFT, HTTOP:
Message.Result := HTBORDER;
HTBOTTOMRIGHT, HTTOPRIGHT:
Message.Result := HTRIGHT;
end;
end;
alTop:
begin
case Message.Result of
HTLEFT, HTBOTTOMLEFT, HTBOTTOM, HTBOTTOMRIGHT, HTRIGHT:
Message.Result := HTBORDER;
HTTOPLEFT, HTTOPRIGHT:
Message.Result := HTTOP;
end;
end;
alBottom:
begin
case Message.Result of
HTLEFT, HTTOPLEFT, HTTOP, HTTOPRIGHT, HTRIGHT:
Message.Result := HTBORDER;
HTBOTTOMLEFT, HTBOTTOMRIGHT:
Message.Result := HTBOTTOM;
end;
end;
end;
end;
В качестве альтернативы:
procedure TMyPanelForm.WMNCHitTest(var Message: TMessage);
begin
inherited;
case Message.Result of
HTLEFT:
if fWhichSideCanBeResized <> alLeft then
Message.Result := HTBORDER;
HTRIGHT:
if fWhichSideCanBeResized <> alRight then
Message.Result := HTBORDER;
HTTOP:
if fWhichSideCanBeResized <> alTop then
Message.Result := HTBORDER;
HTBOTTOM:
if fWhichSideCanBeResized <> alBottom then
Message.Result := HTBORDER;
HTTOPLEFT:
case fWhichSideCanBeResized of
alTop: Message.Result := HTTOP;
alLeft: Message.Result := HTLEFT;
else
Message.Result := HTBORDER;
end;
HTBOTTOMLEFT:
case fWhichSideCanBeResized of
alBottom: Message.Result := HTBOTTOM;
alLeft: Message.Result := HTLEFT;
else
Message.Result := HTBORDER;
end;
HTTOPRIGHT:
case fWhichSideCanBeResized of
alTop: Message.Result := HTTOP;
alRight: Message.Result := HTRIGHT;
else
Message.Result := HTBORDER;
end;
HTBOTTOMRIGHT:
case fWhichSideCanBeResized of
alBottom: Message.Result := HTBOTTOM;
alRight: Message.Result := HTRIGHT;
else
Message.Result := HTBORDER;
end;
end;
end;
Почему бы не использовать разветвитель? – Johan
Ну, это нормально использовать сплиттер с состыкованными формами, но не в этом случае. –