.net - 투명도 - 델파이 label 투명




.NET Windows Forms 투명 컨트롤 (4)

Windows Forms 응용 프로그램에서 'Web 2.0'Lightbox 스타일 UI 기술을 시뮬레이션하고 싶습니다. 즉, 윈도우의 클라이언트 영역에있는 모든 다른 내용을 '흐리게'함으로써 일부 전경 제어에주의를 집중시키는 것입니다.

분명한 해결책은 윈도우의 클라이언트 영역에 도킹되어 Z 순서의 앞쪽으로 가져올 수있는 부분적으로 투명한 사각형 인 컨트롤을 만드는 것입니다. 그것은 다른 컨트롤이 여전히 볼 수있는 유리의 더러운 통처럼 행동해야합니다. 따라서 계속해서 페인트를 계속합니다. 이것이 가능한가?

나는 좋은 사냥을하고 나 자신을 몇 가지 기법을 시도했지만 지금까지 성공하지 못했습니다. 그것이 가능하지 않다면, 그것을하는 또 다른 방법은 무엇입니까?

참조 : http://www.useit.com/alertbox/application-design.html (의미하는 바를 설명하기위한 스크린 샷은 라이트 박스 섹션 아래에 있습니다.)


.NET / C #에서이 작업을 수행 할 수 있습니까?

그렇습니다.하지만 약간의 노력이 필요합니다. 다음 방법을 권장합니다. 테두리 또는 제목 표시 줄 영역이없는 최상위 Form을 만든 다음 TransparencyKey 및 BackColor를 동일한 값으로 설정하여 클라이언트 영역 배경을 그리지 않도록합니다. 그래서 이제는 아무것도 그리지 않는 창문이 있습니다.

public class DarkenArea : Form
{
    public DarkenArea()
    {
        FormBorderStyle = FormBorderStyle.None;
        SizeGripStyle = SizeGripStyle.Hide;
        StartPosition = FormStartPosition.Manual;
        MaximizeBox = false;
        MinimizeBox = false;
        ShowInTaskbar = false;
        BackColor = Color.Magenta;
        TransparencyKey = Color.Magenta;
        Opacity = 0.5f;
    }
}

폼의 클라이언트 영역 위에이 DarkenArea 창을 만들고 배치하십시오. 그런 다음 초점을 맞추지 않고 창을 표시 할 수 있어야하므로 플랫폼을 사용하지 않고도 다음과 같은 방식으로 호출해야합니다.

public void ShowWithoutActivate()
{
    // Show the window without activating it (i.e. do not take focus)
    PlatformInvoke.ShowWindow(this.Handle, (short)SW_SHOWNOACTIVATE);
}

실제로 무언가를 그려야하지만 강조 표시하려는 컨트롤 영역에서 드로잉을 제외해야합니다. 따라서 OnPaint 핸들러를 재정 의하여 검정 / 파랑 또는 원하는대로 그려야하지만 밝은 상태로 유지하려는 영역을 제외하십시오.

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    // Do your painting here be exclude the area you want to be brighter
}

마지막으로 WndProc을 재정 의하여 마우스가 어두운 영역을 클릭하는 것처럼 미친 듯이 시도하는 경우 마우스가 창과 상호 작용하지 못하도록해야합니다. 이 같은...

protected override void WndProc(ref Message m)
{
    if (m.Msg == (int)WM_NCHITTEST)
        m.Result = (IntPtr)HTTRANSPARENT;
    else
        base.WndProc(ref m);
}

원하는 효과를 얻으려면 충분해야합니다. 효과를 되돌릴 준비가되면 DarkenArea 인스턴스를 처분하고 계속 수행합니다.


모든 양식에는 "불투명도"속성이 있습니다. 50 % (또는 코드에서 0.5)로 설정하면 반투명하게됩니다. 테두리를 제거하고 초점을두고 싶은 양식 앞에 최대로 표시하십시오. 양식의 BackColor를 변경하거나 다른 효과를 위해 배경 이미지를 설정할 수도 있습니다.


이것은 정말 멋진 아이디어입니다. 아마도 사용하게 될 것입니다. 감사합니다. 어쨌든, 내 솔루션은 정말 간단합니다 ... 현재 50 % 불투명 한 양식을 열고 현재 사용자 정의 색을 채우기 위해 강조 표시 할 컨트롤의 경계와 일치하는 사각형을 사용하여 해당 양식의 배경 이미지를 그립니다. 투명성 키.

나의 거친 견본에서는, 나는이 모양을 'LBform'이라고 불렀고 그것의 고기는 이것이다.

public Rectangle ControlBounds { get; set; }
private void LBform_Load(object sender, EventArgs e)
{
    Bitmap background = new Bitmap(this.Width, this.Height);
    Graphics g = Graphics.FromImage(background);
    g.FillRectangle(Brushes.Fuchsia, this.ControlBounds);

    g.Flush();

    this.BackgroundImage = background;
    this.Invalidate();
}

Color.Fuchia는이 반투명 양식의 TransparencyKey이므로, 그려진 사각형을 볼 수 있고 기본 폼의 경계 내에서 상호 작용할 수 있습니다.

이것을 시험해보기위한 실험 프로젝트에서 폼에 동적으로 추가 된 UserControl을 사용했지만 폼에 이미있는 컨트롤을 쉽게 사용할 수 있습니다. 기본 폼 (모호한 폼)에서 관련 코드를 버튼 클릭에 넣습니다.

private void button1_Click(object sender, EventArgs e)
{
    // setup user control:
    UserControl1 uc1 = new UserControl1();
    uc1.Left = (this.Width - uc1.Width) / 2;
    uc1.Top = (this.Height - uc1.Height) / 2;
    this.Controls.Add(uc1);
    uc1.BringToFront();

    // load the lightbox form:
    LBform lbform = new LBform();
    lbform.SetBounds(this.Left + 8, this.Top + 30, this.ClientRectangle.Width, this.ClientRectangle.Height);
    lbform.ControlBounds = uc1.Bounds;

    lbform.Owner = this;
    lbform.Show();
}

원하는 경우 자신 만의 방식으로 수행 할 수있는 기본적인 작업이지만, 사용자 정의 컨트롤을 추가 한 다음 기본 폼 위에 라이트 박스 폼을 설정하고 바운드 프로퍼티를 설정하여 올바른 위치에 완전한 투명도를 렌더링하십시오. Lightbox 폼과 UserControl을 드래그 앤 클로즈하는 것과 같은 것들은 빠른 샘플에서 처리되지 않습니다. 오, 그래픽스 인스턴스를 처리하는 것을 잊지 마라. 나는 그 것을 버렸다. (늦었 어, 나는 정말로 피곤하다.)

여기 내 20 분짜리 데모가 있습니다.


양식 자체에는 Opacity 가있어 완벽 할 수 있지만 개별 컨트롤의 대부분은 그렇게 생각하지 않습니다. 당신은 그것을 소유자에게 그려야 할 것입니다.







user-interface