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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2012, 14:36   #1
bro
Пользователь
 
Аватар для bro
 
Регистрация: 02.12.2010
Сообщений: 29
По умолчанию Проблемы с WS_EX_NOACTIVATE

Здравствуйте.

У меня следующая проблема. Есть окно с флагом WS_EX_NOACTIVATE (не становится активным от нажатий). Нужно сделать так, чтобы при перетаскивании мышкой было видно всю траекторию перетаскивания, а не только конечный результат.

Решение проблемы на c++ есть тут:

http://forum.vingrad.ru/forum/s/fc84...1749903/0.html

и тут:

http://www.codeproject.com/KB/system...framework.aspx

На дельфи я перевёл так:
Код:
procedure TSmallWnd.WMNCLButtonDown(var Msg : TWMNCLButtonDown);
begin
  inherited;
  // store current foreground window
  PreviousWnd := GetForegroundWindow;
  // temporarily make this dialog an activatable window
  SetWindowLong(SmallWnd.Handle, GWL_EXSTYLE, GetWindowLong(SmallWnd.Handle, GWL_EXSTYLE)
         or not(WS_EX_NOACTIVATE));
  // make this dialog foreground
  SetForegroundWindow(SmallWnd.Handle);
end;

procedure TSmallWnd.WMMove(var Msg: TWMMove);
begin
  inherited;
  // make the previous foreground window active
  SetForegroundWindow(PreviousWnd);
  // make this dialog non-activating
  SetWindowLong(SmallWnd.Handle, GWL_EXSTYLE, GetWindowLong(SmallWnd.Handle, GWL_EXSTYLE)
         or (WS_EX_NOACTIVATE));
  // set it to NULL to mark that we do not need to do this again
  PreviousWnd := 0;
end;
Только почему-то это не избавило от проблемы. Что я сделал неверно?

P.S.: поторопился. Их пример некорректно работает - фокус не возвращает.

Последний раз редактировалось bro; 18.01.2012 в 14:59.
bro вне форума Ответить с цитированием
Старый 18.01.2012, 17:39   #2
bro
Пользователь
 
Аватар для bro
 
Регистрация: 02.12.2010
Сообщений: 29
По умолчанию

Решил свою проблему. Пользуйтесь, няши.

Код:
  private
    procedure CreateParams(var Params: TCreateParams); override;
    procedure WMMoving(var Msg: TMessage); message WM_MOVING;
    procedure WMSizing(var Msg: TMessage); message WM_SIZING;
  protected
    //
  public
    //
  end;

var
  SmallWnd: TSmallWnd;

implementation

{$R *.dfm}

procedure TSmallWnd.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle + WS_EX_NOACTIVATE;
end;

procedure TSmallWnd.WMMoving(var Msg: TMessage);
var
  Rect: ^TRect;
begin
  Rect := Pointer(Msg.LParam);
  SetWindowPos(SmallWnd.Handle, HWND_TOPMOST, Rect^.left, Rect^.top,
    Rect^.right - Rect^.left, Rect^.bottom - Rect^.top, 0);
end;

procedure TSmallWnd.WMSizing(var Msg: TMessage);
var
  Rect: ^TRect;
begin
  Rect := Pointer(Msg.LParam);
  SetWindowPos(SmallWnd.Handle, HWND_TOPMOST, Rect^.left, Rect^.top,
    Rect^.right - Rect^.left, Rect^.bottom - Rect^.top, 0);
end;
bro вне форума Ответить с цитированием
Старый 23.10.2018, 20:04   #3
YoraG
Пользователь
 
Регистрация: 06.11.2008
Сообщений: 10
По умолчанию

Undeclared identifier: 'TSmallWnd' - откуда? откуда ноги растут?
YoraG вне форума Ответить с цитированием
Старый 23.10.2018, 20:33   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Класс формы же видно по коду.
p51x вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблемы с IE Tradua HTML и CSS 1 05.08.2011 06:54
Проблемы с БД Verwolf C/C++ Базы данных 2 22.05.2011 09:52
Проблемы с С# PDV199003 Помощь студентам 0 04.06.2010 14:38
проблемы с if Vergil Общие вопросы C/C++ 8 21.04.2010 21:43
проблемы с IE xakzona Помощь студентам 1 16.12.2008 21:53