Автор вопроса: Боцман | Web-сайт:Rus-Skipper.narod.ru | ICQ: 295725312
Ниже сделал пример кода, и вот какие есть нюансы.
1.Растяните форму по горизонтали до одной линии, отпустите кнопку мыши, теперь попробуйте вновь строить кнопки, (не отпуская кнопки мышки) по вертикали потом по горизонтали. МЕРЦАЕТ.
2.Постройте форму вертикально в один столбец, отпустите кнопку мыши, а затем опять попробуйте растягивать и сжимать НЕ МЕРЦАЕТ.
Вывод: видимо Windows по окончанию ресадинга, фиксирует в памяти, почему - то Me.Height и если мы ее увеличиваем, то есть мерцание, если уменьшаем, то нет мерцания, как с этим бороться подскажите, пожалуйста.
Откройте форму, поставьте BorderStyle = 5, и киньте на форму Command1(0) индекс не забудьте поставить(0), теперь код;
Option Explicit
Dim py As Long
Dim px As Long
Dim nBtn As Byte
Dim KolButonov As Byte 'количество
Dim kolWstroke As Byte
Dim №stroki As Byte
Function Stroim_Btn()
№stroki = 1
For nBtn = 1 To 19
Command1(nBtn).Left = Command1(nBtn - 1).Left + Command1(0).Width
Command1(nBtn).Top = Command1(nBtn - 1).Top
If nBtn = kolWstroke * №stroki Then
Command1(nBtn).Top = Command1(0).Top + Command1(0).Width * №stroki
Command1(nBtn).Left = Command1(0).Left
№stroki = №stroki + 1
End If
Next nBtn
End Function
Private Sub Form_Load()
Command1(0).Height = 400
Command1(0).Width = 400
Command1(0).Caption = 1
Command1(0).Top = 0
Command1(0).Left = 0
kolWstroke = 10
KolButonov = 20
nBtn = 0
py = Me.Height - Me.ScaleHeight
px = Me.Width - Me.ScaleWidth
For nBtn = 1 To 19
Load Command1(nBtn)
Command1(nBtn).Visible = True
Command1(nBtn).Caption = nBtn + 1
Next nBtn
Stroim_Btn
Me.Width = kolWstroke * Command1(0).Width + px
End Sub
Private Sub Form_Resize()
kolWstroke = Me.ScaleWidth / Command1(0).Width
If Me.ScaleWidth < (kolWstroke * Command1(0).Width) Then Stroim_Btn
If Me.ScaleWidth > (kolWstroke * Command1(0).Width) Then Stroim_Btn
Me.Height = Command1(KolButonov - 1).Top + Command1(0).Height + py
Me.Refresh
End Sub
событие Form_Resize видимо аналог WM_SIZE, то есть изменение формы уже произошло.
Сабклассируй форму,лови WM_SIZEING (0x0214)
и задавай ограничения размеров там.
Во время загрузки формы, следующий код поможет уменьшить мерцание и мелькание GUI при помощи функций API:
'Declarations Section
#If Win32 Then
Declare Function LockWindowUpdate _
Lib "user32" _
 ByVal hwndLock As Long) As Long
#Else
Declare Function LockWindowUpdate _
Lib "User" _
 ByVal hwndLock As Integer) _
As Integer
#End If
Public Sub LoadSomeForm()
' Во время загрузки формы запрещает обновление состояния окна
' чтобы избавиться от мерцания.
' запрещаетобновление GUI
LockWindowUpdate frmTest.hWnd
' показывает форму
frmTest.Show
' здесь код, относящийся к загрузка формы и т.п.
' Никогда не забывайте разрешить обратно обновление окна
LockWindowUpdate 0
End Sub
Docal дело не в загрузки ты вставь код приведенный выше и увидишь, что окно помнит последнии кординаты.Вот что бы нагляднее было, замени эту часть кода на эту.
Private Sub Form_Resize()
Dim s1 As Long
s1 = Me.ScaleWidth - Command1(0).Width * kolWstroke
kolWstroke = Me.ScaleWidth / Command1(0).Width
If s1 < 5 Then
Me.Caption = "Stroim " & s1
'Me.Height = (Command1(KolButonov - 1).Top + Command1(0).Height + py) '/ 15
Stroim_Btn
'Exit Sub
Else
Me.Caption = "Ждем"
MoveWindow Me.hwnd, Me.Left / 15, Me.Top / 15, _
Me.ScaleWidth / 15 + px / 15, (Command1(KolButonov - 1).Top + Command1(0).Height + py) / 15, 1
End If
End Sub
В отдел деклараций добавь это:
Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal X As Long, ByVal Y As Long, _
ByVal nWidth As Long, ByVal nHeight As Long, _
ByVal bRepaint As Long) As Long