Войти

Показать полную графическую версию : [решено] Проблема с видом формы


Страниц : 1 [2]

opel431
23-05-2011, 17:32
забываю говорить всем "спасибо »
А спрашивать не забываете? ....элементарная норма поведения воспитанного человека. Кстати для этого существует кнопка. Ну да я не об этом.
В примере решены вопросы которые вы ставили (отсутствие 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 оказалось более рационално, использую сейчас его). единственное, что сбивает с толку, так это курсор, который меняется на "растягивающий" при наведение на края формы.

собственно, в этом и состоял вопрос. как убрать изменение курсора, ну или найти другой способ изменить стиль формы, чтобы она была как на скриншоте из первого поста.

opel431
23-05-2011, 19:03
собственно, в этом и состоял вопрос. как убрать изменение курсора »

Я, приводил вам пример при 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 посте. »

opel431
23-05-2011, 19:35
то при этом »
На форму панель=Client + BorderWidth=4 + Bevellnner=bvLowered+BevelOuter=bvRaised.

Malfatto
23-05-2011, 19:39
opel431, я ещё раз говорю, что это даёт совершенно не тот результат. зачем изобретать велосипед, да ещё и с квадратными колёсами?

p.s. опять Вы, видимо, не поняли что мне нужно... и я уже просто не знаю, как я могу разъяснить то, что мне нужно, ещё более грамотно :(

opel431
23-05-2011, 19:42
опять Вы, видимо, не поняли что мне нужно... »
Результат
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, всё равно результат не тот.

opel431
23-05-2011, 20:02
всё равно результат не тот. »
Вы сначала посмотрите, что вы используете, а потом задавайтесь вопросом.
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#. как провернуть подобное на делфи - в этом и вопрос.

opel431
23-05-2011, 20:11
показано решение на Visual C# »
Посмотрел! Какой вопрос такой и ответ!
как сделать форму без заголовка с тонкой системной рамкой?

LilLoco
23-05-2011, 20:19
Malfatto, В приведенном примере получается так же как и у Вас, рамка такая как и нужно, но ресайзить тоже можно :(

Ведь можно же как то сделать такую, но без возможности изменения размеров!

opel431
23-05-2011, 20:21
Для общего понимания стиля формы!
Вот как стиль решается на 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