
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.89] |
![]() |
|
Страницы: (10) [1] 2 3 ... 9 10 все ( Перейти к последнему сообщению ) |
![]() |
Прикр. сообщ.
#1
,
|
|
Есть небольшое предложение, сделать набор классов или UserControls (хотя, более чем уверен, что он уже существует в том или ином виде), которые смогут полностью заменить ActiveX MS Common Control, дабы не возникало тем, вроде этой, а так же в целях избавить себя от перетаскивания почти 1 МБ, чтобы пользовать, к примеру, банальный ProgressBar. Если тема имеет смысл, то могу набросать еще для TabControl по прототипу PropertySheet с возможностью добавлять Frame. В качестве поддержки темы набросал класс ProgressBar'а...
Реализовано: SysListView32 — ListView.ctl — Обновлено 10/12/2007 msctls_progress32 — Progress.ctl SysDateTimePick32 — SysDateTimePick.ctl SysTabControl32 — TabStrip.ctl — Обновлено 10/12/2007 SysTreeView32 — TreeView.ctl msctls_statusbar32 — StatusBar.ctl — Обновлено 10/12/2007 SysIpAddress32 — IpAddress.ctl CODEBOX controls CodeBox.part01.rar CodeBox.part02.rar CodeBox.part03.rar EOF CODEBOX controls Прикреплённый файл ![]() |
Сообщ.
#1
,
|
|
|
Не можно, а нужно. Вношу лепту. Делал не я, но думаю автор нас простит.
[Компонент помещен в общий пакет] |
Сообщ.
#2
,
|
|
|
парни, вы про клавишу Tab не забывайте.
|
![]() |
Сообщ.
#3
,
|
|
Ну, если очень хочется табулировать, то вот это самый оптимальный способ, как мне кажется, в случае использования классов (не UserControls). Видел где-то еще пример с вызовами OLE-ф-ций, но, по словам автора, он не ахти как работает.
|
![]() |
Сообщ.
#4
,
|
|
Полезная тема.
Как наберется более-менее весь состав общих элементов, накопленное можно будет скинуть в кладовку. |
Сообщ.
#5
,
|
|
|
Цитата то вот это самый оптимальный способ да, самый простой. я тоже подложки делаю из PictureBox'ов. но есть проблемы: не срабатывает событие потери фокуса у "корректного" контрола при переводе фокуса сразу на апи-контрол по мыше, и плюс ко всему порядок перехода по таб становиться не корректным. для продакшена это важно. |
![]() |
Сообщ.
#6
,
|
|
Насчет потери фокуса - согласен. Это минус. А вот насчет порядка перехода - так установи нужный TabIndex на PictureBox и будет корректный порядок. Во всяком случае, я обнаружил только первый недостаток. В остальном все ОК...
|
![]() |
Сообщ.
#7
,
|
|
С потерей фокуса можно бороться.
Просто контрол надо размещать в UserControl'е и при UserControl_EnterFocus посылать ![]() ![]() Call SendMessage(WM_SETFOCUS, hControl, 0 , 0) |
![]() |
Сообщ.
#8
,
|
|
Модули приниматься не будут.
Что делть если я например хочу 2 табстрипа добавить на форму =??? |
![]() |
Сообщ.
#9
,
|
|
Все очень просто. Изменил attach для наглядности. Он и сделан под класс, дабы быть ОДНИМ файлом. Единственное отличие от класса - сохранять его hWnd самому и ссылаться на него не по имени класса, а по hWnd, в остальном - полная аналогия.
|
![]() |
Сообщ.
#10
,
|
|
Цитата ALXR @ Все очень просто. Изменил attach для наглядности. Он и сделан под класс, дабы быть ОДНИМ файлом. Единственное отличие от класса - сохранять его hWnd самому и ссылаться на него не по имени класса, а по hWnd, в остальном - полная аналогия. а события как реализовать ? |
![]() |
Сообщ.
#11
,
|
|
Посылать дочерним Frame/PictureBox'ам определенные сообщения и их же обрабатывать. К примеру WM_LBUTTONDOWN с X=-1 и Y=-1, которое не может быть сгенерированно действиями пользователя.
![]() Мне больше интересно, как в модуле класса или UserControl'а организовать subclassing. Или таскать тот же модуль за собой? Это было бы лучше, если бы в VB работали директивы INCLUDE (как в QB 4.5, к примеру), иначе, я считаю, такое решение будет хуже моего, даже с обработкой событий через WM_LBUTTONDOWN. |
![]() |
Сообщ.
#12
,
|
|
модуль можно написать один на все контролы.
хранить в нем структуру где связаны объект класса и hwnd все параметры процедуры передавать на обработку классам. нормальное решение. |
Сообщ.
#13
,
|
|
|
у меня есть все коммон контролы... ну они все вместе так завязаны... что выдрать только один проблематично
![]() |
![]() |
Сообщ.
#14
,
|
|
2 ALXR:
Цитата А как процедуре обработки узнать, какой инстанции класса отправлять уведомление о том или ином сообщении? ![]() ![]() Option Explicit Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, _ ByVal Length As Long) Private Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal hwnd As Long, _ ByVal lpString As String, ByVal hData As Long) As Long Private Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal hwnd As Long, _ ByVal lpString As String) As Long Private Sub Form_Load() Dim obj As Object 'Записываем указатель на объект в свойства hWnd Call SetProp(Me.hwnd, "object", ObjPtr(Me)) 'Считываем указатель на объект из свойств hWnd Call CopyMemory(obj, GetProp(Me.hwnd, "object"), 4) 'Проверка Call MsgBox(obj.hwnd) 'Освобождаем указатель Call CopyMemory(obj, 0&, 4) End Sub |
![]() |
Сообщ.
#15
,
|
|
А вообще, вот сабклассинг без модуля. В классе.
Прикреплённый файл ![]() |