Изменение размеров формы

Тема в разделе "Delphi - Компоненты", создана пользователем GRLEX, 5 дек 2007.

Статус темы:
Закрыта.
  1. GRLEX

    GRLEX Гость

    Привет всем. Поделитесь мыслями по поводу одной вещи:
    В проекте есть главная форма и несколько дочерних.
    необходимо реализовать следующее:
    когда пользователь тащит за край формы, тоесть изменяет ее размер
    (либо по горизонтали, либо по вертикали) то размер формы пропорционально изменяется в пропорции 4х3
    Спасибо за предложения.
     
  2. Silver Wind

    Silver Wind Гость

    Собственно вот самый очевидный вариант:

    Код (Text):
    procedure TForm1.FormResize(Sender: TObject);
    begin
    Height:=(Width*3 div 4);
    end;
     
  3. GRLEX

    GRLEX Гость

    да я так пробовал, работает, но опять же возникает проблема, целый день пытаюсь ее решить.
    Суть проблемы:
    Когда тянешь форму, то размер пропорционально изменяется, но происходит смигивание.
    тоесть прорисовывается край формы со старым Height, пока не отпустишь кнопку мыши.
    Создается впечатление, что гдето всетаки запоминается старое значение height.
    когдато на с++ я делал подобное, и использовал для устранения этого функцию, но в упор не помню какую((((
    Есть соображения?

    Пробовал перехватывать оконную процедуру, но эффект тот же...
    Код (Text):
    procedure TForm1.WndProc(var Message: TMessage);
    begin
    if Message.Msg = WM_SIZE then
    begin
    Height := (Width *3)div 4;
    end;
    inherited;
    end;
     
  4. Silver Wind

    Silver Wind Гость

    WM_SIZE - возникает уже тогда, когда изменение размера завершено, попробуй перехватывать WM_SIZING - возникает при изменении размеров.

    Вот что по этому поводу есть в справке:
    Код (Text):
    The WM_SIZING message is sent to a window that the user is resizing. By processing this message, an application can monitor the size and position of the drag rectangle and, if needed, change its size or position.

    fwSide = wParam;         // edge of window being sized
    lprc = (LPRECT) lParam; // screen coordinates of drag rectangle


    Parameters

    fwSide

    Value of wParam. Indicates which edge of the window is being sized. This parameter can be a combination of the following values:

    Value   Meaning
    WMSZ_BOTTOM Bottom edge
    WMSZ_BOTTOMLEFT Bottom-left corner
    WMSZ_BOTTOMRIGHT    Bottom-right corner
    WMSZ_LEFT   Left edge
    WMSZ_RIGHT  Right edge
    WMSZ_TOP    Top edge
    WMSZ_TOPLEFT    Top-left corner
    WMSZ_TOPRIGHT   Top-right corner


    lprc

    Address of a RECT structure with the screen coordinates of the drag rectangle. To change the size or position of the drag rectangle, an application must change the members of this structure.

    Return Values

    An application should return TRUE if it processes this message.

    See Also
    Ну и изменяй пропорции в перехваченом обработчике не через Height и Width, а через lParam.
     
  5. GRLEX

    GRLEX Гость

    Спасибо большое, все получилось :)

    /MODERATOR/ Без спасибов: +1 в репу Silver Wind'y и хватить
     
  6. GRLEX

    GRLEX Гость

    Новая проблема. Со статической формой все идеально, проблема возникла при динамическом создании формы.
    Есть свой класс, в котором хранится форма.
    в конструкторе класса я создаю много чего и в том числе форму
    Код (Text):
    constructor TVideoWindow.Create(Parent : TAdvPanel; NProcessor, NCamera : integer; NameForm : string; WinProf : TProfile);
    ..........................
    Begin
    inherited create;
    //------- Create childForm -----
    FForm := TCusForm.CreateNew(nil);
    FForm.Parent := Parent;
    FForm.OnClose := FormClose;
    .................................
    TCusForm - это класс, унаследованный от TForm. Он для того чтоб подменить процедуру обработки окна
    Код (Text):
     TCusForm = class(TForm)
    procedure WndProc(var Message: TMessage);
    Public
    VideoFormat : integer;
    end;
    Ну и соответственно сама WinProc
    Код (Text):
    procedure TCusForm.WndProc(var Message: TMessage);
    begin
    if (( Message.Msg = WM_SIZING )and( VideoFormat = 1 ))then
    begin
    ..........................................
    end;
    inherited;
    end;
    Проблема в том, что эта процедура не вызывается((

    2: moderator - не работает чето + в репу Silver Wind'у
    404 и фсе.
     
  7. Silver Wind

    Silver Wind Гость

    Попробуй так:
    Код (Text):
    TCusForm = class(TForm)
    ...
    procedure WndProc(var Message: TMessage); override;
    ...
     
  8. GRLEX

    GRLEX Гость

    Уже нашол!
    Семен Семеныч :huh: :)
    override забыл.

    а + те не могу ткнуть((
     
  9. Ruster

    Ruster Member

    Регистрация:
    7 фев 2009
    Сообщения:
    7
    Симпатии:
    0
    А как сделать чтобы прога на полный экран причём пуска не было видно?
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей