안녕하세요~ 윈폼 질문드립니다.
listView.CheckBoxes = true 해서 체크박스를 나오게했는데
이 체크박스 사이즈를 조절할수는 없나요?? 제가 못찾는건지
어디서 컨트롤을할수있는지 알수가없네요…
1 Like
Windows Forms 리스트 뷰의 경우에는 WPF와 달리 체크박스 부분을 커스터마이징하기 위해 그리기 코드를 직접 손을 대서 수정하셔야 합니다.
이 스레드의 내용이 도움이 되실겁니다.
2 Likes
실마리를 찾앗는데 쉽진 않네요…
헤더까지는 된거같은데
아이템쪽이 문제네요…
1 Like
아이템쪽도 마찬가지로 ‘직접’ 그리셔야 합니다.,ㅎㅎ
갑자기 기억이 나서 대략 13년 전쯤 윈폼으로 C#공부를 했었을때 소스코드를 뒤져서 찾아봤는데
데이터그리드뷰 셀 페인팅 처리 했던 코드가 있길래 도움이 되실지 모르겠지만 한번 공유 드려 봅니다.
(아무것도 모르고 혼자서 끄적 했던 시절이라 맴버필드를 전역변수라고 주석으로 써놓기도 했었네요)
/// <summary>
/// Paint메소드 오버라이드 DataGridViewImageCell클래스를 상속받는 클래스
/// </summary>
public class ImageTextCell : DataGridViewImageCell
{
#region 전역 필드들
private string _text;
#endregion
public ImageTextCell()
{
base.ImageLayout = DataGridViewImageCellLayout.Stretch;
}
public string Text
{
get { return _text; }
set { _text = value; }
}
protected override void OnClick(DataGridViewCellEventArgs e)
{
base.OnClick(e);
// 요기서 셀 클릭시 Checked / Uncheck 이미지를 번갈아 가며 바꿀 수 있습니다.
}
protected override void Paint(Graphics graphics, Rectangle clipBounds,
Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState,
object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle,
DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
{
// 설명글 출력 부분 마지막의 cellBounds.X, cellBounds.Y로 텍스트의 위치를 잡습니다.
if ( !value.Equals( base.DefaultNewRowValue ) )
graphics.DrawString(Text, Control.DefaultFont, Brushes.Blue, cellBounds.X, cellBounds.Y);
base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value,
formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
}
}
구현된 ImageTextCell은 DataGridViewColumn 으로 사용 할 수 있습니다.
DataGridViewColumn CustomCol = new DataGridViewColumn( new ImageTextCell() );
위에 예시 코드에서는 이미지와 함께 표시되는 문구 Text를 속성으로 받아 사용하는데
체크박스 역할로 Checked이미지와 Unchecked 이미지 두개를 받아서 OnClick 시 상황에 맞게 번갈아 가면서 그려주면 될 것 같습니다.
3 Likes
private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
TextFormatFlags flags = TextFormatFlags.LeftAndRightPadding;
e.DrawBackground();
var b = e.Bounds;
var state = clicked ? CheckBoxState.CheckedNormal : CheckBoxState.UncheckedNormal;
Size glyphSize = CheckBoxRenderer.GetGlyphSize(e.Graphics, state);
int checkPad = (b.Height - glyphSize.Height) / 2;
var pt = new Point(b.X + 2, b.Y + 2);
Rectangle rect = new Rectangle(pt, new Size(18, 18));
e.Graphics.DrawRectangle(Pens.Green, rect);//This is for Checkbox rectangle
if (state == CheckBoxState.CheckedNormal)
{
using (SolidBrush brush = new SolidBrush(ForeColor))
using (Font wing = new Font("Wingdings", 17f, FontStyle.Bold))
e.Graphics.DrawString("ü", wing, brush, pt.X - 4, pt.Y - 1); //This is For tick mark
}
e.DrawText(flags);
}
이렇게 해서
여기 까지 진행이됬습니다…
기존에 있는 체크 박스를 어떻게 가려야할까요…