![]() |
|
|
![]()
|
|
| Forgottn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 27.2.2007 Репутация: нет Всего: нет |
Решения рассматриваются для любой Win32 среды...
Хочется реализовать окно, которое будет размещаться на рабочем столе находясь сверху, но при этом не перекрывая ни одно другое - так реализован мелкомягкий таскбар - он вытесняет все окна, попадающие в ту область где он лежит... Вопроса соответственно два: 1. Возможно ли реализовать такое окно пользуясь, например, стандартными API константами типа WS_..., или например установкой каких-нибудь SystemMetrics, а может Screen так умеет? Если да, то как? 2. Если ответ на первый вопрос - нет, то как рациональнее сделать такую вещь программно? |
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
поробуй так:
на форме Label и SpeedButton -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Forgottn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 27.2.2007 Репутация: нет Всего: нет |
TOPMOST задан для формы изначально... фишка в том, что окна, попадающие под форму остаются лежать под ней, т.о. часть окон перекрывается, чего бы очень хотелось избежать
|
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Может я чего не понял, но как оно будет выглядеть??? Мне кажется тут в вопросе два противоречия, т.е. окно либо сверху, либо другое окно сверху. Если судить абстрактно, то я могу на стол положить лист бумаги, а потом могу положить еще лист бумаги либо сверху, либо на первый лист. Попробуй объяснить условия задачи в другой форме, доступной для понимания. -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Forgottn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 27.2.2007 Репутация: нет Всего: нет |
условие... в абстракции... я кладу на край(align: left!) стола маленький листик бумаги и громко требую у всех уже присутствующих и вновь пришедших граждан, чтобы они не складывали на мой лист ничего... вообще ничего... и под него тоже ничего не прятали. Так поступает виндовый таскбар aka панель задач
|
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Теперь уже понятнее стало.
Самый первый вариант, который приходит на ум, это ограничение размеров экрана для пользователя (см. поиск, у себя ничего по этой теме не нашел). А если подходить к этой задаче более детально, то если окно будет посередине или с краю, но по размерам меньше чем вышина экрана, то здесь придется вмешиваться в системные процессы (здесь мне сложно что-то посоветовать). Как вариант последнего, я могу предложить: 1. перебираем все окна, которые есть на экране. 2. считываем их координаты и размеры 3. вычисляем, попадает ли окно в область твоего окна (программы) 4. если попадает, то перемещаем нужное окно из недостатков данного метода, придется постоянно отслеживать окна системы, что считаю не самым удачным вариантом. -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Forgottn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 27.2.2007 Репутация: нет Всего: нет |
Высота окна - на весь доступный экран.
Самая большая байда этого метода (я до него и сам дошел), делать это нужно постоянно и HWND_BROADCAST не подходит, т.е. придется перебирать все окна... Может подскажет WM_ сообщение, которое приходит, когда мое окно перекрывается другим? |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 3 Всего: 91 |
Ну я бы не сказал, что обычный таскбар справляется со своей задачей в полной мере.
Посмотреть например на инсталлеры, их окна перекрывают панель задач. Наверно на пересечение окон должно происходить событие ON_PAINT или т.п. Правда если ресайзить чужие окна это скорее всего будет тут же видно. Maximize окон такого эффекта не производит и окно соблюдает границы. |
|||
|
||||
| ama_kid |
|
||||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 10 Всего: 95 |
Имхо, эта задача решается методом установки глобального хука с помощью функции SetWindowHookEx конкретно на callback-функции (CBTProc function) с отловом:
1) параметра HCBT_CREATEWND для вновь создаваемых окон. Цитирую МСДН:
Если русскими словами - то при отлове данного сообщения ПЕРЕД СОЗДАНИЕМ окна можно вычислить его положение/координаты/размеры (лежат в CBT_CREATEWND structure параметра lParam) и при необходимости изменить их с учетом положения собственного окна... 2) параметра HCBT_MOVESIZE для перемещаемых/ресайзовых окон. Цитирую МСДН:
Алгоритм аналогичный - при изменении размеров окна / перемещении - просматриваются его финальные координаты и редактируются с учетом текущего положения собственного окна. -------------------- самурай без меча подобен самураю с мечом, но только без меча |
||||
|
|||||
| aldari |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 5.3.2007 Репутация: нет Всего: нет |
Может попробовать проще
|
|||
|
||||
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 3 Всего: 91 |
В этом случае оно перекрывает даже TaskBar. Правда не ведет себя как он, перекрывает чужие окна, не ресайзит. |
||||
|
|||||
| HappyLife |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 642 Регистрация: 17.5.2006 Репутация: 4 Всего: 8 |
Прошу. Может быть то что Вам нужно.
Добавлено @ 13:06
Инсталяторы, так же как и игры, работают просто в полноэкраном режиме. |
||||
|
|||||
| aldari |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 5.3.2007 Репутация: нет Всего: нет |
Прикольно! Даже когда закрываешь тестовое приложение эффект API функции действует на заготовку Builder.
МАМА!!!!! Она действует на все приложения. В примере надо изменить 100 на большее значение. Свое приложение получиться двигать только через Form1->Left=... |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |