Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неперекрываемое окно 
:(
    Опции темы
Forgottn
  Дата 27.2.2007, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.2.2007

Репутация: нет
Всего: нет



Решения рассматриваются для любой Win32 среды...

Хочется реализовать окно, которое будет размещаться на рабочем столе находясь сверху, но при этом не перекрывая ни одно другое - так реализован мелкомягкий таскбар - он вытесняет все окна, попадающие в ту область где он лежит...
Вопроса соответственно два:
1. Возможно ли реализовать такое окно пользуясь, например, стандартными API константами типа WS_..., или например установкой каких-нибудь SystemMetrics, а может Screen так умеет? Если да, то как?
2. Если ответ на первый вопрос - нет, то как рациональнее сделать такую вещь программно?

PM MAIL   Вверх
Bima
Дата 27.2.2007, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



поробуй так:
Код

void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
if (SpeedButton1->Down)
   {
   Label1->Caption="Окно сверху";
   SetWindowPos(Form1->Handle, HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
   }
else
   {
   Label1->Caption="Обычное окно";
   SetWindowPos(Form1->Handle, HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
   }
}

на форме Label и SpeedButton


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Forgottn
Дата 27.2.2007, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.2.2007

Репутация: нет
Всего: нет



TOPMOST задан для формы изначально... фишка в том, что окна, попадающие под форму остаются лежать под ней, т.о. часть окон перекрывается, чего бы очень хотелось избежать
PM MAIL   Вверх
Bima
Дата 28.2.2007, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Цитата

Хочется реализовать окно, которое будет размещаться на рабочем столе находясь сверху, но при этом не перекрывая ни одно другое

Может я чего не понял, но как оно будет выглядеть???
Мне кажется тут в вопросе два противоречия, т.е. окно либо сверху, либо другое окно сверху. Если судить абстрактно, то я могу на стол положить лист бумаги, а потом могу положить еще лист бумаги либо сверху, либо на первый лист.
Попробуй объяснить условия задачи в другой форме, доступной для понимания.


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Forgottn
Дата 1.3.2007, 03:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.2.2007

Репутация: нет
Всего: нет



условие... в абстракции... я кладу на край(align: left!) стола маленький листик бумаги и громко требую у всех уже присутствующих и вновь пришедших граждан, чтобы они не складывали на мой лист ничего... вообще ничего... и под него тоже ничего не прятали. Так поступает виндовый таскбар aka панель задач
PM MAIL   Вверх
Bima
Дата 1.3.2007, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Теперь уже понятнее стало.
Самый первый вариант, который приходит на ум, это ограничение размеров экрана для пользователя (см. поиск, у себя ничего по этой теме не нашел). А если подходить к этой задаче более детально, то если окно будет посередине или с краю, но по размерам меньше чем вышина экрана, то здесь придется вмешиваться в системные процессы (здесь мне сложно что-то посоветовать).
Как вариант последнего, я могу предложить:
1. перебираем все окна, которые есть на экране.
2. считываем их координаты и размеры
3. вычисляем, попадает ли окно в область твоего окна (программы)
4. если попадает, то перемещаем нужное окно

из недостатков данного метода, придется постоянно отслеживать окна системы, что считаю не самым удачным вариантом.


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Forgottn
Дата 5.3.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.2.2007

Репутация: нет
Всего: нет



Высота окна - на весь доступный экран.
Самая большая байда этого метода (я до него и сам дошел), делать это нужно постоянно и HWND_BROADCAST не подходит, т.е. придется перебирать все окна...
Может подскажет WM_ сообщение, которое приходит, когда мое окно перекрывается другим?

PM MAIL   Вверх
SABROG
Дата 5.3.2007, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 3
Всего: 91



Ну я бы не сказал, что обычный таскбар справляется со своей задачей в полной мере.
Посмотреть например на инсталлеры, их окна перекрывают панель задач.
Наверно на пересечение окон должно происходить событие ON_PAINT или т.п.
Правда если ресайзить чужие окна это скорее всего будет тут же видно.
Maximize окон такого эффекта не производит и окно соблюдает границы.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
ama_kid
Дата 6.3.2007, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 10
Всего: 95



Имхо, эта задача решается методом установки глобального хука с помощью функции SetWindowHookEx конкретно на callback-функции (CBTProc function) с отловом: 
1) параметра HCBT_CREATEWND для вновь создаваемых окон. Цитирую МСДН: 
Цитата
HCBT_CREATEWND    
wParam: Specifies the handle to the new window.    
lParam: Specifies a long pointer to a CBT_CREATEWND structure containing initialization parameters for the window. The parameters include the coordinates and dimensions of the window. By changing these parameters, a CBTProc hook procedure can set the initial size and position of the window.

Если русскими словами - то при отлове данного сообщения ПЕРЕД СОЗДАНИЕМ окна можно вычислить его положение/координаты/размеры (лежат в CBT_CREATEWND structure параметра lParam) и при необходимости изменить их с учетом положения собственного окна...

2) параметра HCBT_MOVESIZE для перемещаемых/ресайзовых окон. Цитирую МСДН:

Цитата
HCBT_MOVESIZE
wParam: Specifies the handle to the window to be moved or sized.
lParam: Specifies a long pointer to a RECT structure containing the coordinates of the window. By changing the values in the structure, a CBTProc hook procedure can set the final coordinates of the window.

Алгоритм аналогичный - при изменении размеров окна / перемещении - просматриваются его финальные координаты и редактируются с учетом текущего положения собственного окна.


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
aldari
Дата 6.3.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



Может попробовать проще 
Код

Form1->FormStyle=fsStayOnTop;

PM MAIL   Вверх
SABROG
Дата 6.3.2007, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 3
Всего: 91



Цитата(aldari @ 6.3.2007,  12:53)
Может попробовать проще 
Код

Form1->FormStyle=fsStayOnTop;

В этом случае оно перекрывает даже TaskBar. Правда не ведет себя как он, перекрывает чужие окна, не ресайзит.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
HappyLife
Дата 9.3.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



Прошу. Может быть то что Вам нужно.
Код

TRect R(0,0,100,100);
SystemParametersInfo(SPI_SETWORKAREA,0,&R,0)


Добавлено @ 13:06 
Цитата(SABROG @ 5.3.2007,  15:39)
Ну я бы не сказал, что обычный таскбар справляется со своей задачей в полной мере.
Посмотреть например на инсталлеры, их окна перекрывают панель задач.
Наверно на пересечение окон должно происходить событие ON_PAINT или т.п.
Правда если ресайзить чужие окна это скорее всего будет тут же видно.
Maximize окон такого эффекта не производит и окно соблюдает границы.

Инсталяторы, так же как и игры, работают просто в полноэкраном режиме.
PM MAIL   Вверх
aldari
Дата 9.3.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



Прикольно! Даже когда закрываешь тестовое приложение эффект API функции действует  на заготовку Builder.
МАМА!!!!! Она действует на все приложения.
В примере надо изменить 100 на большее значение. Свое приложение получиться двигать только через Form1->Left=...

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0737 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.