Улучшить и дополнить контрол

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Влад!
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 12.11.2003 (Ср) 13:15

Улучшить и дополнить контрол

Сообщение Влад! » 26.01.2004 (Пн) 4:42

Стандартные контролы VB очень далеки от совершенства и часто нужна какая-нибудь маленькая настройка из-за отсутствия которой приходится добавлять в проект контролы по 400 Кб.. :( Помогите, кто знает как:
1. В Label установить вертикальную ориентацию текста по центру
2. Сделать (2000, XP) поле текстбокса прозрачным
3. Классический вопрос о том, как в combobox изменить число всплывающих строк (только, please, с примером)
4. Можно ли через API отловить события входа и выхода мышки на территорию контрола?
Thanks!

Влад!
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 12.11.2003 (Ср) 13:15

Сообщение Влад! » 26.01.2004 (Пн) 4:43

И, если можно, кто знает как убрать границу в ListBox?

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

Сообщение GSerg » 26.01.2004 (Пн) 10:20

  1. Чёрт его знает, попробуй побаловаться с DrawTextEx
  2. SetLayeredWindowAttributes
  3. CB_SETDROPPEDWIDTH
  4. Вход - это первый из маусмувов. Выход - по факту входа вызываем TrackMouseEvent с флагом TME_LEAVE. Когда получаем WM_MOUSELEAVE, мышь ушла...
  5. Это либо SetWindowLong с флагом GWL_STYLE и значением WS_BORDER, либо она же, но с GWL_EX_STYLE и WS_EX_CLIENTEDGE.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Влад!
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 12.11.2003 (Ср) 13:15

Сообщение Влад! » 27.01.2004 (Вт) 12:37

Через какие библиотеки объявлять? А можно кусочек кода, чтобы работал?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 27.01.2004 (Вт) 18:48

3) В форме:
Код: Выделить всё
Private Sub Form_Load()
    Me.AutoRedraw = True
    HookForm Me
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim ET As TRACKMOUSEEVENTTYPE
    'initialize structure
    ET.cbSize = Len(ET)
    ET.hwndTrack = Me.hWnd
    ET.dwFlags = TME_LEAVE
    'start the tracking
    TrackMouseEvent ET
    'show a message to the user
End Sub

Private Sub Form_Unload(Cancel As Integer)
    'stop subclassing this form
    UnHookForm Me
End Sub


В модуле:
Код: Выделить всё
Option Explicit

Public Const TME_CANCEL = &H80000000
Public Const TME_HOVER = &H1&
Public Const TME_LEAVE = &H2&
Public Const TME_NONCLIENT = &H10&
Public Const TME_QUERY = &H40000000
Public Const WM_MOUSELEAVE = &H2A3&
Public Type TRACKMOUSEEVENTTYPE
    cbSize As Long
    dwFlags As Long
    hwndTrack As Long
    dwHoverTime As Long
End Type

Public Declare Function TrackMouseEvent Lib "user32" (lpEventTrack As TRACKMOUSEEVENTTYPE) As Long
Public Declare Function SetCursorPos Lib "user32.dll" (ByVal X As Long, ByVal Y As Long) As Long
'Subclassing is explained in our subclassing tutorial at http://www.allapi.net/
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GWL_WNDPROC = -4
Public PrevProc As Long

Public Sub HookForm(F As Form)
    PrevProc = SetWindowLong(F.hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Public Sub UnHookForm(F As Form)
    SetWindowLong F.hWnd, GWL_WNDPROC, PrevProc
End Sub

Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If uMsg = WM_MOUSELEAVE Then
        Beep
    End If
    WindowProc = CallWindowProc(PrevProc, hWnd, uMsg, wParam, lParam)
End Function


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

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

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 5

    TopList  
cron