MDI child окна - в таскбар?

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

Сообщение ZlydenGL » 01.09.2004 (Ср) 12:07

alibek писал(а):Forms().SetFocus
Я против VB - похоже что счет 2:0 :( Не пашет конструкция!

[Через n+1 минут]

Урра, этот вариант заработал!!! :twisted: Respect всем!
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

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

Сообщение alibek » 01.09.2004 (Ср) 12:13

Forms использовать не совсем правильно.
Лучше используй массив frm() As Form1 и делай frm(2).SetFocus. Только что сделал - все работает.
Lasciate ogni speranza, voi ch'entrate.

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 01.09.2004 (Ср) 12:17

Forms() тоже неплохо шпарит, засим пока оставлю (пока не начну глюки отлавливать) ;)
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

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

Сообщение alibek » 01.09.2004 (Ср) 12:20

Серьезно, лучше избавься от Forms. Делов то на пять минут
Код: Выделить всё
Dim frm() As Form1
...
ReDim frm(0)
...
ReDim Preserve frm(0 To UBound(frm)+1)
Set frm(UBound(frm)) = New Form1
Load frm(UBound(frm))
...
frm(Index).SetFocus
Lasciate ogni speranza, voi ch'entrate.

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 01.09.2004 (Ср) 12:47

Не получится, иначе массивов Dim frm() as Form1 получится очень много - поскольку на экране очень много РАЗНЫХ форм.
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 01.09.2004 (Ср) 13:03

Последний похоже вопрос - какой идеальный для моей задачи контрол? И где его взять само собой разумеется ;) У TabStrip'а обнаружился целый набор "неприятностей" - от неотображения ToolTip'а КАЖДОЙ кнопки до невозможности на активной кнопке шрифт сделать жирным. Не говоря уже про необходимость использовать его в фрейме со скроллингом, поскольку управление шириной кнопок и рядами тоже не очень - в смысле приходится реализовывать самому.
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

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

Сообщение alibek » 01.09.2004 (Ср) 14:04

Имеешь ввиду, разные типы MDIChild? Тогда делай Dim frm() As Form, пусть будут в куче.

А для закладок - почему бы не написать свой контрол? Сами кнопки делать вообще элементарно, придется только немного поколдовать над красивым скроллингом.
Lasciate ogni speranza, voi ch'entrate.

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 01.09.2004 (Ср) 14:12

Написать свой контрол... Товарисчи, где бы добыть инфу по написанию контролов?

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

Вообще же - думаю найти подходящий контрол будет эффективней. Может все же есть у кого-нить идеи?
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

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

Сообщение alibek » 01.09.2004 (Ср) 14:21

С исходниках Windows не копался :)
Но интуитивно полагаю, что текст рисуется на виртуальном DC, потом обрезается и выводится на DC кнопки.
Это что касается обрезания текста.

А вот с контролами... Ну если очень не хочется рисовать свой, то размести Frame, в нем скролл и кнопку cmdButton(0) (невидимую). И при добавлении окна выполняй Load cmdButton(1), cmdButton(1).Visible = True.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение GSerg » 01.09.2004 (Ср) 14:24

Что касается обрезания текста, то у DrawTextEx есть флаг DT_END_ELLIPSIS, который обрезает текст и ставит в конце многоточие, чтобы уместить всё это в заданный прямоугольник :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение alibek » 01.09.2004 (Ср) 14:28

Ну дык :) Это DrawTextEx, он суть обертка для TextOut. А может человек хочет все ручками, быстро :)
Lasciate ogni speranza, voi ch'entrate.

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 01.09.2004 (Ср) 15:08

Мама... Указатель на строку... Указатель на идентификатор прямоугольника...
Подскажите хотя бы примерный синтаксис, а? И объясните, откуда он берет настройки шрифта для конкретного случая - из хэндла объекта прорисовки?
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

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

Сообщение GSerg » 01.09.2004 (Ср) 15:10

Указатель на строку - byval s as string. Указатель на прямоугольник - byref r as RECT.
Шрифт он берёт тот, который выбран в DC. То есть нуно CreateFont, а потом SelectObject его в DC, а потом уже drawtextex...

А чтобы с объявления проблем не было - http://www.activevb.de/rubriken/apiview ... ereng.html
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 01.09.2004 (Ср) 15:13

Это даже не 1С уже похоже :( Что значит DC? Каким образом и в каком виде надо закреэйтить фонт и передать его в этот самый страшный DC?

Функция TextLength мне видимо вообще не помощник?
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

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

Сообщение GSerg » 01.09.2004 (Ср) 15:17

Так, что-то я выпал :)

Вопрос первый: на чём рисуем?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 01.09.2004 (Ср) 15:23

На кнопке, обычной Button.
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

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

Сообщение GSerg » 01.09.2004 (Ср) 15:53

У неё DC должон быть :)
Попробуй выставить нужные параметры шрифта в пропертях, а потом getwindowdc(command1.hwnd), а потом drawtextex туда...
Хотя это несколько левый метод, лучше уж полный ownerdraw...

Может, просто попробовать через textlenght найти ту максимальную длину текста, которая влезает в кнопку, и установить этот текст с многоточием?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение alibek » 01.09.2004 (Ср) 15:53

А... Имеешь ввиду, как текст обрезать до того, как вывести на кнопку? Чтобы он не переносился?
Делаешь на форме такой же фонт, как и на кнопке. Затем проверяешь If TextWidth(Text) > cmbButton(1).Width - 120 Then MsgBox "Текст больше!"

Только для этого надо, чтобы и у формы и у контейнера, на котором расположена кнопка, было ScaleMode=vbTwips
Lasciate ogni speranza, voi ch'entrate.

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 01.09.2004 (Ср) 16:08

TextLength относится только к определенным объектам, которые мне явно не подходят :)

Да, я хочу тримить текст до вывода на кнопень.

TextWidth относится еще и к Пикчербоксу - может тогда не впадать в зависимость от формы?
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

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

Сообщение alibek » 01.09.2004 (Ср) 16:37

Да, TextWidth относится и к PictureBox (который одновременно является и контейнером), так что можно отказаться от Frame.
Lasciate ogni speranza, voi ch'entrate.

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 01.09.2004 (Ср) 16:52

Опа, а обычная кнопа не подходит! Придется кнопень тоже искать а-ля Таскбаровские ;) Ага, ТоггляБаттон вроде походит! Начинаем рисовать! Усем пасибо!!!!
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

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

Сообщение tyomitch » 01.09.2004 (Ср) 19:45

Для любителей рисовать текст необычными способами: http://vbrussian.com/Controls.asp?ID=100
[/бесстыдная самореклама]

Для тех, у кого не открывается сайт:
Вложения
LabelEx_2[1].rar
(18.13 Кб) Скачиваний: 48
Последний раз редактировалось tyomitch 02.09.2004 (Чт) 10:40, всего редактировалось 1 раз.
Изображение

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 02.09.2004 (Чт) 10:00

tyomitch, у меня сайт vbrussian вообще почему-то не открывается :-( Не выложишь сюда сабж? Спасибо!
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 02.09.2004 (Чт) 15:56

Еще один вопрос - как вызвать при клике по кнопке системное меню соответствующего окна? Есть такая функция?
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

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

Сообщение tyomitch » 02.09.2004 (Чт) 16:58

TrackPopupMenu, а как же ещё?
Нужный hMenu получается с помощью GetSystemMenu
Изображение

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 03.09.2004 (Пт) 15:48

Еще вопрос появился: как отследить по MouseDown к какой экранной кнопотени он относится? Или же - как заставить систему воспринимать клик правой клавишей мыши как последовательность клика левой + вызов менюшки окна?

Вдогонку: использую следующий код:
Код: Выделить всё
Private Sub TaskButtons_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim hMenu As Long, T As RECT
If Button = 2 Then
    mMenu = GetSystemMenu(Forms(TaskButtons.SelectedItem.Index).hwnd, 0)
    TrackPopupMenu hMenu, 0, x, y, 0, Forms(TaskButtons.SelectedItem.Index).hwnd, T
End If
End Sub


Меню не вызывается. Что не так?
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

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

Сообщение tyomitch » 03.09.2004 (Пт) 19:11

ZlydenGL писал(а):Меню не вызывается. Что не так?

Может быть, что-то с координатами?
Вот этот код работает:
Код: Выделить всё
Option Explicit
Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long
Private Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal nReserved As Long, ByVal hWnd As Long, lprc As Any) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
    x As Long
    y As Long
End Type

Private Sub Form_Click()
Dim pt As POINTAPI
GetCursorPos pt
TrackPopupMenu GetSystemMenu(hWnd, 0), 0, pt.x, pt.y, 0, hWnd, ByVal 0&
End Sub
Изображение

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 06.09.2004 (Пн) 9:54

О, меню появилось! Но почему-то окно не выполняет его команд - т.е. даю я команду "Свернуть", "Развернуть", "Закрыть" - окно не реагирует.

Понятно, мой код тоже вызывал меню - но координаты х и у, переданные процедурой, не соответствовали экранным ;) Не подумал я об этом. А поскольку проверял я вызов меню, пытаясь перейти на какой-либо пункт и ВЫПОЛНИТЬ его, то сделал вывод, что меню не было :(
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

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

Сообщение tyomitch » 06.09.2004 (Пн) 14:09

Держи.
Код: Выделить всё
Option Explicit
Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long
Private Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal nReserved As Long, ByVal hWnd As Long, lprc As Any) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Type POINTAPI
    x As Long
    y As Long
End Type

Private Sub Form_Click()
Dim pt As POINTAPI
GetCursorPos pt
SendMessage hWnd, &H112, TrackPopupMenu(GetSystemMenu(hWnd, 0), &H100, pt.x, pt.y, 0, hWnd, ByVal 0&), 65536 * pt.x + pt.y
End Sub
Изображение

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

Сообщение GSerg » 06.09.2004 (Пн) 14:13

Для справки: Тёмыч добавил флаг TPM_RETURNCMD :) Без оного действительно не то.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Пред.След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

    TopList