Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Изменение размера формы мышкой [D7, WinXP]


Страницы:   1 2 3

Дмитрий_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 это сделано...


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо