powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
25 сообщений из 26, страница 1 из 2
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38368178
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создаю VB-шный CoolBar1 ну например с одним Band.
Ставлю
Align=vbAlignTop
BandBorders=True
Когда меняю размер формы, ширина CoolBar1 автоматически следует за шириной формы, ширина Band соответственно за шириной CoolBar.
Такое поведение мне нужно.

А теперь через API. Создаю Rebar со стилем:
Ну сейчас напр. так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
  Dim RebarStyle As Long
 
  RebarStyle = WS_CHILD Or WS_VISIBLE Or WS_CLIPSIBLINGS Or WS_CLIPCHILDREN Or _
   CCS_NODIVIDER Or _
     CCS_NOPARENTALIGN Or CCS_TOP Or WS_BORDER Or RBS_FIXEDORDER Or RBS_AUTOSIZE 'Or RBS_VARHEIGHT  Or 'Or RBS_AUTOSIZE

  g_hwndRebar = CreateWindowEx(WS_EX_TOOLWINDOW, _
   REBARCLASSNAME, _
   vbNullString, _
   RebarStyle, _
   0, _
   0, _
   rcClient.Right, _
   0, _
   hwndParent, _
   0&, _
   App.hInstance, _
   0&)
 'rcClient.Right



Чтобы я не делал, ребар не хочет автоматически подгоняться под ширину формы.
Куда копать?

Я всегда решал этот вопрос через Form_Resize + дополнительный код, устанавливающий ширину Rebar равной ширине формы.

Сейчас это крайне неудобно, т.к. форма не моя (окно htmlhelp), пытался его сабклассить на предмет WM_WINDOWPOSCHANGING, но это очень глючный путь и бороться с крашами мне надоело.

Должно быть какое-нибудь простое решение со стилями Rebar, не могу найти комбинацию.
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38368183
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BandBorders=True
мне как таковой не нужен (для наглядности чего происходит на XP).

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

Можно конечно сделать ребар заведомо очень широким, но это плохой вариант,
В зависимости от "темы", градиент может быть не только по вертикали, но и по горизонтали, а границами градиента являются в этом случае левая и правая граница ребар (т.е. градиент всегда вписывается в ширину ребар).
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38368311
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче не знаю.
Без сабклассинга и WM_SIZE не получается.
А сабклассиг:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Sub CommandSubClass_Click()
  Dim hwndHelp As Long
  hwndHelp = HTMLHelp(0, App.Path & "\" & "proga.chm", HH_DISPLAY_TOPIC, ByVal Combo1.Text)
  SetWindowLong hwndHelp, GWL_WNDPROC, OldHelpWindowProc 'снять если уже установлен
  OldHelpWindowProc = SetWindowLong( _
   hwndHelp, GWL_WNDPROC, _
   AddressOf NewHelpWindowProc)
End Sub


Public Function NewHelpWindowProc( _
 ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, lParam) As Long
  'даже если вообще пусто
  NewHelpWindowProc = CallWindowProc( _
   OldHelpWindowProc, hwnd, Msg, wParam, _
   lParam)
End Function



В exe сразу и всегда дает сбой в msvbvm60.dll, в среде тоже глючит и сбоит, хотя и не сразу.
Почему не знаю.
Нет идей?

Единственный вариант: тупо установить ширину ребар например равной
Код: vbnet
1.
Screen.Width / Screen.TwipsPerPixelX * 2


(дальше этой ширины форму не раздвинешь).

В принципе с любой темой кроме "Help" (градиент справа налево) проблем не будет, да и бог с ним, итак красиво.
Надоело.
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38368444
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Почему не знаю.Потому что можно сабклассить лишь окна своего процесса, а html help это hh.exe
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38368647
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДмитрий77 Почему не знаю.Потому что можно сабклассить лишь окна своего процесса, а html help это hh.exe
В данном конкретном случае я не уверен что ты полностью прав.
F1 и HTML Help API Function
запускается похоже как "свой" процесс, в терминологии не уверен.
По крайней мере в "среде" сообщения отлавливаются.
Крашит в exe при вызове WinProc.
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38368691
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше скажи, почему я не могу добиться стилями и т.п. поведения
Align=vbAlignTop
(без сабклассинга).

У меня честно возникло предположение что в случае CoolBar делается "внутренний" сабклассинг в контроле.

Но у меня напр. не получается другая подзадача.
Я попробовал добавить на панель Html Help свою кнопку через TB_ADDBUTTON (хочу вызвать свой диалог выбора стиля),

картинка здесь: 14716221

Кнопку добавить получилось.
Но я не могу отследить Click по этой кнопке - можно сделать только сабклассингом окна help (о чем сейчас говорим) и получается это только в "среде".
А документированная HHN_TRACK (кот. ловится сабклассингом вызвавшей help формы) генерируется только при нажатии родных кнопок.
В htmlhelp есть 2 custom кнопки Jump1 и Jump2,
они генерируют HHN_TRACK
но они
1) Заточены под навигацию на url-адрес, что мне не надо
2) Мне эта кнопка не нужна, если help запускается мышкой, а не из App.
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38368696
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, здесь я не прав. hh.exe используется для самостоятельного просмотра chm-файлов.

На самом деле проблема с последним параметром NewHelpWindowProc. Он variant и byref.
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38368759
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

если написать
Код: vbnet
1.
2.
Public Function NewHelpWindowProc( _
 ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Variant) As Long



то crash будет не только в exe но и в среде.
Еще есть идеи?
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38368767
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
As Long
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38368785
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Извини, немного попутал.
Смотри
ByRef lParam As Variant
ByVal lParam As Variant
ByRef lParam As Long

сразу глючат в exe и среде

ByVal lParam As Long

только в exe

(глючат - при отсутствии кода в ф-ции WinProc при первом же вызове)
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38368853
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример сделай, попробую погонять.
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38368894
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

OK. Сейчас уезжаю, завтра-послезавтра вернусь и сделаю.
Тебе самый простой сделать?
Потому как у меня скоро будет аккуратный комплексный пример на тему что вот здесь:
14716221
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38368906
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Простой имеется в виду вызов help, его hwnd + голый сабклассинг.
Если с ребар (на предмет установки его стилей) то это уже не "простой".
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38368930
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой хочешь.
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38370461
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77P.S. Простой имеется в виду вызов help, его hwnd + голый сабклассинг.
Пока сделал простой пример (приложен).
Для локализации проблемы сабклассинга.
Help вызывается двумя способами:
1) Кнопка Help
2) F1

Сабклассинг устанавливается ф-цией ApplyHelpStyle (она в этом примере урезанная)

Глючит в следующих случаях
1) В exe -сразу при вызове, при первом же сообщении в NewHelpWindowProc
2) В среде
a) если очень усердно ресайзить help форму например, непонятно от чего именно.
б) в ситуации когда закрываем Form1, а окно help открыто. Возможно связано с тем как снимать сабклассинг (не знаю как правильно). ApplyHelpStyle его всегда сначала "снимает", потом "ставит" - по крайней мере это работает в случае когда окно help закрыли, а потом вызвали снова (другое окно, другой hwnd).

Сейчас буду допиливать свой "большой" пример (с заменой ImageList-ов и вставкой тематического Rebar). Наверно выложу как причешу. Но без решения вопроса о сабклассинге он будет немного "недопиленный", потому как ряд вещей я без сабклассинга help аккуратно сделать не могу.
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38370805
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Public Function NewHelpWindowProc( _
 ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    
    If Msg <> 32 Then
        Debug.Print EvntName(Msg)
        Form1.Text1.Text = EvntName(Msg) & " " & wParam & " " & lParam & vbCrLf & Form1.Text1.Text
        Form1.Text1.SelStart = 1
    End If
    If Msg <> 49366 And Msg <> 78 And Msg <> 273 And Msg <> 70 Then
        NewHelpWindowProc = CallWindowProc(OldHelpWindowProc, hwnd, Msg, wParam, lParam)
    End If
End Function


Падения вызывают четыре сообщения: 49366, не знаю что это (из-за него падает при открытии справки), WM_NOTIFY (при наведении мыши на тулбар), WM_COMMAND (при клике по разделу в дереве или кнопке тулбара), WM_WINDOWPOSCHANGING (при появлении окна справки из-под другого перекрываюшего окна). Если их отфильтровать, то не падает, но перестает работать соответственно переход по клику в дереве (только по двойному клику или ссылке в тексте), кнопки в тулбаре, заголовок окна справки, то есть ни свернуть, ни закрыть, ни переместить. То есть нужно обрабатывать их самостоятельно. А еще есть падение при закрытии справки по alt+f4, которую решить не удалось. Если перехватить WM_SYSCOMMAND и фильтровать все следующие сообщения, то окно перестает закрываться по alt+f4.

Кстати, стиль к справке не применился.
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38370809
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyКстати, стиль к справке не применился.Наверное из-за того, что урезанная?
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38370822
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Я сделал более менее аккуратный тест-проект (см. вложение) который делает то что я хочу:
1) меняет картинки и стиль TreeView
2) меняет картинки в Toolbar
3) (предполагается Vista и выше) Вставляет штатный Toolbar в мой Rebar и применяет тематические стили, напр. Communications к ребар и тулбар
4) (предполагается Vista и выше) добавляет кнопку "Interface" в штатный Toolbar

Нерешенные вопросы следующие:
1) Ширина ребар не авто-следует за шириной Help-формы.
2) Глюки с высотой ребар. Если делаешь ширину Help-формы маленькой, то кнопки Toolbar выстраиваются в "несколько строк". Высота ребар должна также изменяться, иначе нижние кнопки будут закрыты ребаром. Если установить высоту банда в ребар заведомо большой
Код: vbnet
1.
2.
3.
  With rbBand
...
      .cyMinChild = 80


то вопрос вроде как решается, но возникают глюки.
Глюки видны если
2а) двигать разделитель
2б) открыть Help, нажать "скрыть", закрыть Help
Затем открыть Help по новой и нажать "Показать" ("Show").
Слишком высокий ребар может "вылазить наверх", и перекрывать верхнюю часть Treeview и верхнюю часть разделителя.

3) Не могу отследить Click по самопальной кнопке "Interface" в Toolbar. При помощи этой кнопки хочу как вариант выводить окно выбора стиля, а лучше ниспадающее меню с радио-галочками выбора стиля (Communications-Media и т.д.) - кстати как сделать такое меню пока не знаю.

Вопросы 1-3 точно решаются через сабклассинг окна Help, но сабклассинг то как должно не работает.
Вопрос 2 думаю тоже как-то можно решить через сабклассинг (ну напр. пытаться по WM_SIZE устанавливать высоту ребар равной высоте Toolbar или чуть больше). Хотя пока надеюсь что это можно добиться "стилями" и параметрами. Вопрос 2 кстати самый мерзкий из всех.

Лучше это все глядеть на вистах, хотя я пока отключил проверку в коде.
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38370841
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрети тулбару выстраивать кнопки в несколько строк, если это возможно. По-моему возможно.
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38370886
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Public Function NewHelpWindowProc( _
 ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    
'... 
    If Msg <> 49366 And Msg <> 78 And Msg <> 273 And Msg <> 70 Then
        NewHelpWindowProc = CallWindowProc(OldHelpWindowProc, hwnd, Msg, wParam, lParam)
    End If
End Function


Падения вызывают четыре сообщения: ...

Я так понимаю, ты ведешь речь о крашах "в среде".
Потому как со всеми "ограничениями" (а жить с ними нельзя) с твоим кодом в exe все равно сразу вылетает.

AntonariyAntonariyКстати, стиль к справке не применился.Наверное из-за того, что урезанная?
Ну да. Крайний пример смотрел?

AntonariyЗапрети тулбару выстраивать кнопки в несколько строк, если это возможно. По-моему возможно.
Да пытался уже (еще в пятницу):
Код: vbnet
1.
SetWindowLong hwndTb, GWL_STYLE, GetWindowLong(hwndTb, GWL_STYLE) And Not TBSTYLE_WRAPABLE


Плевать он на меня хотел.
И есть сомнения, что даже если это получится, окно хэлпа все равно будет смещать Treeview вниз.
Другой способ - ограничить минимальную ширину Help формы, но для этого опять нужен сабклассинг.
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38370902
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Да пытался уже (еще в пятницу):
Код: vbnet
1.
SetWindowLong hwndTb, GWL_STYLE, GetWindowLong(hwndTb, GWL_STYLE) And Not TBSTYLE_WRAPABLE


Плевать он на меня хотел.
А с другой стороны вот такой код:
Код: vbnet
1.
SetWindowLong hwndTb, GWL_STYLE, GetWindowLong(hwndTb, GWL_STYLE) And Not TBSTYLE_FLAT


выполняется на ура.
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38370958
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Я так понимаю, ты ведешь речь о крашах "в среде".
Потому как со всеми "ограничениями" (а жить с ними нельзя) с твоим кодом в exe все равно сразу вылетает.Нет, именно в exe. У меня вылетает лишь по alt+f4. Может ты первый If не убрал, который обращается к отсутствующим в оригинальном коде объектам?
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38370961
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя вижу, убрал.

Больше нет идей.
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38371050
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как хотя бы сделать так, чтоб мой ребар был расположен "позади остальных окон" (не перекрывал Treeview и разделитель)?
Потому что сделать Toolbar в одну строчку не получается.
...
Рейтинг: 0 / 0
Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
    #38371369
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий772) Глюки с высотой ребар. Если делаешь ширину Help-формы маленькой, то кнопки Toolbar выстраиваются в "несколько строк". Высота ребар должна также изменяться, иначе нижние кнопки будут закрыты ребаром. Если установить высоту банда в ребар заведомо большой
Код: vbnet
1.
2.
3.
  With rbBand
...
      .cyMinChild = 80


то вопрос вроде как решается, но возникают глюки.
Глюки видны если
2а) двигать разделитель
2б) открыть Help, нажать "скрыть", закрыть Help
Затем открыть Help по новой и нажать "Показать" ("Show").
Слишком высокий ребар может "вылазить наверх", и перекрывать верхнюю часть Treeview и верхнюю часть разделителя.
Ну, этот вопрос почти решил.
2a)После вставки тулбар в ребар надо обязательно сделать:
Код: vbnet
1.
SendMessage hwndHelp, WM_SIZE, 0, 0


Это устаканивает конструкцию, устраняет перекрытие ребаром верхней части Treview и уберегает высоту ребара от явно видимого прыганья. Единственное, если двигать разделитель, верхняя часть разделителя "подкрашивается" в тематику, но думаю можно забить - не так часто его двигают и при отпускании мыши все устаканивается.
2б) при нажатии на кнопку Show ("Показать") глюк устраняется, если пересоздать Сложность в том, что тулбару при этом надо временно переназначить Parent, чтоб не убился вместе с ребаром.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
          Case HHN_TRACK
            Debug.Print "HHN_TRACK"
            CopyMemory tHDN, ByVal lParam, Len(tHDN)
            If tHDN.iButton = 5 Then 'кнопка Show
              If sys_WinVista And ThemesEnabled(Form1.hwnd) Then Help_NeedReCreateRebar = True

Public Sub ReCreate_Rebar(hwndHelp As Long)
  Help_NeedReCreateRebar = False
  Dim hwndTb As Long
  hwndTb = FindWindowEx(g_hwndRebar, 0, "ToolbarWindow32", vbNullChar)
  SetParent hwndTb, hwndHelp
  DestroyWindow g_hwndRebar
  CreateTheReBar hwndHelp, hwndTb
  SendMessage hwndHelp, WM_SIZE, 0, 0
  Call RedrawWindow(hwndTb, ByVal 0&, ByVal 0&, RDW_INVALIDATE Or RDW_FRAME Or RDW_UPDATENOW)
End Sub



Вопрос 1 решается заведомо широким ребаром.
Вопрос 3 - от кастом-кнопки придется отказаться, а настройку спрятать в "общие настройки приложения" - увы, наглядно не выходит.

На XP и без темы ребар ясно дело вообще не к месту.

Короче забиваю и имплементирую. Итак нормально.
Конечный тест, позволяющий менять стили "на ходу" из Form1 прилагаю.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Чему в API соответствует vbAlignTop? Надо чтоб ширина ребар следовала за шириной формы.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]