Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Проблема с видом формы (http://forum.oszone.net/showthread.php?t=207357)

Malfatto 22-05-2011 20:19 1680727

Проблема с видом формы
 
В общем, нужно сделать форму вот такого вида:



Перепробовал разные варианты, похожий результат даёт лишь это:

BorderStyle = bsNone;

Код:

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style:=Params.Style or (WS_THICKFRAME or WS_DLGFRAME);
end;

Однако, при этом размер самой формы можно менять (появляются стрелочки при наведение на края). Как сделать так, чтобы размер формы при этом нельзя было менять?

LilLoco 22-05-2011 20:30 1680736

Цитата:

Цитата Malfatto
BorderStyle = bsNone; »

при установке этого свойства размер формы не меняется!

Не особо понятно почему у Вас появляются стрелочки изменения размера.

Malfatto 22-05-2011 20:44 1680744

LilLoco, Вы код посмотрите...

LilLoco 22-05-2011 20:52 1680747

А почему бы просто не сделать через то свойство?

Malfatto 22-05-2011 21:07 1680757

LilLoco, там на выбор только bsNone, bsSingle, bsSizeable, bsSizeToolWin и bsToolWindow. того что мне надо, понятное дело, нету.

LilLoco 22-05-2011 21:20 1680762

Все, я понял ,что Вам нужно! Сразу не дошло :(

Ну так WS_THICKFRAME добавляет возможность изменять размеры формы.

Malfatto 22-05-2011 21:45 1680778

LilLoco, так ведь с помощью него и делается эта рамка. вот я и спрашиваю, может есть другие способы? :)

LilLoco 22-05-2011 21:49 1680779

А если как-нибудь задать максимальный и минимальный размер формы. Это никак не изменит ситуацию?

Malfatto 22-05-2011 21:53 1680782

LilLoco, да, я уже так и решал эту проблему. однако, при наведении на края появляются стрелочки, что выглядит очень некрасиво :)

скриншот в первом посте - из стандартной программы Windows 7, и как раз в ней нельзя менять размер окна.

LilLoco 22-05-2011 22:05 1680792

Цитата:

Цитата Malfatto
при наведении на края появляются стрелочки, что выглядит очень некрасив »

Согласен, не только некрасиво, но и сбивает с толку)

По-любому как то можно, нужно просто наверное поиграть с флагами отображения!

Блин, тоже заинтересовал этот вопрос, никогда до этого не сталкивался с этим!)

opel431 23-05-2011 01:18 1680842

Можно так (Delphi 7).

Ставим BorderStyle -> bsSingle

private
procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;


procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
if ((Msg.CmdType and $FFF0) = SC_SIZE) then
begin
Msg.Result := 0;
Exit;
end;
inherited;
end;

Malfatto 23-05-2011 01:49 1680843

opel431, к сожалению, не помогло :(

opel431 23-05-2011 02:00 1680845

Цитата:

Цитата Malfatto
opel431, к сожалению, не помогло »

В Delphi 7 + XP все работает.

Тогда смотрите WM_NCHITTEST (HTBOTTOM, HTBOTTOMLEFT, HTBOTTOM, HTTOP, HTOPLEFT и HTTOPRIGHT).

Я, вообще сразу не посмотрел на скрин, и поэтому дал процедуру на запрет изменения формы.
Cделайте форму без Caption.

Malfatto 23-05-2011 02:08 1680847

opel431, простите, а что Ваш код вообще должен делать? Просто не силён я в этих "мессаджах"... Он должен, я так понимаю, запретить изменение размеров формы? Или он именно меняет стиль формы как в первом посте?

opel431 23-05-2011 02:17 1680850

Цитата:

Цитата Malfatto
он именно меняет стиль формы как в первом посте? »

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

Форма без Caption!

procedure CreateParams(var Params: TCreateParams); override;

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited Createparams(Params);
with Params do
Style := (Style or WS_POPUP) and not WS_DLGFRAME;
end;

Malfatto 23-05-2011 03:19 1680854

opel431, хм, также не помогло. остаётся лишь рамка шириной 1 пиксель, а не то, что в 1 посте.

opel431 23-05-2011 03:21 1680855

Цитата:

Цитата Malfatto
акже не помогло. остаётся лишь рамка шириной 1 пиксель, а не то, что в 1 посте. »

Для этого у формы и панелей есть свойство BorderWidth.

Ладно! Сейчас по быстрому пример набросаю и выложу.

Malfatto 23-05-2011 15:42 1681105

opel431, всё равно непохоже на то, что надо :)

opel431 23-05-2011 16:27 1681124

Цитата:

Цитата Malfatto
opel431, всё равно непохоже на то, что надо »

Спасибо, за потраченное на меня время!

Malfatto 23-05-2011 16:47 1681133

Цитата:

Цитата opel431
Спасибо, за потраченное на меня время! »

=D да, спасибо конечно. просто уже довольно долго пытаюсь решить проблему, забываю говорить всем "спасибо".

opel431 23-05-2011 17:32 1681163

Цитата:

Цитата Malfatto
забываю говорить всем "спасибо »

А спрашивать не забываете? ....элементарная норма поведения воспитанного человека. Кстати для этого существует кнопка. Ну да я не об этом.
В примере решены вопросы которые вы ставили (отсутствие Caption, отсутствие резинового контура, отсутствие возможности изменять размер и изменение вида курсора). Просто, у вас большое желание видеть скругленные края - воспользуйтесь API функцией CreateRoundRectRgn. Добавьте возможность перетаскивать форму за поле и т.д. И оформите интерфейс как вам нужно.

Malfatto 23-05-2011 18:55 1681203

opel431, наверное, это моя вина, что я недостаточно ясно высказал то, что мне нужно.

в скриншоте в 1 посте показано, как должна выглядеть форма. такого вида можно добиться только на Windows 7 и Vista, на XP в любом случае такого эффекта не получить. то, чего мне нужно было, я почти добился. а именно, с помощью кода из первого поста я получил форму вот такого вида:



также я запретил изменение размера окна (кстати, ваше решение с WM_SYSCOMMAND оказалось более рационално, использую сейчас его). единственное, что сбивает с толку, так это курсор, который меняется на "растягивающий" при наведение на края формы.

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

opel431 23-05-2011 19:03 1681210

Цитата:

Цитата Malfatto
собственно, в этом и состоял вопрос. как убрать изменение курсора »

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

opel431, я ведь уже говорил, что при если использовать
Код:

Params.Style:=(Params.Style or WS_POPUP) and not WS_DLGFRAME;
то при этом
Цитата:

Цитата Malfatto
остаётся лишь рамка шириной 1 пиксель, а не то, что в 1 посте. »


opel431 23-05-2011 19:35 1681229

Цитата:

Цитата Malfatto
то при этом »

На форму панель=Client + BorderWidth=4 + Bevellnner=bvLowered+BevelOuter=bvRaised.

Malfatto 23-05-2011 19:39 1681233

opel431, я ещё раз говорю, что это даёт совершенно не тот результат. зачем изобретать велосипед, да ещё и с квадратными колёсами?

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

opel431 23-05-2011 19:42 1681235

Цитата:

Цитата Malfatto
опять Вы, видимо, не поняли что мне нужно... »

Результат


Те же свойства (что в предыдущем посте) есть и у формы, стиль и размер!

Подробно: Форма+Панель
Свойства формы:
BorderWidth=4

Свойства панели (Без этого нет эффекта)
Align=alClient
Bevellnner=bvNone
BevelOuter=bvLowered

Т.е вариации "стиля" зависят от заданных свойств.

Malfatto 23-05-2011 19:55 1681249

opel431, всё равно результат не тот.

opel431 23-05-2011 20:02 1681256

Цитата:

Цитата Malfatto
всё равно результат не тот. »

Вы сначала посмотрите, что вы используете, а потом задавайтесь вопросом.
WS_THICKFRAME - Создание окна с толстой рамкой. Рамка используется для изменения размеров окна.

Malfatto 23-05-2011 20:06 1681260

opel431, собственно, только с помощью WS_THICKFRAME и получается сделать толстую рамку, как на скриншоте. потому я и создал эту тему, чтобы мне подсказали аналог, или вообще как можно сделать иначе.

p.s. вот здесь, например, показано решение на Visual C#. как провернуть подобное на делфи - в этом и вопрос.

opel431 23-05-2011 20:11 1681263

Цитата:

Цитата Malfatto
показано решение на Visual C# »

Посмотрел! Какой вопрос такой и ответ!
как сделать форму без заголовка с тонкой системной рамкой?

LilLoco 23-05-2011 20:19 1681269

Malfatto, В приведенном примере получается так же как и у Вас, рамка такая как и нужно, но ресайзить тоже можно :(

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

opel431 23-05-2011 20:21 1681274

Для общего понимания стиля формы!
Вот как стиль решается на 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 1681453

попросил у друга, у которого Visual C# есть создать программу с кодом отсюда, так и края эти появляются только если окно Sizeable... видимо, остаётся лишь один вариант - запретить смену курсора при наведении на рамки.

Malfatto 28-05-2011 21:13 1684257

В общем, решил действительно попробовать сделать через WM_NCHITTEST:

Код:

procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
  Msg.Result:=0;
end;

И всё отлично заработало :) при наведении на края курсор не меняется, менять размер формы нельзя. а с помощью CreateParams того вида, что в первом посте, я добился.

Спасибо большое всем за помощь, проблема решена.


Время: 03:10.

Время: 03:10.
© OSzone.net 2001-