C# listbox에 아이템을 추가할때마다 해당 아이템의 배경 색 바꾸기

image
위에서 단축기 c를 누를때마다 마우스를 대고 있는 곳의 색깔을 리스트박스에 아이템을 추가해서 Hexcode를 나타내도록 해놓았는데 추가할때마다 해당 아이템의 배경 색을 저 hexcode에 맞춰서 바꾸고 싶은데 어떻게 바꾸나요??

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Color_Picker
{
    public partial class mainForm : Form
    {
        public mainForm()
        {
            InitializeComponent();
            screen_timer.Enabled = true;
            Load += mainForm_Load; 
            FormClosing += mainForm_FormClosing; 
            KeyDown += mainForm_KeyDown;

        }

        private void screen_timer_Tick(object sender, EventArgs e)
        {
            Size size = new Size(screen.Width, screen.Height);

            Bitmap bitmap = new Bitmap((int)(size.Width), (int)(size.Height));
            Graphics graphics = Graphics.FromImage(bitmap);

            graphics.CopyFromScreen(MousePosition.X -50, MousePosition.Y - 50, 0, 0, size, CopyPixelOperation.SourceCopy);

            screen.Image = bitmap;
            xPosition.Text = "X: " + MousePosition.X.ToString();
            yPosition.Text = "Y: " + MousePosition.Y.ToString();
        }

        private void screen_Paint(object sender, PaintEventArgs e)
        {
            var g = e.Graphics;

            g.DrawLine(Pens.Red, 50, 100, 50, 0);
            g.DrawLine(Pens.Red, -50, 50, 100, 50);
            g.DrawLine(Pens.Red, 0, 0, 100, 0);
            g.DrawLine(Pens.Red, 0, 0, 0, 100);
            g.DrawLine(Pens.Red, 0, 99, 99, 99);
            g.DrawLine(Pens.Red, 99, 0, 99, 99);
        }

        private void screen_color_Paint(object sender, PaintEventArgs e)
        {
            var g = e.Graphics;

            g.DrawLine(Pens.Red, 0, 0, 100, 0);
            g.DrawLine(Pens.Red, 0, 0, 0, 100);
            g.DrawLine(Pens.Red, 0, 49, 99, 49);
            g.DrawLine(Pens.Red, 99, 0, 99, 99);
        }

        private delegate void SetColorDelegate(int x, int y, Color color);
        private Thread thread;

        private void mainForm_Load(object sender, EventArgs e)
        {
            this.thread = new Thread(new ThreadStart(ProcessThread)); 
            this.thread.Start();
        }

        private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (this.thread != null && this.thread.IsAlive) 
            { 
                this.thread.Abort(); 
            }
        }

        private Color GetMousePointColor(Point mousePoint) 
        { 
            Size size = new Size(1, 1); 
            Bitmap bitmap = new Bitmap(1, 1); 
            Graphics graphics = Graphics.FromImage(bitmap); 
            graphics.CopyFromScreen(mousePoint.X, mousePoint.Y, 0, 0, size); 
            return bitmap.GetPixel(0, 0); 
        }

        private string GetHexadecimalString(int value) 
        { 
            byte[] byteArray = BitConverter.GetBytes(value); 
            int byteArrayLength = byteArray.Length; 
            StringBuilder stringBuilder = new StringBuilder(); 
            for (int i = 0; i < byteArrayLength; i++) 
            { 
                stringBuilder.Append(byteArray[i].ToString("X2")); 
            } 
            return stringBuilder.ToString(); 
        }

        private void SetColor(int x, int y, Color color) 
        { 
            if (InvokeRequired) 
            { 
                SetColorDelegate setColorDelegate = new SetColorDelegate(SetColor); 
                Invoke(setColorDelegate, x, y, color); 
            } 
            else 
            { 
                this.rgb_R.Text = "R: " + color.R.ToString(); 
                this.rgb_G.Text = "G: " + color.G.ToString(); 
                this.rgb_B.Text = "B: " + color.B.ToString(); 
                this.screen_color.BackColor = color; 
                this.hexcode.Text ="#" + GetHexadecimalString(color.R).Substring(0, 2) + GetHexadecimalString(color.G).Substring(0, 2) + GetHexadecimalString(color.B).Substring(0, 2); 
            }
        }



        private void ProcessThread() 
        { 
            while (true) 
            { 
                Point mousePoint = Control.MousePosition; 
                int x = mousePoint.X; 
                int y = mousePoint.Y; 
                Color color = GetMousePointColor(mousePoint); 
                SetColor(x, y, color); 
            } 
        }

        private void mainForm_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.C)
            {
                color_list.Items.Add(hexcode.Text);
            }
        }

        private void 화면모드ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if(화면모드ToolStripMenuItem.Checked == false)
            {
                화면모드ToolStripMenuItem.Checked = true;
                this.BackColor = Color.FromArgb(50, 50, 50);
                menuBar.BackColor = Color.FromArgb(50, 50, 50);
                옵션ToolStripMenuItem.ForeColor = Color.White;
                색목록ToolStripMenuItem.ForeColor = Color.White;
                도움말ToolStripMenuItem.ForeColor = Color.White;
                rgb_R.ForeColor = Color.White;
                rgb_B.ForeColor = Color.White;
                rgb_G.ForeColor = Color.White;
                hexcode.ForeColor = Color.White;
                xPosition.ForeColor = Color.White;
                yPosition.ForeColor = Color.White;
            }
            else
            {
                화면모드ToolStripMenuItem.Checked = false;
                this.BackColor = Color.White;
                menuBar.BackColor = Color.FromArgb(240, 240, 240);
                옵션ToolStripMenuItem.ForeColor = Color.Black;
                색목록ToolStripMenuItem.ForeColor = Color.Black;
                도움말ToolStripMenuItem.ForeColor = Color.Black;
                rgb_R.ForeColor = Color.Black;
                rgb_B.ForeColor = Color.Black;
                rgb_G.ForeColor = Color.Black;
                hexcode.ForeColor = Color.Black;
                xPosition.ForeColor = Color.Black;
                yPosition.ForeColor = Color.Black;
            }
        }
    }
}

1개의 좋아요

@gloomn 님. 답변을 드릴 수 있는데 그러면 마치 물고기를 잡아 드리는 샘이라…

혹시 컴퓨팅 사고라고 들어보셨어요? 프로그래머는 코딩으로 원하는 결과를 만드는 자 이지만 경험에 의해서 형성되는 능력은 사고력과 밀접한 관련이 있어서 어떤 사고력이 필요한지, 그리고 그 사고력을 어떻게 구축하는지도 관심을 기울이면 도움이 많이 됩니다.

보통 다음의 과정으로 풀어야 하는 문제를 정복할 수 있는데요,

문제정의 → 자료조사(대상을 이해) → 분해(상세 분석) → 취합(문제 해결) → 변환(코딩) → 테스트(확인)

이 단계로 한번 @gloomn 님이 궁금해 하는 문제에 대해 접근해 봅시다.

문제 정의

윈폼에서 ListBox의 아이템 배경색을 지정

  • 윈폼 ListBox의 아이템 배경색을 지정하는 방법은?
    • 아이템 목록 (Items)의 유형은 ObjectCollection이므로 배경색을 지정할 수 없다.
  • 그렇다면 어떻게 배경색을 지정할 수 있을까?

자료조사

  • ListBox의 아이템 배경색을 지정하는 방법
  • 구글링 키워드 : windows forms ListBox Item Background
    ※ 구글링 키워드는 완전한 문장으로 구성할 필요는 없으며 단어의 조합으로 충분히 가능. 한글보다는 영어

자료조사에 의한 분해

  • 윈폼의 ListBox는 아이템의 배경색을 변경하는 속성이 없다.
  • 그러므로 직접 그려줘야 할 것 같은데… 관련된 오버라이드 메소드 또는 이벤트를 찾아보자 → 찾음
  • 코딩 (또는 검색에 의해서 샘플링한 코드를 실행)
  • 결과 확인

취합

  • 윈폼의 ListBox 목록 아이템의 배경색을 지정하기 위해서는 이벤트를 통해 그리기를 별도로 구현해야 한다.
  • 아이템을 특정 클래스로 정의해서 배경색을 속성으로 쉽게 지정할 수 있도록 하자.

변환

  • 코딩 구현…

테스트

  • 정상적으로 실행되는지. 정상 실행되었을 때 다양한 케이스로 다시 한번 확인
    ※ 테스트를 통해 내가 경험했던 과정의 문제 풀이에 대한 전제조건, 풀이 일반화를 체계적으로 정리 함

^^;

12개의 좋아요

감사합니다 제가 고딩이라 코딩할 시간이 얼마 없어서 그냥 무작정 애플리케이션만 빨리 만드려고 했네요… 컴퓨팅 사고 꼭 기억하도록 하겠습니다!

4개의 좋아요