![]() |
Проблема с видом формы
В общем, нужно сделать форму вот такого вида:
Перепробовал разные варианты, похожий результат даёт лишь это: BorderStyle = bsNone; Код:
procedure TForm1.CreateParams(var Params: TCreateParams); |
Цитата:
Не особо понятно почему у Вас появляются стрелочки изменения размера. |
LilLoco, Вы код посмотрите...
|
А почему бы просто не сделать через то свойство?
|
LilLoco, там на выбор только bsNone, bsSingle, bsSizeable, bsSizeToolWin и bsToolWindow. того что мне надо, понятное дело, нету.
|
Все, я понял ,что Вам нужно! Сразу не дошло :(
Ну так WS_THICKFRAME добавляет возможность изменять размеры формы. |
LilLoco, так ведь с помощью него и делается эта рамка. вот я и спрашиваю, может есть другие способы? :)
|
А если как-нибудь задать максимальный и минимальный размер формы. Это никак не изменит ситуацию?
|
LilLoco, да, я уже так и решал эту проблему. однако, при наведении на края появляются стрелочки, что выглядит очень некрасиво :)
скриншот в первом посте - из стандартной программы Windows 7, и как раз в ней нельзя менять размер окна. |
Цитата:
По-любому как то можно, нужно просто наверное поиграть с флагами отображения! Блин, тоже заинтересовал этот вопрос, никогда до этого не сталкивался с этим!) |
Можно так (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; |
opel431, к сожалению, не помогло :(
|
Цитата:
Тогда смотрите WM_NCHITTEST (HTBOTTOM, HTBOTTOMLEFT, HTBOTTOM, HTTOP, HTOPLEFT и HTTOPRIGHT). Я, вообще сразу не посмотрел на скрин, и поэтому дал процедуру на запрет изменения формы. Cделайте форму без Caption. |
opel431, простите, а что Ваш код вообще должен делать? Просто не силён я в этих "мессаджах"... Он должен, я так понимаю, запретить изменение размеров формы? Или он именно меняет стиль формы как в первом посте?
|
Цитата:
Форма без 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; |
opel431, хм, также не помогло. остаётся лишь рамка шириной 1 пиксель, а не то, что в 1 посте.
|
Цитата:
Ладно! Сейчас по быстрому пример набросаю и выложу. |
opel431, всё равно непохоже на то, что надо :)
|
Цитата:
|
Цитата:
|
Цитата:
В примере решены вопросы которые вы ставили (отсутствие Caption, отсутствие резинового контура, отсутствие возможности изменять размер и изменение вида курсора). Просто, у вас большое желание видеть скругленные края - воспользуйтесь API функцией CreateRoundRectRgn. Добавьте возможность перетаскивать форму за поле и т.д. И оформите интерфейс как вам нужно. |
opel431, наверное, это моя вина, что я недостаточно ясно высказал то, что мне нужно.
в скриншоте в 1 посте показано, как должна выглядеть форма. такого вида можно добиться только на Windows 7 и Vista, на XP в любом случае такого эффекта не получить. то, чего мне нужно было, я почти добился. а именно, с помощью кода из первого поста я получил форму вот такого вида: ![]() также я запретил изменение размера окна (кстати, ваше решение с WM_SYSCOMMAND оказалось более рационално, использую сейчас его). единственное, что сбивает с толку, так это курсор, который меняется на "растягивающий" при наведение на края формы. собственно, в этом и состоял вопрос. как убрать изменение курсора, ну или найти другой способ изменить стиль формы, чтобы она была как на скриншоте из первого поста. |
Цитата:
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; Дерзайте! |
opel431, я ведь уже говорил, что при если использовать
Код:
Params.Style:=(Params.Style or WS_POPUP) and not WS_DLGFRAME; Цитата:
|
Цитата:
|
opel431, я ещё раз говорю, что это даёт совершенно не тот результат. зачем изобретать велосипед, да ещё и с квадратными колёсами?
p.s. опять Вы, видимо, не поняли что мне нужно... и я уже просто не знаю, как я могу разъяснить то, что мне нужно, ещё более грамотно :( |
Цитата:
![]() Те же свойства (что в предыдущем посте) есть и у формы, стиль и размер! Подробно: Форма+Панель Свойства формы: BorderWidth=4 Свойства панели (Без этого нет эффекта) Align=alClient Bevellnner=bvNone BevelOuter=bvLowered Т.е вариации "стиля" зависят от заданных свойств. |
opel431, всё равно результат не тот.
|
Цитата:
WS_THICKFRAME - Создание окна с толстой рамкой. Рамка используется для изменения размеров окна. |
opel431, собственно, только с помощью WS_THICKFRAME и получается сделать толстую рамку, как на скриншоте. потому я и создал эту тему, чтобы мне подсказали аналог, или вообще как можно сделать иначе.
p.s. вот здесь, например, показано решение на 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; |
попросил у друга, у которого Visual C# есть создать программу с кодом отсюда, так и края эти появляются только если окно Sizeable... видимо, остаётся лишь один вариант - запретить смену курсора при наведении на рамки.
|
В общем, решил действительно попробовать сделать через WM_NCHITTEST:
Код:
procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest); Спасибо большое всем за помощь, проблема решена. |
Время: 03:10. |
Время: 03:10.
© OSzone.net 2001-