Конференция "Компоненты" » Быстрое Корректное перемещение Окна
 
  • DevilDevil © (22.12.06 19:14) [0]
    пишу, честно говоря компонент наподобие окна. размеры этого окна можно изменять мышкой. Вот я и обнаружил, что если левую границу окна двигать влево, то справа появляется рябь.

    Вернёмся к реализации: если левая граница окна двигается влево, то свойство Left становится меньше, Width становится больше. Изменение свойств компонента - вещь медленная, т.к. при каждом изменении такого свойства вызывается метод SetBounds.

    Для быстрого изменения размеров, чего не делал:

    1) SetBounds(tmp_left,tmp_top,tmp_width,tmp_height);
    2) SetWindowPos(Handle, 0, tmp_left,tmp_top,tmp_width,tmp_height, 0);
    3) MoveWindow(Handle, tmp_left,tmp_top,tmp_width,tmp_height, true);
    4) SetWindowPlacement(Handle, @WindowPlacement);



    <-- результат один и тот же. Такое впечатление, что сначала у окна изменяется свойство Left, окно отрисовывается, потом изменяется Width, окно перерисовывается; поэтому и появляется рябь.

    Тем не менее вызвав
    MoveWindow(Handle, tmp_left,tmp_top,tmp_width,tmp_height, FALSE);

    я получил примерно то, что я хочу. Окно перерисовывается очень быстро и правильно. Огромный Минус состоит в следующем: при перемещении левой границы вправо, слева остаётся ореол от моего окна, причём не только на окне-родителе, но и на других окнах.

    Подскажите пожалуйста, что мне сделать? Может какими-нибудь InvalidateRect-ами .......
  • capkoh © (24.12.06 16:54) [1]

    >  Такое впечатление, что сначала у окна изменяется свойство
    > Left, окно отрисовывается, потом изменяется Width, окно
    > перерисовывается; поэтому и появляется рябь.

    Фишка неубиваемая. Я тоже столкнулся с этим и никак побороть не смог. Почему не перерисовываются осбободившееся место сказать сложно. Я, в результате, ограничил изменение размера только по правой и нижней границе (WM_NCHITTEST).
  • DimaBr (25.12.06 10:00) [2]
    Попробуйте на время изменения размеров залочить перерисовку.
  • DevilDevil © (25.12.06 13:34) [3]
    А не подскажите, как её залочить, BeginPaint-ом?
  • DimaBr (25.12.06 13:45) [4]
    Если у родителя реализован BeginUpdate то хорошо иначе пишем свой.
  • DevilDevil © (25.12.06 14:33) [5]
    Пока ничего лучше не смог сделать:

    MoveWindow(Handle, tmp_left,tmp_top,tmp_width,tmp_height, (tmp_width < Width) or (tmp_height < Height) );



    Вопрос остаётся открытым
  • Raydon (14.10.10 08:42) [6]
    Столкнулся с той же проблемой... потом сменил false на true и у меня все стало как надо:
    MoveWindow(Handle, tmp_left,tmp_top,tmp_width,tmp_height, TRUE);

  • имя (28.03.11 14:18) [7]
    Удалено модератором
 
Конференция "Компоненты" » Быстрое Корректное перемещение Окна
Есть новые Нет новых   [119110   +107][b:0][p:0.001]