- Код: Выделить всё
Option Explicit
Private Declare Function CreateWindowEx Lib "user32.dll" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, 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, ByRef lpParam As Any) As Long
Private Declare Function InitCommonControlsEx Lib "comctl32.dll" (ByRef TLPINITCOMMONCONTROLSEX As tagINITCOMMONCONTROLSEX) As Long
Private Const WS_CHILD As Long = &H40000000
Private Const WS_VISIBLE As Long = &H10000000
Private Const WS_BORDER As Long = &H800000
Private Type tagINITCOMMONCONTROLSEX
dwSize As Long
dwICC As Long
End Type
Private Sub Form_Load()
Dim ic As tagINITCOMMONCONTROLSEX
ic.dwSize = Len(ic)
ic.dwICC = 256 'ICC_DATE_CLASSES
InitCommonControlsEx ic
Me.Width = Me.ScaleX(400, vbPixels, vbTwips)
Me.Height = Me.ScaleY(300, vbPixels, vbTwips)
Me.ScaleMode = vbPixels
CreateWindowEx 0, "SysDateTimePick32", vbNullString, WS_CHILD Or WS_VISIBLE, 10, 10, 150, 20, Me.hWnd, 0, 0, ByVal 0&
CreateWindowEx 0, "EDIT", "API TextBox", WS_CHILD Or WS_VISIBLE Or WS_BORDER, 10, 40, 150, 20, Me.hWnd, 0, 0, ByVal 0&
With Me.Controls.Add("VB.TextBox", "txtTest")
.Move 200, 10, 150, 20
.Text = "VB TextBox"
.Visible = True
End With
End Sub
Поставьте фокус на API TextBox. А теперь кликните по стрелке DTPicker'а. Всё нормально.
Теперь поставьте фокус на VB TextBox. Кликните по стрелке DTPicker'а. Стрелка нажмётся, но окно не откроется. Вернее, оно откроется, но тут же закроется. Кликните ещё раз по стрелке. Рано или поздно окно начнёт появляться нормально.
При переходе на DTPicker с других элементов, таких как ComboBox, эффекта не наблюдается, хотя ComboBox содержит в себе тот же TextBox.
В определённых сложных случаях (MDI-интерфейс, на форме фреймы и гриды) эффект становится неприемлемо ужасным, календарь зарывается всегда, сколько ни кликай.
Кто-нибудь знает, почему это происходит и как от этого избавиться?