문제

기본적으로 FormBorderStyle = FixToolWindow를 사용하여 간단한 테스트 양식을 만들고 마우스를 누를 때 FixToolWindow와 SsizeableToolWindow 사이를 전환하는 버튼을 추가했습니다.

이 둘 사이에서 FormBorderStyle을 전환하면 내 응용 프로그램에 많은 문제를 일으키는 이상한 효과가 나타나는 것 같습니다.문제는 창이 크기를 변경하는 것 같은데 나는 그것을 가질 수 없다는 것입니다.테두리만 변경하고 싶습니다. 양식 크기를 동일하게 유지해야 합니다.

예를 들어 버튼 코드는 다음과 같습니다.

private void button1_Click(object sender, System.EventArgs e) {
    if(FormBorderStyle == FormBorderStyle.FixedToolWindow) {
        System.Diagnostics.Debug.WriteLine("SWITCHING: FIXED -> SIZABLE");
        FormBorderStyle = FormBorderStyle.SizableToolWindow;
    } else {
        System.Diagnostics.Debug.WriteLine("SWITCHING: SIZABLE -> FIXED");
        FormBorderStyle = FormBorderStyle.FixedToolWindow;
    }
}

디버깅을 위해 다음을 사용합니다.

private void Settings_SizeChanged(object sender, System.EventArgs e) {
    System.Diagnostics.Debug.WriteLine(this.Size);
}

스위치 버튼을 눌렀을 때의 출력은 다음과 같습니다.

SWITCHING: FIXED -> SIZABLE
{Width=373, Height=169}
{Width=383, Height=179}
SWITCHING: SIZABLE -> FIXED
{Width=383, Height=179}
{Width=373, Height=169}

이 동작을 어떻게 수정할 수 있나요?그리고 "수정"이란 가능하면 이런 일이 발생하지 않도록 방지하는 것입니다.테두리 스타일 유형에 관계없이 양식 크기를 지정하고 그대로 유지하고 싶습니다.

또한 Form 클래스를 하위 클래스로 분류하는 솔루션은 이러한 방법으로 이 문제를 해결하려는 아이디어가 있는 경우 완벽한 솔루션이 될 것입니다.

편집하다:
문제를 보여주기 위해 작은 비디오를 만들었습니다.첫 번째 테스트에서는 양식 크기가 실제로 (시각적으로) 변경되지 않고 양식의 위치만 약간 변경되는 것을 보여줍니다.그러나 디버그 출력에서 ​​볼 수 있듯이 Size 속성의 값은 변경됩니다.두 번째 테스트에서는 양식 크기 속성 값이 변경되고 창 크기 자체도 변경되는 디버그 출력을 볼 수 있습니다.

여기를 보십시오:
http://screencast.com/t/0vT1vCoyx2u

도움이 되었습니까?

해결책

문제는 크기가 아닌 위치 변경에 있습니다.이 코드는 비디오에 표시된 문제를 해결합니다.

        private void Form1_DoubleClick(object sender, EventArgs e)
        {
            Point _location = this.PointToScreen(this.ClientRectangle.Location);
            if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow)
            {
                this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
            }
            else
            {
                this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
            }
            Point _newloc = this.PointToScreen(this.ClientRectangle.Location);
            Size _diff = new Size(_newloc) - new Size(_location);
            this.Location -= _diff;
        }

두 테두리 스타일 사이를 전환할 때 렌더링된 양식이 이동하는 문제는 DWM의 버그인 것 같습니다.

다른 팁

나는 Windows Forms가 클라이언트 크기(예:내부 영역) 테두리 크기는 변경되지만 동일합니다.이는 일반적으로 창에 넣은 내용이 창에 정확하게 맞도록 보장하기 때문에 좋은 것입니다.

동일한 외부 치수를 유지하려면 테두리 유형을 변경하기 전에 크기를 변수에 저장한 다음 다시 복원하여 문제를 해결할 수 있습니다.하지만 아마도 약간 깜박일 것입니다.

이것은 나에게 잘 작동했습니다.

    private Size _size;
    private void Form1_DoubleClick(object sender, EventArgs e)
    {
        _size = this.Size;
        if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow)
        {
            this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
        }
        else
        {
            this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
        }
        this.Size = _size;
    }

나는 이와 같은 문제가 있었다.FormBorderStyle을 설정하면 클라이언트 크기가 변경되지만 클라이언트 직사각형 속성에 바로 입력되지는 않는 것 같습니다.위에 나열된 코드는 나에게 거의 효과적이었지만 단순히 크기를 저장하는 대신 클라이언트 크기를 저장해야 합니다.물론, 위의 예에서 "this"는 클라이언트 규모에 대한 참조일 수도 있습니다. 확실하지는 않습니다.어쨌든 구입하십시오. 이것은 나에게 효과적이었습니다.

_frmFilter.높이 = 300 Dim _size As Size = 입니다. 클라이언트 크기 _frmFilter.FormBorderStyle = FormBorderStyle.FixedToolWindow _frmFilter.클라이언트 크기 = _size

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top