Как делать попапы с форматированной контекстной справкой?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Как делать попапы с форматированной контекстной справкой?

Сообщение tyomitch » 10.07.2007 (Вт) 17:32

WinHelp-попапы могут быть форматированные, но не поддерживаются в Висте и выше.
HtmlHelp-попапы могут быть только плейнтекстовыми.
Что народ использует для создания форматированных попапов в новых прогах?
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 10.07.2007 (Вт) 18:24

Что мешает сделать свой попап?
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.07.2007 (Вт) 19:06

Неумение отрисовывать форматированный текст.
Зависть полупрозрачной тени под стандартным попапом.
Изображение

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 10.07.2007 (Вт) 19:25

свою тень отрисовать можно) и ричтекстбокс на форму)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.07.2007 (Вт) 19:36

Ричтекстбокс будет выделяться и давать контекстное меню. Дизаблить его что ли?
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 10.07.2007 (Вт) 19:41

tyomitch
Цеплять не ричтекстбокс, а WebBrowser, в котором все менюшки дисейблятся через IDocUIHandler. Заодно можно гиперссылки в попап поставить.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.07.2007 (Вт) 20:28

ВебБраузер, кошмар-то какой :shock:
И как это в WinHelp-попапах гиперссылки без него работали?
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.07.2007 (Вт) 21:06

А вот ещё пишут, что в Висте есть какая-то новая система XML-based справки под названием MAML. В ней можно попапы делать?
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.07.2007 (Вт) 22:55

Нашёл способ отображать RTF-попап при помощи 16-битного winhelp.exe, который в Висте остался. Он, правда, показывает текст на белом фоне вместо жёлтого, но перекрасить -- это пустяк :-)


Концептуальная схема:
Код: Выделить всё
Private Type HLP
   cbData As Integer
   usCommand As Integer
   ulTopic As Long
   ulReserved As Long
   offszHelpFile As Integer
   offabData As Integer
   szFilename As String * 256
End Type


Sub Main()
Shell "winhelp -x"
' WaitForInputIdle
Const Filename = "путь к файлу справки"
Dim h As HLP
h.cbData = 17 + Len(Filename)
h.usCommand = HELP_CONTEXTPOPUP
h.ulTopic = dwContextId
h.offszHelpFile = 16
h.szFilename = Filename & vbNullChar

SendMessage FindWindow("MS_WINHELP", vbNullString), &H38, 0, h 'недокументированное сообщение WM_WINHELP
End Sub
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.07.2007 (Ср) 0:09

tyomitch писал(а):Он, правда, показывает текст на белом фоне вместо жёлтого, но перекрасить -- это пустяк :-)

Блин, а как его перекрасить-то?
\cb не поддерживается, хотя в справочнике есть :-(
Настройки из [WINDOWS] в HPJ-файле к попапам не применяются.
Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 11.07.2007 (Ср) 9:05

Можно еще UserControl использовать и выводить текст на его форме.
Вложения
popUp.zip
(7.64 Кб) Скачиваний: 111

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

Сообщение Хакер » 11.07.2007 (Ср) 9:09

tyomitch
А что для этих целей применяется в хелпах к стандартным Вистовским прогам?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.07.2007 (Ср) 9:28

jangle писал(а):Можно еще UserControl использовать и выводить текст на его форме.

Он умеет рисовать форматированный текст? Не верю.


Хакер, в стандартных прогах WinXP и выше используется HTML-справка и неформатированные попапы. Но если вспомнишь, ещё в Win98 (и вроде даже Win2000) обычная справка был HTML-ной, а контекстная -- в отдельных HLP-файлах, как раз ради форматированных попапов.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.07.2007 (Чт) 1:06

Нашёл в одном из FAQ:
[3.1.10] Why can't I set the background color with the \cb help RTF statement?

Simple: It doesn't work. The \cb statement was never implemented by Microsoft. Ooops.


Ну и к слову, цвет фона для WinHelp-овских попапов берётся не из COLOR_INFOBK, а жёстко прошит как (255, 255, 238). Зла на них не хватает.
Изображение

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Сообщение NashRus » 12.07.2007 (Чт) 2:33

а не быстрее будет что то свое родить ?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.07.2007 (Пт) 13:59

NashRus, что конкретно предложишь?

Чего-то у меня с винхелпом проблема на проблеме. Оказалось, что WinHelp 3.1 не поддерживает явное указание чарсета для шрифта, а для MS Shell Dlg подставляется европейский чарсет. Придётся MS Sans Serif руками вписать.
Изображение

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 13.07.2007 (Пт) 15:44

tyomitch
РичТекстБокс. Локед=тру, Апиаренс=Флэт, Бордер=0.
тень - SetLayeredWindowAttributes

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

Сообщение Хакер » 13.07.2007 (Пт) 15:46

tyomitch
РичТекстБокс. Локед=тру, Апиаренс=Флэт, Бордер=0.


Тогда уж слать ричэдиту WM_PAINT-ы, подсовывая левый DC.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.07.2007 (Пт) 15:48

nekeda, там не такая тень, там она "в сеточку".


WM_PAINT не принимает параметрами DC.
Изображение

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 13.07.2007 (Пт) 15:48

..и если принципиально чтобы текст не выделялся:
Код: Выделить всё
Private Sub RichTextBox1_GotFocus()
Command1.SetFocus
End Sub


tyomitch
покажи, что за сеточка?

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

Сообщение Хакер » 13.07.2007 (Пт) 15:54

tyomitch
Принимает. MSDN в топку, кстати говоря.

nekeda
Пиксельная сетка, где пикселы размещены в шахматном порядке.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 13.07.2007 (Пт) 15:57

Почему не отрисовать эту сетку SetLayeredWindowAttributes, если нужна именно сетка? и собственно, используя прозрачность формы по альфа каналу тень можно сделать не псевдо-прозрачную (сеточка) - а действительно, плавно-полупрозрачную.

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

Сообщение Хакер » 13.07.2007 (Пт) 15:57

Чтобы не быть голословным:

1)
Правильный MSDN писал(а):WM_PAINT
An application sends the WM_PAINT message when the system or another application makes a request to paint a portion of an application's window. The message is sent when the UpdateWindow or RedrawWindow function is called, or by theDispatchMessage function when the application obtains a WM_PAINT message by using theGetMessage orPeekMessage function.

WM_PAINT
hdc = (HDC) wParam; // the device context to draw in



2)




Код: Выделить всё
VERSION 5.00
Begin VB.Form Form1
   Caption         =   "Form1"
   ClientHeight    =   975
   ClientLeft      =   60
   ClientTop       =   450
   ClientWidth     =   6555
   LinkTopic       =   "Form1"
   ScaleHeight     =   975
   ScaleWidth      =   6555
   StartUpPosition =   3  'Windows Default
   Begin VB.TextBox Text1
      Height          =   375
      Left            =   600
      TabIndex        =   1
      Text            =   "Text1"
      Top             =   240
      Width           =   2415
   End
   Begin VB.PictureBox Picture1
      Height          =   375
      Left            =   3960
      ScaleHeight     =   315
      ScaleWidth      =   1995
      TabIndex        =   0
      Top             =   240
      Width           =   2055
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_PAINT = &HF




Private Sub Text1_Change()
SendMessage Text1.hwnd, WM_PAINT, Picture1.hDC, 0&
End Sub
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.07.2007 (Сб) 0:21

Хакер писал(а):Чтобы не быть голословным:
Правильный MSDN писал(а):WM_PAINT
hdc = (HDC) wParam; // the device context to draw in


Откуда это хоть??

Для спрятанного текстбокса твой код не работает, только для видимого.
Изображение

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 14.07.2007 (Сб) 0:51

hdc = (HDC) wParam;

наверное это есть случайно из WM_PRINTCLIENT.


SetLayeredWindowAttributes

вопрос к nekeda: а как реализовать тень этой фху-ей?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.07.2007 (Сб) 1:24

Никак, но можно под настоящим окном создать серое полупрозрачное. Так реализована тень от меню, к слову.
Изображение

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 14.07.2007 (Сб) 3:20

Зачем второе окно?

Сама форма:
Изображение

Маска для формы:
Изображение

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

Сообщение Хакер » 14.07.2007 (Сб) 7:33

tyomitch писал(а):
Хакер писал(а):Чтобы не быть голословным:
Правильный MSDN писал(а):WM_PAINT
hdc = (HDC) wParam; // the device context to draw in


Откуда это хоть??


Из MSDN. Не из того, который писали долбо-либилы, придумавшие VB.NET и прочую дрянь. А из того, что шёл со студией.


tyomitch писал(а):Для спрятанного текстбокса твой код не работает, только для видимого.


Для спрятанного через Visible=False контрола это не будет работать, потому что он умный и проверят своё свойство, и если вдруг там 0 то при получении этого (и других) сообщения он ничего не делает.

А вот если спрятать листбокс за формой - всё прекрасно работает.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.07.2007 (Сб) 10:35

Видимо, есть секретный MSDN, доступный лишь избранным...

В нормальном MSDN (и в онлайновом, и в том, который шёл со студией) написано
WPARAM wParam, // not used
LPARAM lParam // not used
,
The WM_PAINT message is generated by the system and should not be sent by an application. To force a window to draw into a specific device context, use the WM_PRINT or WM_PRINTCLIENT message. Note that this requires the target window to support the WM_PRINTCLIENT message. Most common controls support the WM_PRINTCLIENT message.
и
For some common controls, the default WM_PAINT message processing checks the wParam parameter. If wParam is non-NULL, the control assumes that the value is an HDC and paints using that device context.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.07.2007 (Сб) 10:51

Хакер писал(а):А вот если спрятать листбокс за формой - всё прекрасно работает.

Предлагаешь мне прятать мой текстбокс за формой??

Мне нет абсолютно никакого смысла отрисовывать ещё куда-то картику с видимого текстбокса.
Изображение

След.

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

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Mail.ru [бот] и гости: 25

    TopList