Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Заблокирован
1

Запретить окну отображаться на панели

11.04.2014, 19:09. Показов 2123. Ответов 33
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сейчас делаю абгрейд своих ранее созданных компонентов
подробнее здесь
остановился вот на чем ...

когда вызываеться мой ToolTipText от правой кнопки мыши
то на пенели задач предательски отображаеться надпись Text1

как запретить отображаться на панели и при этом контролу Text1
оставаться самым верхним окном ? (тоесть не принадлежать никому)

вот часть кода из UserControl ...
может кто что подскажет ?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub Is_Help(Obj As Object, Button As Integer)
    Const c1 = 9
    Dim p As POINTAPI, Message$
    Dim h As POINTAPI
    Text1.Visible = False
    If Button = 2 Then
        GetCursorPos p
        h.x = WindowFromPoint(p.x, p.y)
        p.x = p.x * Tw.x: p.y = p.y * Tw.y
        RaiseEvent Help(Obj.Name, Message, p.x, p.y)
        If Len(Message) Then
            SetParent Text1.hwnd, 0: Label1.Caption = Message
            Text1.Move p.x, p.y + Tw.y * Tw.y, Label1.Width + Tw.x * c1, Label1.Height + Tw.y * c1
            Text1 = Message:  Text1.Visible = True
            Do
                DoEvents: Sleep 200
                GetCursorPos p
                h.y = WindowFromPoint(p.x, p.y)
            Loop While h.y = h.x Or h.y = Text1.hwnd
            Text1.Visible = False
        End If
    End If
End Sub
Добавлено через 7 минут
Tw.x это твип если что ...

Добавлено через 1 минуту
h.x это хендл кнопки или указывающего
h.y это хендл изменившегося окна
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2014, 19:09
Ответы с готовыми решениями:

Запретить отображение формы на панели задач
Подскажите пжл как сделать так, чтобы в панели задач оторбражалась только одна форма. У меня когда...

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

Как запретить окну ручное перемещение двух сторон?
Есть четыре окна со стилем: WS_BORDER | WS_SIZEBOX | WS_CHILDWINDOW | WS_CLIPSIBLINGS |...

Как запретить форме отображаться в диалоге переключения между окнами
Доброго времени суток. Как запретить форме отображаться в диалоге переключения между окнами...

33
6804 / 2831 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
11.04.2014, 19:13 2
Лучший ответ Сообщение было отмечено Антихакер32 как решение

Решение

Цитата Сообщение от FelixMacintosh Посмотреть сообщение
как запретить отображаться на панели
Пробуй так
Visual Basic
1
2
3
4
5
6
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Const GWL_EXSTYLE = (-20)
Const WS_EX_TOOLWINDOW = 128
Private Sub Form_Load()
SetWindowLong Me.hWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW
End Sub
1
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
11.04.2014, 19:52 3
Для тултипа есть соответствующее окно, которое уже изначально не отображается и ведет себя так как положено тултипу (пропускает клики, прячется и т.п.).
0
Заблокирован
11.04.2014, 20:05  [ТС] 4
большое спасибо, все работает как надо

правда пришлось найти эти константы GWL_...
у себя в мененжере API и изменить

эту Const GWL_EXSTYLE = (-20)
на эту Const GWL_USERDATA = (-21)

иначе бы рамка у текстового контрола не отображалась

вот как я прикрутил ...

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
'Event Declarations:
Event BeforeOpening(Cancel As Boolean)
Event ClickButton2() 'MappingInfo=Command2,Command2,-1,Click
Event ClickCheck(Value As Integer) 'MappingInfo=Check1,Check1,-1,Click
Event SelectPath() 'MappingInfo=Combo1,Combo1,-1,Click
Event Help(hlpObjName$, Message$, ScreenX As Long, ScreenY As Long)
 
'---------------------------------------[WinApi]
Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function WindowFromPoint Lib "user32.dll" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
 
Private Sub Is_Help(Obj As Object, Button As Integer)
    Const c1 = 9
    Dim p As POINTAPI, Message$
    Dim h As POINTAPI
    
    Text1.Visible = False
    If Button = 2 Then
        GetCursorPos p
        h.x = WindowFromPoint(p.x, p.y)
        p.x = p.x * Tw.x: p.y = p.y * Tw.y
        RaiseEvent Help(Obj.Name, Message, p.x, p.y)
        If Len(Message) Then
            SetParent Text1.hwnd, 0: Label1.Caption = Message
            Text1.Move p.x, p.y + Tw.y * Tw.y, Label1.Width + Tw.x * c1, Label1.Height + Tw.y * c1
            Text1 = Message:  Text1.Visible = True
            Do
                DoEvents: Sleep 200
                GetCursorPos p
                h.y = WindowFromPoint(p.x, p.y)
            Loop While h.y = h.x Or h.y = Text1.hwnd
            Text1.Visible = False
        End If
    End If
End Sub
 
Private Sub UserControl_Initialize()
    Const GWL_USERDATA = (-21)
    Const WS_EX_TOOLWINDOW = 128
    Set m_Dic = CreateObject("Scripting.Dictionary")
    m_Dic.CompareMode = 1
    Picture1.BorderStyle = 0
    Tw.x = Screen.TwipsPerPixelX
    Tw.y = Screen.TwipsPerPixelY
    SetWindowLong Text1.hwnd, GWL_USERDATA, WS_EX_TOOLWINDOW
End Sub
Добавлено через 6 минут
Цитата Сообщение от The trick Посмотреть сообщение
Для тултипа есть соответствующее окно, которое уже изначально не отображается и ведет себя так как положено тултипу (пропускает клики, прячется и т.п.).

А у меня !
  • Вызывается от ПКМ(правой кнопки мыши)
  • поднимает событие для пользователя, где он может использовать по своему усмотрению
  • а так-же можно скоорденировать вызываемый текст (левее - правее и тд)
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
11.04.2014, 20:08 5
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
А у меня !Вызывается от ПКМ(правой кнопки мыши) поднимает событие для пользователя, где он может использовать по своему усмотрению а так-же можно скоорденировать вызываемый текст (левее - правее и тд)
Это вообще не то о чем я тебе говорю, и все это также делается со стандартным тултипом
0
Заблокирован
11.04.2014, 20:24  [ТС] 6
Забыл сказать еще и МНОГОСТРОЧНОСТЬ !

Добавлено через 8 минут
Кстате ты помоему чтото такое уже делал ? не так ли ? ...

Добавлено через 2 минуты
хочеш сказать стандартный тултип использовал ?
скинь ссыль как ты это сделал ?
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
11.04.2014, 20:28 7
Ты вообще неправильно сделал .
Стиль у окон меняется так:
Visual Basic
1
SetWindowLong Text1.hwnd, GWL_EXSTYLE, GetWindowLong(Text1.hwnd, GWL_EXSTYLE) Or WS_EX_TOOLWINDOW
Тогда никакие рамки не будут исчезать и все будет нормально. Стиль - это набор флагов.
SetParent должен быть парный вызов, иначе окно не уничтожится.
Проверять в цикле координаты - это вообще блэк-кодинг, так вообще нельзя делать, особенно добавляя всякие Sleep'ы и другую фигню.
Вот пример правильного тултипа (tooltips_class32), который будет поддерживать стили и отображаться также как и другие.
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
Кстате ты помоему чтото такое уже делал ? не так ли ?
У меня в блоге есть
1
Заблокирован
11.04.2014, 20:43  [ТС] 8
Спасибо сейчас попробую
сначало исправить с учетом этой рекомендации:
Цитата Сообщение от The trick Посмотреть сообщение
SetWindowLong Text1.hwnd, GWL_EXSTYLE, GetWindowLong(Text1.hwnd, GWL_EXSTYLE) Or WS_EX_TOOLWINDOW
и почему блэк-кодинг что неправильно ? всё-же работает и минимум кода
в котором я разобрался как и что должно работать ...

Добавлено через 4 минуты
Цитата Сообщение от The trick Посмотреть сообщение
SetParent должен быть парный вызов,
а это что означает ..что значит парный ?

Добавлено через 3 минуты
В твоей ссылке меня единственное что прикололо
это подсказки в виде воздушных шариков ))
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
11.04.2014, 21:02 9
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
и почему блэк-кодинг что неправильно ?
Для этого в системе существуют специальные сообщения, которые намного эффективнее. WindowFromPoint - вызывается в цикле, перечисляются все окна и проверяются координаты. В итоге ненужные затраты временных ресурсов. Никакие сообщения в этот момент не обрабатываются, все стоит. Никакие события не будут обрабатываться, будь то таймеры, клики и т.п. В Windows есть MAPI нужно использовать его, все другие способ неверны и ошибочны.
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
а это что означает ..что значит парный ?
Значит нужно делать что-то типа SetParent Text.hwnd, Usercontrol.hwnd
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
В твоей ссылке меня единственное что прикололо
это подсказки в виде воздушных шариков ))
Это плохо, что только это.
0
6804 / 2831 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
11.04.2014, 21:02 10
Эх, были времена, когда вот какие ToolTip на VB6 писали!

Запретить окну отображаться на панели


Это действительно круто. А теперь, на новых системах, такого уже не сделаешь.
0
Заблокирован
11.04.2014, 21:03  [ТС] 11
Вобщем сейчас действительно все нормально заработало ...
Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub UserControl_Initialize()
    Const GWL_EXSTYLE = (-20)
    Const WS_EX_TOOLWINDOW = 128
    Set m_Dic = CreateObject("Scripting.Dictionary")
    m_Dic.CompareMode = 1
    Picture1.BorderStyle = 0
    Tw.x = Screen.TwipsPerPixelX
    Tw.y = Screen.TwipsPerPixelY
    SetWindowLong Text1.hwnd, GWL_EXSTYLE, GetWindowLong(Text1.hwnd, GWL_EXSTYLE) Or WS_EX_TOOLWINDOW
End Sub
а твой пример из блога я так и не нашол
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
11.04.2014, 21:04 12
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А теперь, на новых системах, такого уже не сделаешь.
Почему? Можно сделать такое.
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
а твой пример из блога я так и не нашол
https://www.cyberforum.ru/blog... g1850.html
0
Заблокирован
11.04.2014, 21:14  [ТС] 13
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Эх, были времена,
ну ты же у себя сейчас это как-то сделал ?

Добавлено через 9 минут
Цитата Сообщение от The trick Посмотреть сообщение
https://www.cyberforum.ru/blogs/354370/blog1850.html
ну вот.. километровый код только ради того чтоб всё работало правильно ..
наверняка это работает в отдельном модуле ..

а хотелось бы чтоб код был в 10 строчек и находился в модуле UserControl
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
11.04.2014, 21:16 14
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
ну вот.. километровый код только ради того чтоб всё работало правильно ..
наверняка это работает в отдельном модуле ..
Этот код вообще не имеет отношения к твоей задаче. Я тебе дал ссылку, там никаких километровых кодов нет. Тот код предназначался для изменения стандартного тултипа.
0
Заблокирован
11.04.2014, 21:24  [ТС] 15
Да я благодарен тебе, и не собираюсь спорить

просто на одну чашу весов ставится маленький тултип который я реализовал в 10 строк
а на другую твой вариант что это должен быть измененный тултип вот и все ...
0
6804 / 2831 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
11.04.2014, 21:24 16
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
ну ты же у себя сейчас это как-то сделал ?
У меня XP. Да и я только запустил готовую прогу, которую писал мой дядька давно уже.
В более современных версиях MS отказалась от идеи использовать MS Agent, а такие диалоги с меню, картинками, текстовым вводом, любыми кнопками и вообще любым внешним видом, цветом и т.п. можно делать было на их основе очень просто.
Сейчас наверно тоже можно смастерить, но какие трудозатраты?
0
Заблокирован
11.04.2014, 21:44  [ТС] 17
Цитата Сообщение от Pro_grammer Посмотреть сообщение
У меня XP
да ! у меня кстати тоже XP Брат ! Мы с тобой усталели

Добавлено через 11 минут
Цитата Сообщение от The trick Посмотреть сообщение
Никакие сообщения в этот момент не обрабатываются, все стоит. Никакие события не будут обрабатываться, будь то таймеры, клики и т.п.
у меня всё прекрасно обрабатывается,
DoEvents же там стоит ...

Добавлено через 3 минуты
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
SetParent Text1.hwnd, 0
а если вместо нуля поставить чтото другое то он будет ограничен координатами
оцовского окна
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
11.04.2014, 22:12 18
Лучший ответ Сообщение было отмечено Антихакер32 как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Option Explicit
 
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Private Type TOOLINFO
   cbSize As Long
   uFlags As Long
   hwnd As Long
   uId As Long
   RECT As RECT
   hinst As Long
   lpszText As Long
   lParam As Long
End Type
 
Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExW" (ByVal dwExStyle As Long, ByVal lpClassName As Long, ByVal lpWindowName As Long, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageW" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
 
Private Const TOOLTIPS_CLASS = "tooltips_class32"
Private Const TTS_ALWAYSTIP = &H1
Private Const WS_EX_TOPMOST = &H8&
Private Const WM_USER = &H400
Private Const TTM_ADDTOOLW = WM_USER + 50
Private Const TTM_SETMAXTIPWIDTH = WM_USER + 24
Private Const TTF_IDISHWND = &H1&
Private Const TTF_SUBCLASS = &H10&
 
Dim hTool As Long
 
Private Sub Form_Load()
    Dim ti As TOOLINFO, btn1 As CommandButton, btn2 As CommandButton
    Set btn1 = Me.Controls.Add("VB.CommandButton", "cmd1")
    Set btn2 = Me.Controls.Add("VB.CommandButton", "cmd2")
    btn1.Move 100, 100, 4000, 700: btn1.Visible = True
    btn2.Move 100, 800, 4000, 700: btn2.Visible = True
    hTool = CreateWindowEx(WS_EX_TOPMOST, StrPtr(TOOLTIPS_CLASS), 0, TTS_ALWAYSTIP, 0, 0, 50, 50, Me.hwnd, 0, App.hInstance, ByVal 0&)
    ti.cbSize = Len(ti): ti.uFlags = TTF_IDISHWND Or TTF_SUBCLASS: ti.hwnd = Me.hwnd: ti.hinst = App.hInstance
    ti.uId = btn1.hwnd: ti.lpszText = StrPtr("Multiline tooltip" & vbNewLine & "Second line" & vbNewLine & "Btn1")
    SendMessage hTool, TTM_ADDTOOLW, 0, ti
    ti.uId = btn2.hwnd: ti.lpszText = StrPtr("Multiline tooltip2" & vbNewLine & "Second line" & vbNewLine & "Btn2")
    SendMessage hTool, TTM_ADDTOOLW, 0, ti
    SendMessage hTool, TTM_SETMAXTIPWIDTH, 0, 60&
End Sub
Private Sub Form_Unload(Cancel As Integer)
    DestroyWindow hTool
End Sub
Это с декларациями и добавлением контролов, извращенцы могут вместо UDT использовать массивы. Это решает также проблему с кириллицой на других языках.
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
у меня всё прекрасно обрабатывается, DoEvents же там стоит ...
DoEvents не заметил. Это ничего не меняет, сообщения в очередь могут с очень большой скоростью поступать и их надо все обрабатывать, DoEvents - обработает только очередное, если в очереди будет много сообщений, то перерисовка уйдет на задний план и не будет обрабатываться. А если у кого-то таймер стоит например на 64 мс, или например taras atavin вообще собирался с частотой 1кГц пускать? Поверь мне - это неправильное, некрасивое решение. Делай правильно, я всегда рад помочь, если что спрашивай.
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
а если вместо нуля поставить чтото другое то он будет ограничен координатами
оцовского окна
Я тебе говорю про парный вызов, чтобы ты все на место убирал по завершении.
1
Заблокирован
11.04.2014, 23:35  [ТС] 19
Цитата Сообщение от The trick Посмотреть сообщение
А если у кого-то таймер стоит например на 64 мс, или например taras atavin вообще собирался с частотой 1кГц пускать? Поверь мне - это неправильное, некрасивое решение.
да .. как же я не подумал что моими компонентами может воспользоваться taras atavin
со своим супер-таймером )))

еще раз спасибо буду прикручивать, пошол я код набирать ...

Добавлено через 38 минут
А как-же сделать чтоб hTool
не вызывался просто так, а только по нажатию ПКМ ?

Добавлено через 4 минуты
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Dim hTool As Long
Dim WithEvents btn1 As CommandButton, WithEvents btn2 As CommandButton
 
Private Sub btn1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 2 Then
        '?
    End If
End Sub
 
Private Sub Form_Load()
    Dim ti As TOOLINFO
    Set btn1 = Me.Controls.Add("VB.CommandButton", "cmd1")
    Set btn2 = Me.Controls.Add("VB.CommandButton", "cmd2")
Добавлено через 6 минут
кстате может мне вообще пункт меню вызывать ?
в неактивном режиме, эфект будет тот-же а многострочность можно обеспечить пунктами

Добавлено через 9 минут
чтото вроде ...
Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub btn1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 2 Then
        Dim o As Object
        For Each o In Me
            If TypeName(o) = "Menu" Then o.Enabled = False
        Next
        PopupMenu mnu1, 0, X, Y
    End If
End Sub
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
11.04.2014, 23:49 20
TTM_TRACKPOSITION, TTM_TRACKACTIVATE.
Смысл тултипа который вызывается правой кнопкой? Это контекстное меню получается. Либо WS_POPUPWINDOW окно, тогда полная аналогия с меню.
1
11.04.2014, 23:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2014, 23:49
Помогаю со студенческими работами здесь

На второй панели всегда должны отображаться текущие размеры формы
Я уже все сделала, только не знаю как на второй панели отобразить текущие размеры формы... На...

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

Запретить группировку окон в панели задач
Привет всем, как сделать чтобы окна моей программы не группировались в панели задач, а все...

Запретить изменение размера панели (JavaFX)
Как запретить изменение размера панели, именно панели, а не всего окна? Добавлено через 15 часов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru