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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2013, 18:00   #1
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
Сообщение примагничевание главного окна своего приложения к окнам чюжих приложений

подскажите, как оформить примагничевание главного окна своего приложения к окнам чюжих приложений?
beegl вне форума Ответить с цитированием
Старый 13.03.2013, 18:32   #2
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Можно использовать компоненты JEDI. Там точно было что-то подобное.
Kix.IV вне форума Ответить с цитированием
Старый 13.03.2013, 20:08   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну если без хука, то в таймере с помощью GetWindowRect отслеживать положение чужого окна и цеплять к нему свое окно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.03.2013, 21:03   #4
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
Лампочка

в архиве два компонента, они, только магнетят к краям роб. стола, но не к чужим окнам
Вложения
Тип файла: rar FormMagnetex.rar (27.6 Кб, 7 просмотров)
beegl вне форума Ответить с цитированием
Старый 14.03.2013, 07:36   #5
superedward
Форумчанин
 
Аватар для superedward
 
Регистрация: 27.11.2012
Сообщений: 190
По умолчанию

Цитата:
Сообщение от beegl Посмотреть сообщение
в архиве два компонента, они, только магнетят к краям роб. стола, но не к чужим окнам
Так, начиная с Delphi 7 у формы есть свойство ScreenSnap...
superedward вне форума Ответить с цитированием
Старый 15.03.2013, 11:09   #6
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
Лампочка модифицировать компонент ALScreenSnap

Цитата:
Так, начиная с Delphi 7 у формы есть свойство ScreenSnap...
не магнетит к чужим окнам, только к краям рабочего стола.
А в прикрепленном файле компонент ALScreenSnap, магнетит к краям раб. стола и в случае ухода окна за пределы рабочего стола, возвращает окно, Может кто модифицирует этот компонент, чтоб к чужим окнам магнитил.
см. вложенный фай:

Код:
unit ALScreenSnap;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ShellAPI;

type
  TALScreenSnap = class(TComponent)
  private
    OldWndProc, NewWndProc: Pointer;
    fActive: Boolean;
    fThreshold: Integer;
    procedure NewWndMethod(var Msg: TMessage);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Active: Boolean    read fActive    write fActive    default True;
    property Threshold: Integer read fThreshold write fThreshold default 30;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Standard', [TALScreenSnap]);
end;

{ TALScreenSnap }

constructor TALScreenSnap.Create(AOwner: TComponent);
var
  i: Integer;
begin
  // Only allow one instance per form
  for i := 0 to AOwner.ComponentCount-1 do
    if AOwner.Components[i] is TALScreenSnap then
      raise Exception.Create('TALScreenSnap component cannot be duplicated in ' + AOwner.Name);

  inherited;

  // Check if the owner is a form
  if (Owner = nil) or not(AOwner is TForm) then
    raise Exception.Create('Owner of TALScreenSnap component must be a form');

  // Form subclassing
  if not(csDesigning in ComponentState) then
  begin
    NewWndProc := MakeObjectInstance(NewWndMethod);
    OldWndProc := Pointer(SetWindowLong(TForm(Owner).Handle, gwl_WndProc, Longint(NewWndProc)));
  end
  else
  begin
    NewWndProc := nil;
    OldWndProc := nil;
  end;

  fActive := True;
  fThreshold := 30;
end;

destructor TALScreenSnap.Destroy;
begin
  if Assigned(NewWndProc) then
    FreeObjectInstance(NewWndProc);

  inherited;
end;

procedure TALScreenSnap.NewWndMethod(var Msg: TMessage);
var
  Pabd: APPBARDATA;
  ScreenWidth, ScreenHeight: Integer;
  ScreenRect, TaskBarRect: TRect;
begin
  if (Msg.Msg = WM_EXITSIZEMOVE) and Active then
  begin
    Pabd.cbSize := SizeOf(APPBARDATA);
    SHAppBarMessage(ABM_GETTASKBARPOS, Pabd);

    ScreenWidth := GetSystemMetrics(SM_CXSCREEN);
    ScreenHeight := GetSystemMetrics(SM_CYSCREEN);
    ScreenRect := Rect(0, 0, ScreenWidth, ScreenHeight);
    TaskBarRect := Pabd.rc;

    if (TaskBarRect.Left = -2) and (TaskBarRect.Bottom = ScreenHeight+2) and (TaskBarRect.Right = ScreenWidth+2) then
      // Bottom
      ScreenRect.Bottom := TaskBarRect.Top
    else if (TaskBarRect.Top = -2) and (TaskBarRect.Left = -2) and (TaskBarRect.Right = ScreenWidth+2) then
      // Top
      ScreenRect.Top := TaskBarRect.Bottom
    else if (TaskBarRect.Left = -2) and (TaskBarRect.Top = -2) and (TaskBarRect.Bottom = ScreenHeight+2) then
      // Left
      ScreenRect.Left := TaskBarRect.Right
    else if (TaskBarRect.Right = ScreenWidth+2) and (TaskBarRect.Top = -2) and (TaskBarRect.Bottom = ScreenHeight+2) then
      // Right
      ScreenRect.Right := TaskBarRect.Left;

    // Position form
    if TForm(Owner).Left < ScreenRect.Left + fThreshold then
      TForm(Owner).Left := ScreenRect.Left;
    if TForm(Owner).Top < ScreenRect.Top + fThreshold then
      TForm(Owner).Top := ScreenRect.Top;
    if TForm(Owner).Left+TForm(Owner).Width > ScreenRect.Right-fThreshold then
      TForm(Owner).Left := ScreenRect.Right-TForm(Owner).Width;
    if TForm(Owner).Top+TForm(Owner).Height > ScreenRect.Bottom-fThreshold then
      TForm(Owner).Top := ScreenRect.Bottom-TForm(Owner).Height;
  end;

  Msg.Result := CallWindowProc(OldWndProc, TForm(Owner).Handle, Msg.Msg, Msg.WParam, Msg.LParam);
end;
end.
Вложения
Тип файла: rar ALScreenSnap.rar (2.9 Кб, 6 просмотров)
beegl вне форума Ответить с цитированием
Старый 15.03.2013, 12:42   #7
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Цитата:
Может кто модифицирует этот компонент, чтоб к чужим окнам магнитил.
Тогда уж создавать новый. Если тут ты просто сравнивал положения окна и границы экрана, то там необходимо сравнивать с каждым видимым окном.
Kix.IV вне форума Ответить с цитированием
Старый 15.03.2013, 13:35   #8
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию

Kix.IV, тогда как это делается? если Вам не трудно и есть свободное время переделайте
beegl вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создание своего главного меню maksim_serg Microsoft Office Excel 14 24.12.2010 17:17
Фокусировать окна из своего приложения MyLastHit Общие вопросы Delphi 3 16.12.2010 03:02
Как получить handle главного окна, зная имя приложения? Altera Win Api 8 22.12.2008 18:52
закрыть все дочерни окна, кроме главного окна Worms Общие вопросы Delphi 2 03.12.2007 22:18
Как сделать чтобы дочерние окна в MDI-приложениях были вне главного окна??? dimonchuk Общие вопросы Delphi 1 11.08.2007 12:13