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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2010, 11:36   #1
jj48
 
Регистрация: 25.09.2010
Сообщений: 7
По умолчанию Перемещение окна в z-order

Здравствуйте! Возникла задача следующего толка:
Есть окно X с хэндлом wnd_x (будем считать это переменной типа HWND). Есть окно Y с хэндлом wnd_y. В идеале нужно сделать так, чтобы окно X всегда было перед окном Y, но подойдёт и однократное помещение X перед Y. При этом, когда перед окном Y любое другое (произвольное) окно появляется, окно X не должно быть поверх данного (т.е. просто вытаскивать на передний план - не вариант, нужно вытаскивать именно перед Y).

Мне нужно понять (буду очень благодарен за наглядный пример, а если ещё и в синтаксисе делфи, то вообще буду прыгать от счастья), как это сделать один раз, а затем можно будет по таймеру уже выставлять нужную позицию для окна X.

P.S. простите, если задаю ламерский вопрос, или коряво его формулирую. Старался объяснить по-проще.

P.P.S. делать "ребёнком" окна Y через SetParent, тем самым получая похожую картину на выходе - не вариант. Не в этой задаче

Последний раз редактировалось jj48; 25.09.2010 в 11:45.
jj48 вне форума Ответить с цитированием
Старый 25.09.2010, 11:45   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

X.parent = Y.handle?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 25.09.2010, 11:54   #3
jj48
 
Регистрация: 25.09.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Alex Cones Посмотреть сообщение
X.parent = Y.handle?
К великому огорчению подобное здесь не вариант. И ещё X - окно моей программы, а Y - чужой. Но в общем виде интересует вариант, когда оба - "чужие".
jj48 вне форума Ответить с цитированием
Старый 25.09.2010, 12:04   #4
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

А вот это не пробовали? Или не работает?

Цитата:
The SetWindowPos function changes the size, position, and Z order of a child, pop-up, or top-level window. Child, pop-up, and top-level windows are ordered according to their appearance on the screen. The topmost window receives the highest rank and is the first window in the Z order.

BOOL SetWindowPos(

HWND hWnd, // handle of window
HWND hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
UINT uFlags // window-positioning flags
);
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 25.09.2010, 12:13   #5
jj48
 
Регистрация: 25.09.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Ulex Посмотреть сообщение
А вот это не пробовали? Или не работает?
Спасибо, низкий поклон! Благодаря Вам и другу, который также помогал мне, моё внимание наконец было акцентировано на:

HWND hWndInsertAfter, // дескриптор порядка размещения

Цитата:
Идентифицирует окно, которое предшествует установленному окну в Z-последовательности. Этот параметр должен быть дескриптор окна или одно из следующих значений:
Выделенного я не замечал (упорно, в течение месяца). И откровенно недоумевал, как мне может помочь набор из:

Цитата:
* HWND_BOTTOM - Размещает окно внизу Z - последовательности. Если параметр hWnd идентифицирует самое верхнее окно, окно теряет свое самое верхнее состояние и помещается внизу всех других окон.
* HWND_NOTOPMOST - Помещает окно выше всех не самых верхних окон (то есть позади всех самых верхних окон). Этот флажок не имеет никакого эффекта, если окно - уже не самое верхнее окно.
* HWND_TOP - Помещает окно наверху Z - последовательности.
* HWND_TOPMOST - Помещает окно выше всех не самых верхних окон. Окно поддерживает самую верхнюю позицию даже, когда оно дезактивировано.
Сейчас опробую
jj48 вне форума Ответить с цитированием
Старый 25.09.2010, 12:27   #6
jj48
 
Регистрация: 25.09.2010
Сообщений: 7
По умолчанию

Очень близко, однако помещает X за Y

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  wnd_x:HWND;
  wnd_y:HWND;
begin
  wnd_y:=FindWindow(nil,'Безымянный - Блокнот');
  wnd_x:=Application.MainForm.Handle;

  if(wnd_y=0) then
    exit;

  SetWindowPos(
               wnd_x,		// äåñêðèïòîð ðàçìåùåíèÿ îêíà
               wnd_y,	// äåñêðèïòîð ïîðÿäêà ðàçìåùåíèÿ
               0,			// ïîçèöèÿ ïî ãîðèçîíòàëè
               0,			// ïîçèöèÿ ïî âåðòèêàëè
               0,			// øèðèíà
               0,			// âûñîòà
               SWP_NOSIZE+SWP_NOMOVE 		// ôëàæêè ïîçèöèîíèðîâàíèÿ îêíà
              );

end;
Если менять местами wnd_x и wnd_y, то окно блокнота помещается перед моей программой, т.е. то же самое, но меняется положение блокнота, а в первом случае - моей программы %)

Последний раз редактировалось jj48; 25.09.2010 в 12:30.
jj48 вне форума Ответить с цитированием
Старый 25.09.2010, 13:09   #7
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Не понял, так у вас получилось что вы хотели, или нет?
Я вот, например сделал окошечко, которое всегда лезет поверх безымянного блокнота.
Первым идёт handle блокнота, затем handle моего окна.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 25.09.2010, 13:12   #8
jj48
 
Регистрация: 25.09.2010
Сообщений: 7
По умолчанию

У меня не получилось
А второй handle у Вас был вашей программы или какого-то стороннего окна?
jj48 вне форума Ответить с цитированием
Старый 25.09.2010, 13:22   #9
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Да без разницы.
Сейчас переписал чуть программу - теперь моё приложение прячет окно 'Безымянный - Блокнот' под окно 'Документ1 - Microsoft Word'.
Ну, кстати, это работает только если оба окна не свёрнуты.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru

Последний раз редактировалось Ulex; 25.09.2010 в 13:28.
Ulex вне форума Ответить с цитированием
Старый 25.09.2010, 13:32   #10
jj48
 
Регистрация: 25.09.2010
Сообщений: 7
По умолчанию

А код первого варианта не можете показать?
jj48 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ORDER BY динамический Pang SQL, базы данных 2 16.05.2010 23:51
ORDER BY Sidorow2001 Microsoft Office Access 1 17.02.2010 17:19
закрыть все дочерни окна, кроме главного окна Worms Общие вопросы Delphi 2 03.12.2007 22:18
Как сделать чтобы дочерние окна в MDI-приложениях были вне главного окна??? dimonchuk Общие вопросы Delphi 1 11.08.2007 12:13
Перемещение окна мышью за Image Viteef Общие вопросы Delphi 2 03.05.2007 23:48