Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Динамическое построение контролов Добавлено: 28.04.07 10:22  

Автор вопроса:  Боцман | 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

Ответить

  Ответы Всего ответов: 5  

Номер ответа: 1
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #1 Добавлено: 28.04.07 12:12
API-функцией установи WindowBounds и мигать не будет :)

Ответить

Номер ответа: 2
Автор ответа:
 Боцман



ICQ: 295725312 

Вопросов: 53
Ответов: 830
 Web-сайт: Rus-Skipper.narod.ru
 Профиль | | #2
Добавлено: 28.04.07 18:39
API-функцией установи WindowBounds и мигать не будет

Вы наверно имели эту функцию MoveWindow,
что-то у меня с ней не получается убрать мерцание.

Ответить

Номер ответа: 3
Автор ответа:
 EUGY



Вопросов: 0
Ответов: 454
 Профиль | | #3 Добавлено: 28.04.07 18:48
событие Form_Resize видимо аналог WM_SIZE, то есть изменение формы уже произошло.
Сабклассируй форму,лови WM_SIZEING (0x0214)
и задавай ограничения размеров там.

Ответить

Номер ответа: 4
Автор ответа:
 D o c a l



ICQ: 408802757 

Вопросов: 76
Ответов: 985
 Web-сайт: www.doc-source.pp.net.ua/
 Профиль | | #4
Добавлено: 28.04.07 22:50
Во время загрузки формы, следующий код поможет уменьшить мерцание и мелькание 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

Ответить

Номер ответа: 5
Автор ответа:
 Боцман



ICQ: 295725312 

Вопросов: 53
Ответов: 830
 Web-сайт: Rus-Skipper.narod.ru
 Профиль | | #5
Добавлено: 28.04.07 23:11
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
теперь медленно попробуй изменять размеры.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам