Окно типа панели задач

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Окно типа панели задач

Сообщение Source » 23.12.2007 (Вс) 22:34

Как создать такое окно? Т.е. надо, чтобы окно висело вверху или внизу экрана и другие приложения не перекрывали его. Также надо, чтобы ярлыки десктопа не попадали под это окно.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 23.12.2007 (Вс) 23:48

Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 24.12.2007 (Пн) 8:06

почему окно не позиционируется вверху экрана?
Вложения
AppBar.zip
(1.37 Кб) Скачиваний: 45

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Сообщение Saturn.65 » 24.12.2007 (Пн) 11:01

Source писал(а):почему окно не позиционируется вверху экрана?
Вложения
Poverh_vseh.rar
Poverh_vseh
(49.82 Кб) Скачиваний: 66
Главное, ребята, сердцем не стареть...

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 24.12.2007 (Пн) 11:38

мне поверх всех не надо, мне надо позиционировать его :evil:

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Сообщение Saturn.65 » 24.12.2007 (Пн) 11:44

Source писал(а):мне поверх всех не надо, мне надо позиционировать его :evil:

В VB справа в низу есть монитор и на нем форма. Мышкой ее передвинь в нужный участок позиционирования не мониторе.
Главное, ребята, сердцем не стареть...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.12.2007 (Пн) 11:51

Глупый совет.
Тут надо Move делать в Form_Load.
Lasciate ogni speranza, voi ch'entrate.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 24.12.2007 (Пн) 13:14

ну Move то Move, но должно же SetWindowPos перемещать! Да и Move после SetWindowPos не срабатывает! А до срабатывает! :shock: К тому же выше Top=0 не поднимает(Me.Move 0, -Me.Height )!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.12.2007 (Пн) 13:36

Во-первых, позицию формы установи в Custom, а не Auto или Center.
Во-вторых, если ты ее перемещаешь через API, наверное будет лучше делать это в Form_Activate, а не Form_Load.
Lasciate ogni speranza, voi ch'entrate.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 24.12.2007 (Пн) 14:07

вроде разобрался - после посылки ABM_SETPOS AppBar позиционируется в фоновом режиме, поэтому позиционирование окна не происходит верно сразу после Ret = SHAppBarMessage(ABM_SETPOS, AppDat). Странно, что после ABM_NEW необходимо посылать ABM_SETPOS, иначе AppBar не будет иметь размеров (как будто ABM_NEW не может сразу установить размеры, ведь при ABM_NEW передаётся та же структура APPBARDATA)!

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 24.12.2007 (Пн) 14:39

не могу только понять, как использовать ABM_QUERYPOS для проверки позиции

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 24.12.2007 (Пн) 16:12

Послал, проверил члены структуры после вызова функции.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 24.12.2007 (Пн) 23:53

они не изменяются после вызова. Т.е., если установить им произвольные значения, они так и останутся после вызова. Поэтому я подумал, что SETPOS выполняется в фоновом режиме (также SetWindowPos не срабатывает как надо сразу после SETPOS в Form_Load), сделал ABM_QUERYPOS в цикле с ожиданием - ан нет! Странно, что после Form_Load ещё происходят какие-то действия с окном, т.к. SetWindowPos срабатывает верно только в Form_Activate (как сказал alibek) или Command1_Click. Так что же это за ABM_QUERYPOS?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 25.12.2007 (Вт) 0:38

Что значит в фоновом режиме?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 25.12.2007 (Вт) 1:19

ну функция возвращает управление, не ожидая установки координат.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 25.12.2007 (Вт) 1:20

Как шлёшь? SendMessage или PostMessage ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 25.12.2007 (Вт) 2:02

Ret = SHAppBarMessage(ABM_SETPOS, AppDat)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.12.2007 (Вт) 10:01

Source писал(а):Странно, что после Form_Load ещё происходят какие-то действия с окном

У тебя выставлено StartupPosition, вот и происходят.
Lasciate ogni speranza, voi ch'entrate.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 25.12.2007 (Вт) 12:16

StartupPosition=3
Так как всё-таки используется ABM_QUERYPOS?

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 26.12.2007 (Ср) 3:05

после Ret = SHAppBarMessage(ABM_SETPOS, AppDat) никак не получается сразу переместить окно с помощью SetWindowPos, т.е. у меня в окне настроек ставлю переключатель 'Фиксировать окно вверху экрана' и в обработчике Click хочу его сразу переместить - оно мелькает вверху экрана и исчезает, в результате остаётся на прежнем месте:
Код: Выделить всё
Private Sub optUpWA_Click()
    AppDat.RC.Top = 0
    AppDat.uEdge = ABE_TOP
    SetAppBar
    Ret = SetWindowPos(frmMain.hwnd, 0, 0, 0, frmMain.Width / TPPX, frmMain.Height / TPPY, SWP_NOACTIVATE)
End Sub

Public Sub SetAppBar()
Dim Ret As Long
     AppDat.RC.Left = 0
     AppDat.RC.Right = Screen.Width / TPPX
     AppDat.RC.Bottom = frmMain.Height / TPPY
     AppDat.hwnd = frmMain.hwnd
     AppDat.cbSize = Len(AppDat)
     Ret = SHAppBarMessage(ABM_NEW, AppDat)
     Ret = SHAppBarMessage(ABM_SETPOS, AppDat) 'устанавливает новую позицию(размеры) AppBar
End Sub

и создание этого AppBar иногда тормозит, значит, надо использовать ABM_QUERYPOS для проверки, есть ли уже наш AppBar(а потом позиционировать окно), но как?

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 26.12.2007 (Ср) 10:10

alibek писал(а):Во-вторых, если ты ее перемещаешь через API, наверное будет лучше делать это в Form_Activate, а не Form_Load.

Вообщем, alibek, твоя теория не оправдалась. В разработчике сиё работает. Но, если запустить exe, который выполняется намного быстрее, позиционирование окна будет неверным. Выход нашёлся такой - после Ret = SHAppBarMessage(ABM_SETPOS, AppDat) ставится DoEvents и всё прекрасно работает. Но возникает вопрос, чего же не хватало, что нам дало DoEvents?

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 30.01.2008 (Ср) 12:50

ещё 1 проблема - после полноэкранных приложений (меняющих разрешение экрана) панель становится меньше, а при возврате в прежний режим система не восстанавливает размер панели. Почему?
Буря мглою небо кроет, вихри снежные крутя, то как зверь с VB завоешь, то заплачешь, как дитя...

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 30.01.2008 (Ср) 12:50

ещё 1 проблема - после полноэкранных приложений (меняющих разрешение экрана) панель становится меньше - при возврате в прежний режим система не восстанавливает размер панели. Почему?
Буря мглою небо кроет, вихри снежные крутя, то как зверь с VB завоешь, то заплачешь, как дитя...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 56

    TopList