2014-12-17 3 views
0

최신 프로젝트 중 하나 인 .Net 컨트롤을 찾고 있습니다.섬네일 체크 박스

본질적으로 미리보기 이미지 확인란이나 이미지 확인란이 필요합니다.

사실 내 창문의이 스크린 샷은 내가 원하는 것을 정확하게 보여줍니다.

Thumbnail CheckBox

는 아무도 내가이 기능 어딘가에 다운로드 할 수있는 컨트롤을 알고 있나요? 그렇지 않다면 사용자 지정 컨트롤을 만들 수 있지만 훨씬 더 복잡하고 고통 스럽습니다. 내가해야만한다면 그것을 할거야,하지만 나도 그걸 시작하는 데 어려움을 겪을거야.

감사합니다.

편집 : 이것은 WPF 응용 프로그램 용입니다. 일명 Xaml.

+1

PictureBox 및 CheckBox가있는 usercontrol이 필요합니다. 너무 열심히하지 마십시오 – dotctor

+0

완성 된 솔루션을 패딩과 그림자로 보았습니다! – TaW

답변

4

당신이 믿기를 바란다 : 당신이 필요로하는 것은 단 하나의 일반, CheckBox!

BackgroundImage에는 Zoom의 기능이 있으며 몇 줄이면 멋진 느낌으로 포주 수 있습니다. 첫 번째 행은 원래 방법입니다. 이미지는 패딩하고 그림자가 : 두 번째 행에서 당신은 hoverImage 기능의 효과를 볼 수 있습니다

여기 enter image description here

그것을 만들 수있는 기능입니다 :

CheckBox imageCheckBox(Image img, Size size, string name) 
{ 
    CheckBox cbx = new CheckBox(); 

    cbx.AutoSize = false; 
    cbx.Text = ""; 
    cbx.CheckAlign = ContentAlignment.TopLeft; 
    cbx.BackgroundImageLayout = ImageLayout.Zoom; 
    cbx.Size = size; 
    cbx.BackgroundImage = img; 
    cbx.Name = name; 
    cbx.Padding = new System.Windows.Forms.Padding(3, 3, 0, 0); 
    cbx.BackColor = SystemColors.Control; 

    cbx.CheckedChanged += (s, e) => 
    { 
     cbx.BackColor = cbx.Checked ? SystemColors.Control : SystemColors.Window; 
    }; 

    cbx.MouseEnter += (s, e) => 
    { 
     cbx.BackColor = cbx.Checked ? SystemColors.GradientActiveCaption :  
            SystemColors.GradientInactiveCaption; 
    }; 

    cbx.MouseLeave += (s, e) => 
    { 
     cbx.BackColor = cbx.Checked ? SystemColors.Control : SystemColors.Window; 
    }; 

    cbx.Paint += (s, e) => 
    { 
     if (cbx.ClientRectangle.Contains(cbx.PointToClient(Cursor.Position)) 
     || cbx.Checked)) 
     e.Graphics.DrawRectangle(Pens.DarkGray, 0, 0,cbx.Width-1,cbx.Height-1); 
    }; 

    return cbx; 
} 

것은 추가 프로젝트에 FlowLayoutPanel과 같이 호출 :

size = new Size(200, 80); 
flowLayoutPanel1.Controls.Add(imageCheckBox(yourImage1, size, "checkBox1")); 
flowLayoutPanel1.Controls.Add(imageCheckBox(yourImage2, size, "checkBox2")); 
flowLayoutPanel1.Controls.Add(imageCheckBox(yourImage3, size, "checkBox3")); 

당신이 나중에 액세서하는 방법에 따라 보존 할 수 있습니다 CheckBoxes에 대한 참조가 Dictionary 일 때 FLP에 추가하기 전에 Name에 액세스해야합니다.

은 내가 CheckedChanged, MouseEnterMouseLeave 이벤트를 코딩에 의해 결과가 이미 꽤 좋은 .. 조건부 Paint 이벤트에

을 테두리를 추가하여 약간의 스타일을 추가했습니다. 패딩을 해내하고 세련된 그림자가이 기능을 사용할 수 있습니다

// cbx.BackgroundImage = img; 
    cbx.BackgroundImage = hoverImage(img, size,new Padding(10, 10, 10, 10)) ; 

우리가 새로운 비트 맵을 ceating대로와 함께 삭제 된 이벤트를 추가하십시오 imageCheckBox 코드

Bitmap hoverImage(Image img, Size size, Padding pad) 
{ 
    Bitmap bmp = new Bitmap(size.Width, size.Height); 
    // client rectangle 
    Rectangle cRect = new Rectangle(pad.Left, pad.Top, 
     size.Width - pad.Left - pad.Right, size.Height - pad.Top - pad.Bottom); 
    // image proportion 
    float fi = 1f * img.Width/img.Height; 
    // target size 
    int nw = fi >= 1 ? cRect.Width : (int)(1f * cRect.Width/fi); 
    int nh = (int)(1f * nw/fi); 
    if (nh > cRect.Height) 
    { 
     nh = cRect.Height; 
     nw = (int)(1f * nh * fi); 
    } 
    Size nSize = new Size(nw, nh); 
    Point dPoint = new Point(pad.Left + (cRect.Width - nw)/2, 
          pad.Top + (cRect.Height - nh)/2); 

    using (Graphics G = Graphics.FromImage(bmp)) 
    { 
     Rectangle dRect = new Rectangle(dPoint, nSize); 
     Rectangle sRect = new Rectangle(Point.Empty, img.Size); 
     Rectangle shRect = new Rectangle(dRect.X - 3, dRect.Y - 3, 
             dRect.Width + 8, dRect.Height + 8); 
     for (int i = 0; i < 6; i++) 
     { 
      using (Pen pen = new Pen(Color.FromArgb(i * 15, Color.Black))) 
        G.DrawRectangle(pen, shRect); 
      shRect.Inflate(-1, -1); 
     } 
     G.DrawImage(img, dRect, sRect, GraphicsUnit.Pixel); 
    } 
    return bmp; 
} 

변경이 다른 이벤트는 GDI 리소스를 정리합니다.

cbx.Disposed += (s, e) => { 
    if (cbx.BackgroundImage != null) cbx.BackgroundImage.Dispose(); }; 
+0

이것은 놀랍습니다! 고맙습니다! 나는 그것에서 사용자 정의 컨트롤을 만들거야 그리고 내가 끝나면 게시 할 것입니다! 감사!!! – imdandman

+0

글쎄, 중요한 정보를 빠뜨린 것 같습니다.이 컨트롤은 WPF 앱용입니다.확실히 내 잘못은 내가 태그를 붙이지 않았거나 지정하지 않았지만, 일단 코드를 가지고 시작하자마자 그 문제는 아주 분명 해졌다. 그럼에도 불구하고 WPF 환경에서 수정할 수 없는지 알 수 있습니다. 당신은 저에게 큰 머리를 줬습니다. – imdandman

+0

아야! WPF의 경우 가장 좋은 솔루션은 __totally different__ 될 것이라고 기대합니다! 그림자 같은 것들은 오히려 쉽게 왔고 대부분의 컨트롤은 다양한 구성 요소를 결합하여 만들어졌습니다. 그래서 내 코드가 실제로 많이 사용될 것입니다. 질문이 닫히면 WPF 대답을 얻지 못할 것입니다. 어쩌면 새로운 질문을 게시해야합니다. 다시 닫히지 않으려면 먼저 코드를 작성하고 질문에 결과를 게시해야합니다. 분명히 기성품 컨트롤이 필요하지 않을 것입니다. 그것에 대해 묻는 것은 주제가 아닌 도구 나 라이브러리를 요구하는 것으로 보입니다. – TaW