![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изменение размера формы мышкой [D7, WinXP]
Дмитрий_05 © (2005-06-07 20:03:00)Как измененять размеры формы мышкой, когда у формы нет бордюра?
-=XP=- (2005-06-25 10:26:00) [21]Ищущий ответа (25.06.05 08:29) [32]
"у формы нет бордюра"?
Ищущий ответа (2005-06-25 08:29:00) [22]
procedure FormWithoutCaption(Form:TForm);
var
FSizeCaption: Integer;
begin
with Form do
begin
FSizeCaption := GetSystemMetrics(SM_CYCAPTION);
SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_Style) and not WS_Caption);
Height:=Height - FSizeCaption;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FormWithoutCaption(Form1);
end;
-=XP=- (2005-06-25 00:25:00) [23]еще один вопросик, а зачем мы обрабатываем сообщение WM_ERASEBKGND? Может в Form.Create это прорисовывать
Form.Create отрабатывает один раз - при создании формы. Что потом делать будете? Разберитесь с тем, как вообще происходит отрисовка окон.
А еще когда я делаю двойную буферизацию, окно почему-то становится все черное<...> А если не использовать двойную буферизацию(что я думаю не желательно), черного фона нету...
Осталось только выяснить, для чего в примере BMP?
Дмитрий_05 (2005-06-24 23:15:00) [24]Я использовал код, что привел -=XP=-. При таком коде, при двойной буферизации, окно становится черным... А когда начнешь изменять размеры формы черный фон исчезает и появляются те изображения которые мы прорисовываем... А если не использовать двойную буферизацию(что я думаю не желательно), черного фона нету...
Дмитрий_05 (2005-06-24 19:21:00) [25]А еще когда я делаю двойную буферизацию, окно почему-то становится все черное...
Дмитрий_05 (2005-06-23 22:39:00) [26]еще один вопросик, а зачем мы обрабатываем сообщение WM_ERASEBKGND? Может в Form.Create это прорисовывать?
-=XP=- (2005-06-23 10:26:00) [27]Хотите пользоваться в DesignTime Images - поместите их на форму, вставьте изображения, установите прочие опции (например, растяжение) и установите для них свойство Visible в FALSE.
type
TSomeForm = class(TForm)
private
procedure WMEraseBkGnd(var a_Msg: TMessage); message WM_ERASEBKGND;
end;
procedure TSomeForm.WMEraseBkGnd(var a_Msg: TMessage);
var
BMP: TBitmap;
begin
BMP := TBitmap.Create;
try
BMP.Width := Width;
BMP.Height := Height;
BMP.Canvas.Brush.Color := Color;
BMP.Canvas.FillRect(ClientRect);
BMP.Canvas.StretchDraw(Image1.BoundsRect, Image1.Picture.Graphic);
BMP.Canvas.StretchDraw(Image2.BoundsRect, Image2.Picture.Graphic);
{...}
Canvas.Draw(0, 0, BMP);
finally
FreeAndNil(BMP);
end;
a_Msg.Result := 1;
end;
Как-то так...
Дмитрий_05 (2005-06-23 02:18:00) [28]Или всетаки лучше будет какнибудь в OnPaint сделать?
Дмитрий_05 (2005-06-13 23:35:00) [29]У меня на форме рисуется несколько изображений... А еще при изменении размеров формы, некоторые из них расстягиваются(Stretcth:=true)... В OnPaint я думаю будет сложновато все это сделать...
-=XP=- (2005-06-10 13:42:00) [30]на форме Image
Не используйте Image. Рисуйте скин в Form.OnPaint().
Дмитрий_05 (2005-06-10 13:36:00) [31]Вы немного не поняли вопрос... Я имел ввиду вот как: При изменении размеров окна без заголовка сначала отрисовывается рамка будущих размеров. У меня скинообразная форма, т.е. на форме Image... Если обрабатывать MouseDown и MoseMove формы они работают на "невидимом" бодюре формы?
P.N.P. (2005-06-10 11:49:00) [32]>Дмитрий_05
См. -=XP=- © (07.06.05 20:19) [1]
А константы я подскажу :)
$F008 //Правый нижний угол
$F005 //Правый верхний угол
$F004 //Левый верхний угол
$F007 //Левый нижний угол
$F003 //Верхняя сторона
$F006 //Нижняя сторона
$F002 //Правая сторона
$F001 //Левая сторона
$F00B //Что-то совсем интересное :)
$F00C //Тоже оригинально :)
Дмитрий_05 (2005-06-10 11:21:00) [33]Может надо WM_GETMINMAXINFO какнибудь обрабатывать?
Дмитрий_05 (2005-06-09 22:27:00) [34]Может в обработчике WMNCHitTest нельзя никак сделать?
Дмитрий_05 (2005-06-09 21:16:00) [35]Что то у меня не очень получается это, что у меня не так? Пробую пока с левой стороной так сделать. Делаю так:
var
oldPos: TPoint;
WRect: TRect;
...
procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
var
P: TPoint;
R: TRect;
B: Integer;
dx, dy: integer;
begin
inherited;
with Message do
if Result = HTCLIENT then
Result := HTCAPTION
else begin
P := Point(XPos, YPos);
R := BoundsRect;
if PtInRect(R, P) then begin
B := BorderWidth;
InflateRect(R, -B, -B);
if not PtInRect(R, P) then begin
if P.X < R.Left then
begin
oldPos := Mouse.CursorPos;
GetWindowRect(Handle, WRect);
DrawFocusRect(GetDC(0), WRect);
dx := Mouse.CursorPos.X - oldPos.X;
dy := Mouse.CursorPos.Y - oldPos.Y;
if (WRect.Right - WRect.Left + dx > MinWidth) and (WRect.Right + dx < Screen.Width) then WRect.Right := WRect.Right + dx;
if (WRect.Bottom - WRect.Top + dy > MinHeight) and (WRect.Bottom + dy < Screen.Height) then WRect.Bottom := WRect.Bottom + dy;
oldPos := Mouse.CursorPos;
DrawFocusRect(GetDC(0), WRect);
BoundsRect := WRect;
Result := HTLEFT;
end
else if P.X > R.Right then
Result := HTRIGHT;
if P.Y < R.Top then
if Result = HTLEFT then
Result := HTTOPLEFT
else if Result = HTRIGHT then
Result := HTTOPRIGHT
else
Result := HTTOP
else if P.Y > R.Bottom then
if Result = HTLEFT then
Result := HTBOTTOMLEFT
else if Result = HTRIGHT then
Result := HTBOTTOMRIGHT
else
Result := HTBOTTOM;
end;
end;
end;
end;
Не рисуется...:-( Наверно HTLEFT все "съедает". Что делать?
-=XP=- (2005-06-09 15:05:00) [36]Я думаю, "надо самому ее отрисовывать". На десктопе.
DC := GetDC(HWND_DESKTOP);
Дмитрий_05 (2005-06-09 14:51:00) [37]есть ли какие-то стандартные средства или надо самому ее отрисовывать?
Дмитрий_05 (2005-06-09 14:51:00) [38]есть ли какие-то стандартные средства или надо самому ее отрисовывать?
REA (2005-06-09 14:30:00) [39]>P := Point(XPos, YPos);
>R := BoundsRect;
>if PtInRect(R, P) then begin
а P может быть не в Bounds, раз сообщение послано форме?
Дмитрий_05 (2005-06-09 14:23:00) [40]А можео сделать так: при изменении размера окна, сначала отрисовывать прямоугольник, какая будет форма, а потом уже изменить у самой формы размеры... например как в WinAmp это сделано...