Показать полную графическую версию : [решено] Проблема с видом формы
забываю говорить всем "спасибо »
А спрашивать не забываете? ....элементарная норма поведения воспитанного человека. Кстати для этого существует кнопка. Ну да я не об этом.
В примере решены вопросы которые вы ставили (отсутствие Caption, отсутствие резинового контура, отсутствие возможности изменять размер и изменение вида курсора). Просто, у вас большое желание видеть скругленные края - воспользуйтесь API функцией CreateRoundRectRgn. Добавьте возможность перетаскивать форму за поле и т.д. И оформите интерфейс как вам нужно.
Malfatto
23-05-2011, 18:55
opel431, наверное, это моя вина, что я недостаточно ясно высказал то, что мне нужно.
в скриншоте в 1 посте показано, как должна выглядеть форма. такого вида можно добиться только на Windows 7 и Vista, на XP в любом случае такого эффекта не получить. то, чего мне нужно было, я почти добился. а именно, с помощью кода из первого поста я получил форму вот такого вида:
http://s50.radikal.ru/i128/1105/dd/c7e5cb528ddd.jpg
также я запретил изменение размера окна (кстати, ваше решение с WM_SYSCOMMAND оказалось более рационално, использую сейчас его). единственное, что сбивает с толку, так это курсор, который меняется на "растягивающий" при наведение на края формы.
собственно, в этом и состоял вопрос. как убрать изменение курсора, ну или найти другой способ изменить стиль формы, чтобы она была как на скриншоте из первого поста.
собственно, в этом и состоял вопрос. как убрать изменение курсора »
Я, приводил вам пример при BorderStyle=bsSingle
private
{ Private declarations }
procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
public
{ Public declarations }
procedure CreateParams(var Params: TCreateParams); override;
end;
// запретить Caption
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited Createparams(Params);
with Params do
Style := (Style or WS_POPUP) and not WS_DLGFRAME;
end;
// запретить изменение размера
procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
if ((Msg.CmdType and $FFF0) = SC_SIZE) then
begin
Msg.Result := 0;
Exit;
end;
inherited;
end;
//Форму возможно придется "перемещать", но как?
// например при нажатии на панели)
procedure TForm1.Panel4MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
SC_DragMove = $F012;
begin
ReleaseCapture;
Form1.Perform(WM_SysCommand, SC_DragMove, 0);
end;
Дерзайте!
Malfatto
23-05-2011, 19:25
opel431, я ведь уже говорил, что при если использовать
Params.Style:=(Params.Style or WS_POPUP) and not WS_DLGFRAME;
то при этом
остаётся лишь рамка шириной 1 пиксель, а не то, что в 1 посте. »
то при этом »
На форму панель=Client + BorderWidth=4 + Bevellnner=bvLowered+BevelOuter=bvRaised.
Malfatto
23-05-2011, 19:39
opel431, я ещё раз говорю, что это даёт совершенно не тот результат. зачем изобретать велосипед, да ещё и с квадратными колёсами?
p.s. опять Вы, видимо, не поняли что мне нужно... и я уже просто не знаю, как я могу разъяснить то, что мне нужно, ещё более грамотно :(
опять Вы, видимо, не поняли что мне нужно... »
Результат
http://s010.radikal.ru/i314/1105/a8/0b44bcfb6f07.jpg (http://www.radikal.ru)
Те же свойства (что в предыдущем посте) есть и у формы, стиль и размер!
Подробно: Форма+Панель
Свойства формы:
BorderWidth=4
Свойства панели (Без этого нет эффекта)
Align=alClient
Bevellnner=bvNone
BevelOuter=bvLowered
Т.е вариации "стиля" зависят от заданных свойств.
Malfatto
23-05-2011, 19:55
opel431, всё равно результат не тот.
всё равно результат не тот. »
Вы сначала посмотрите, что вы используете, а потом задавайтесь вопросом.
WS_THICKFRAME - Создание окна с толстой рамкой. Рамка используется для изменения размеров окна.
Malfatto
23-05-2011, 20:06
opel431, собственно, только с помощью WS_THICKFRAME и получается сделать толстую рамку, как на скриншоте. потому я и создал эту тему, чтобы мне подсказали аналог, или вообще как можно сделать иначе.
p.s. вот здесь (http://social.msdn.microsoft.com/Forums/ru-RU/fordesktopru/thread/517dc3b9-f42d-4974-9ee0-dd5614fa8a5a), например, показано решение на Visual C#. как провернуть подобное на делфи - в этом и вопрос.
показано решение на Visual C# »
Посмотрел! Какой вопрос такой и ответ!
как сделать форму без заголовка с тонкой системной рамкой?
Malfatto, В приведенном примере получается так же как и у Вас, рамка такая как и нужно, но ресайзить тоже можно :(
Ведь можно же как то сделать такую, но без возможности изменения размеров!
Для общего понимания стиля формы!
Вот как стиль решается на WinAPI.
bsSizeable (Эти параметры устанавливаются автоматически)
Form.Style := WS_THICKFRAME or WS_SYSMENU or WS_MAXIMIZEBOX or WS_MINIMIZEBOX or WS_VISIBLE;
bsSingle
Form.Style := WS_BORDER or WS_SYSMENU or WS_MAXIMIZEBOX or WS_MINIMIZEBOX or WS_VISIBLE;>
bsNone
Form.Style := WS_POPUP or WS_VISIBLE;
bsDialog
Form.Style := WS_BORDER or WS_SYSMENU or WS_VISIBLE;
bsSizeToolWin
Form.ExStyle := WS_EX_TOOLWINDOW;
bsToolWindow
Form.Style := WS_BORDER or WS_SYSMENU or WS_VISIBLE;
Malfatto
24-05-2011, 01:37
попросил у друга, у которого Visual C# есть создать программу с кодом отсюда (http://social.msdn.microsoft.com/Forums/ru-RU/fordesktopru/thread/517dc3b9-f42d-4974-9ee0-dd5614fa8a5a), так и края эти появляются только если окно Sizeable... видимо, остаётся лишь один вариант - запретить смену курсора при наведении на рамки.
Malfatto
28-05-2011, 21:13
В общем, решил действительно попробовать сделать через WM_NCHITTEST:
procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
Msg.Result:=0;
end;
И всё отлично заработало :) при наведении на края курсор не меняется, менять размер формы нельзя. а с помощью CreateParams того вида, что в первом посте, я добился.
Спасибо большое всем за помощь, проблема решена.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.