VB6 ssTab странность - PullRequest
       24

VB6 ssTab странность

1 голос
/ 24 февраля 2009

Я использую элемент управления ssTab (это, вероятно, вся моя проблема) в программе VB6, и я строю данные в Picturebox, расположенный на вкладке 0. Когда я перерисовываю график (например, после изменения размера окна) , первое, что я делаю, это снимите флажок:

Picture2.Line (0, 0)-(Picture2.Width, Picture2.Height), RGB(255, 255, 255), BF

Это прекрасно работает, когда вкладка 0 видна, но если этот код вызывается, когда видна другая вкладка, фон для всей видимой вкладки (а также вкладка 0) окрашивается в белый цвет. Не только область Picture2, но и вся видимая область обеих вкладок. Вкладки, кроме 0 и выбранной вкладки, не затрагиваются.

Моей первой попыткой грубо исправить это было добавление изменения вкладки обратно на вкладку 0 непосредственно перед вышеприведенной командой Line:

SSTab1.Tab = 0 ' Select tab containing PictureBox2
DoEvents

, но это дает одинаковые результаты - обе вкладки оригинала и 0 теперь белые (хотя это и меняет видимую вкладку обратно на вкладку 0).

Я заметил, что при окраске стены значение Picture2.Width становится намного больше, чем должно быть. Если Tab 0 видна, Picture2.Width варьируется от 7180 до 21225 Twips, когда я изменяю размер окна. Когда я выбираю Tab 1 и изменяю размер, Picture2.Width порядка 82180 (высота остается там, где и должна быть).

Я знаю, что SStab немного глючит, но кто-нибудь знает какие-нибудь обходные пути? Я, вероятно, могу собрать вместе исправление (перекрасить фон на обеих вкладках в серый цвет после перерисовки), но я хотел бы понять, почему Picture2.Width сходит с ума ...

Ответы [ 4 ]

5 голосов
/ 24 февраля 2009

Способ, которым SStab делает элементы управления на одной вкладке видимыми при одновременном скрытии других элементов управления, делает свойство Left отрицательным (в основном «за кадром»)

Это не должно влиять на свойство width - есть ли у вас код для изменения размера ??

1 голос
/ 24 февраля 2009

Звучит маленький колокольчик о стебе и ширине ... но, черт побери, могу ли я вспомнить, что. Почему-то я думаю, что он сделал странные вещи с элементами управления на вкладках не видны?

Да ... он перемещает их «за пределы экрана» (устанавливает «влево» в очень большое отрицательное положение). Или, по крайней мере, так показывают мои быстрые и грязные тесты.

Я думаю (не «знаю»), что элемент управления PictureBox часто напрямую связан с контекстом устройства формы ... поэтому меня не удивляет, что ему не нравится то, что делает с ним sstab.

То, что я бы порекомендовал, это перерисовывать, только когда вы переключаетесь на эту вкладку ... если вы знаете, что я имею в виду. Или, может быть, обнаружение того, что окно с изображением выключено, и пропуск обновления (все равно нужно будет выполнить обновление, когда окно с изображением перемещено).

0 голосов
/ 10 марта 2016

Решением этой проблемы является написание кода изменения размера для каждой вкладки. Это позволяет SSTab перемещать объекты за пределы экрана для других вкладок, а вы перемещать объекты для текущей вкладки.

Вот некоторый код, который выполняет такое изменение размера.

Private Sub Form_Resize()

Select Case SSTab.Tab
Case TAB0_INDEX
    With fraTab0
        .Left = 150
        .Top = 320
        .Height = SSTab.Height - 400
        .Width = SSTab.Width - 200
    End With

Case TAB1_INDEX

    With txtMaxPixelData
        .Height = SSTab.Height - 850
    End With
    With txtPixelData
        .Height = txtMaxPixelData.Height
    End With
End Select
End Sub
0 голосов
/ 25 февраля 2009

Как только я понял причину странного поведения (спасибо DJ: «Способ, которым SStab делает элементы управления на одной вкладке видимыми, скрывая другие элементы управления, состоит в том, что свойство .Left становится отрицательным (в основном« за кадром »)» Я понял, где моя проблема.

Как сказал DJ, как только вы выбираете одну из вкладок, не содержащую PictureBox, свойство PictureBox.Left становится очень отрицательным (например, -74000). В моем коде Form_Resize () у меня была следующая строка:

Picture2.Width = MainForm.Width - (Picture2.Left + PictureBoxMargin)

Что делает Picture2.Width еще большим положительным числом (моя большая ошибка).

Окончательное решение состояло в том, чтобы создать открытую переменную Picture2LeftEdge, установить ее равной Picture2.Left в процедуре Form_Initialize () и изменить указанную выше строку изменения размера на:

Picture2.Width = MainForm.Width - (Picture2LeftEdge + PictureBoxMargin)

Спасибо за супер-быстрые ответы, диджей и робби!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...