Установка ShowInTaskBar = False вызывает мерцание при закрытии немодальной формы в .net, winforms

Чтобы воссоздать это поведение, вам необходимо создать всплывающую форму со следующими свойствами:

(1) ShowInTaskBar = False

(2) Отобразите форму с помощью метода Show и зацикливайтесь, пока форма не станет видимой.

(3) Чтобы закрыть форму при щелчке мышью вне ее, переопределите OnDeactivate и установите для параметра visible значение False.

Затем создайте другую форму, которая будет отображать всплывающее окно при нажатии кнопки:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As Syste
    Using pop As New PopUp
        pop.Visible = True
        Do While pop.Visible
            Application.DoEvents()
            NativeMethods.MsgWaitForMultipleObjectsEx(0, IntPtr.Zero, 250, &HFF, 4)
        Loop
        Me.Activate()
    End Using
End Sub

Запустите проект, разверните форму, чтобы заполнить экран, и нажмите кнопку, чтобы открыть всплывающее окно. Затем щелкните в любом месте исходной формы. В большинстве случаев, но не всегда, исходная форма исчезает на долю секунды, прежде чем появится снова, что вызывает эффект мерцания.

Углубившись в отражатель и System.Windows.Forms.Design.DropDownHolder, я обнаружил в CreateParams следующее, которое решает проблему мерцания:

createParams.Style = (createParams.Style Or -2139095040)

К сожалению, он также обводит форму черной рамкой. (Вам нужно установить FormBorderStyle = System.Windows.Forms.FormBorderStyle.None, чтобы это увидеть.)

Кто-нибудь знает, что делает этот стиль, кроме черной рамки вокруг формы?

Я искал в Google номер и его шестнадцатеричный эквивалент, но ничего не нашел.

Спасибо.

ETA: я просмотрел список констант стиля в pinvoke .net, но я не стал мудрее.


person Jules    schedule 24.11.2009    source источник


Ответы (1)


-2139095040 = 0x80800000 = WS_POPUP | WS_BORDER

Похоже, в этом виноват и граница.

person wqw    schedule 25.11.2009