Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Контроль позиции компонентов


Автор: Coder 29.6.2005, 01:18
Как сделать чтобы компоненты имели выравнивание alTop, alBottom, alLeft и т.д.?

Автор: Quadr0 29.6.2005, 09:33
...

Автор: Rrader 29.6.2005, 09:44
Цитата

Сделать его наследником TControl.

Человек хочет на WinAPI сделать, TControl - неуместен. Думаю, стоит обрабатывать сообщение изменения размеров окна родителя WM_WINDOWPOSCHANGING.

Автор: Rrader 29.6.2005, 09:54
Вот сырой код, позволяющий сделать у TMemo выравнивание alLeft относительно формы:
Код

...
Protected
  Procedure OnPosChanged(Var Msg: TMessage);Message WM_WINDOWPOSCHANGING;
    
...

Procedure TForm1.OnPosChanged(Var Msg: TMessage);
Begin
  Inherited;
  Memo1.Left := 0;
  Memo1.Top := 0;
  Memo1.Height := ClientHeight;
End;


На чистом API:
Код

Procedure TForm1.OnPosChanged(Var Msg: TMessage);
Var
  TempRect, MemoRect: TRect;
Begin
  Inherited;
  Windows.GetClientRect(GetParent(Memo1.Handle), TempRect);
  GetWindowRect(Memo1.Handle, MemoRect);
  SetWindowPos(Memo1.Handle, 0, 0, 0, MemoRect.Left, TempRect.Bottom, 0);
End;

Автор: Yanis 29.6.2005, 15:07
Какая может быть речь о TMemo, когда ты сам верно подметил, что надо всё сделать на чистом WinAPI. Хотя в качестве примера подойдёт smile

Автор: Rrader 29.6.2005, 15:55
Цитата

Какая может быть речь о TMemo, когда ты сам верно подметил, что надо всё сделать на чистом WinAPI

Ну сделай Memo на WinAPI и мой пример просто подогнать. smile

Автор: Coder 30.6.2005, 02:43
Rrader, подгоню без проблем! всем спасибо, попробую

Автор: Coder 30.6.2005, 04:07
вот этот код работает. не нужно было узнавать размеры клиентской области, а просто узнать размеры окна.
Код

WM_WINDOWPOSCHANGING:
  begin
    GetWindowRect(Memo1, MemoRec);
    GetWindowRect(Handle, WinRec);
    SetWindowPos(Memo1, 0, {x:}0, {y:}0, {width:} WinRec.Right, {h:} WinRec.Bottom, 0);
  end

Автор: Rrader 30.6.2005, 06:31
Цитата

вот этот код работает

Он разворачивает Memo за пределы формы. smile

Автор: Coder 30.6.2005, 11:33
Rrader, странно, но у меня работает.

Автор: Yanis 30.6.2005, 16:05
Цитата(Coder @ 30.6.2005, 04:07)
вот этот код работает. не нужно было узнавать размеры клиентской области, а просто узнать размеры окна.
Код

WM_WINDOWPOSCHANGING:
  begin
    GetWindowRect(Memo1, MemoRec);
    GetWindowRect(Handle, WinRec);
    SetWindowPos(Memo1, 0, {x:}0, {y:}0, {width:} WinRec.Right, {h:} WinRec.Bottom, 0);
  end

3 строчка не нужна и замени функцию GetWindowRect на GetClientRect.

Автор: Coder 3.7.2005, 04:18
короче я совсем запарился и запутался... ничего не получается.
Вот пишу код:
Код

    GetClientRect(Handle, WinPos);
    GetWindowRect(Memo1, Memo1Pos);
    GetWindowRect(Memo2, Memo2Pos);
  // alTop
    SetWindowPos(Memo1, 0, 0, 0, Memo1Pos.Right, Memo1Pos.Bottom, 0);
    // alClient
    SetWindowPos(Memo2, 0, Memo2Pos.Left, memo2pos.Top, WinPos.Right, WinPos.Bottom, 0);

вроде все должно работать, но memo1 сразу перекрывает все.... че за хрень?

Автор: Rrader 3.7.2005, 09:38
Для alClient:
Код

Procedure TForm1.OnPosChanged(Var Msg: TMessage);
Var
  TempRect: TRect;
Begin
  Inherited;
  Windows.GetClientRect(GetParent(Memo1.Handle), TempRect);  
  SetWindowPos(Memo1.Handle, 0, 0, 0, TempRect.Right, TempRect.Bottom, 0);
End;


Для alTop:
Код

Procedure TForm1.OnPosChanged(var Msg: TMessage);
Var
  TempRect, MemoRect: TRect;
Begin
  Inherited;
  Windows.GetClientRect(GetParent(Memo1.Handle), TempRect);
  GetWindowRect(Memo1.Handle, MemoRect);
  SetWindowPos(Memo1.Handle, 0, 0, 0, TempRect.Right, MemoRect.Bottom - MemoRect.Top, 0);
End;

smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)