Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2009, 13:35   #1
NieL
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 116
По умолчанию липкие окна

Реализовал возможность "липкие окна". Вот собственно код:
Код:
procedure TCustomForm_.WMWindowPosChanging(var Msg: TWMWindowPosChanging);

  procedure HandleEdge(var Edge: Integer; SnapToEdge: Integer;
    SnapDistance: Integer = 0);
  begin
    if Abs(Edge + SnapDistance - SnapToEdge) < StickBuffer then
      Edge := SnapToEdge - SnapDistance;
  end;

var
  i: Integer;
begin
  if not (csDesigning in ComponentState) and FStick
    and ((Msg.WindowPos^.x <> 0) or (Msg.WindowPos^.y <> 0)) and
    ((Msg.WindowPos^.cx = Width) and (Msg.WindowPos^.cy = Height)) then
    for i := 0 to Screen.FormCount - 1 do
      if Screen.Forms[i] <> Self then
        with Msg.WindowPos^, Screen.Forms[i].BoundsRect do
        begin
          if (y + cy >= Top - StickBuffer) and (y + cy <= Bottom + cy + StickBuffer) then
          begin
            HandleEdge(x, Left  , Width);
            HandleEdge(x, Right , 0);
          end;
          if (x + cx >= Left - StickBuffer) and (x + cx <= Right + cx + StickBuffer) then
          begin
            HandleEdge(y, Top   , Height);
            HandleEdge(y, Bottom, 0);
          end;
        end;
  inherited;
end;
Дайте советов по оптимизации. Можно ли как-нибудь ссылаться на существующие формы не через класс TScreen?
NieL вне форума Ответить с цитированием
Старый 02.02.2009, 13:46   #2
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Может так :
Код:
procedure TCustomForm_.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
var
  WorkArea: TRect;
  StickAt : Word;
begin
  StickAt := 10;
  SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);
  with WorkArea, Msg.WindowPos^ do
  begin
    // Сдвигаем границы для сравнения с левой и верхней сторонами
    Right:=Right-cx;
    Bottom:=Bottom-cy;
    if abs(Left - x) <= StickAt then x := Left;
    if abs(Right - x) <= StickAt then x := Right;
    if abs(Top - y) <= StickAt then y := Top;
    if abs(Bottom - y) <= StickAt then y := Bottom;
  end;
  inherited;
end;
И объявить ее в секции private :
Код:
procedure WMWindowPosChanging(var Msg:TWMWindowPosChanging);message WM_WINDOWPOSCHANGING;
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 02.02.2009, 13:50   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Помоему тут максимум что оптимить так это просто на WIN API писать...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.02.2009, 13:58   #4
NieL
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 116
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Помоему тут максимум что оптимить так это просто на WIN API писать...
Подскажите, если Вас не затруднит как сослаться на существующие формы (названия функций)
NieL вне форума Ответить с цитированием
Старый 02.02.2009, 14:07   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ну насчет форм не знаю, но вот окна можно получить через GetWindow или EnumWindows.
Получаем хендл, похендлу его координаты, и определяем к каким координатам ближе всего.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.02.2009, 14:18   #6
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Гм, а чем не устраивает ScreenSnap?
пыщь
JTG вне форума Ответить с цитированием
Старый 02.02.2009, 14:42   #7
NieL
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 116
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Гм, а чем не устраивает ScreenSnap?
ScreenSnap насколько мне известно реализует прилипание только к экранной области, а мне нужно наоборот к другим формам в приложении.
NieL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать липкие окошки??? lionman Общие вопросы Delphi 1 07.11.2008 20:53
Размер окна в зависимости от размера окна Reverent JavaScript, Ajax 1 02.02.2008 15:49
закрыть все дочерни окна, кроме главного окна Worms Общие вопросы Delphi 2 03.12.2007 22:18
Как сделать чтобы дочерние окна в MDI-приложениях были вне главного окна??? dimonchuk Общие вопросы Delphi 1 11.08.2007 12:13
окна KykQx Win Api 2 25.03.2007 21:48