GSI

사용자 컨트롤 배경 투명색으로 처리 하기

이 부분은 뒷 배경을 투명으로 바꾸기는 하지만 Flicker 처리가 되지 않아서
이동시 잔상이 생기게 되네요.

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace transcontroldemo
{
 /// <summary>
 /// Summary description for TransPanel.
 /// </summary>
 public class TransPanel : Panel
 {
  public TransPanel()
  {
   //
   // TODO: Add constructor logic here
   //
  }

  protected override CreateParams CreateParams
  {
   get
   {
    CreateParams cp = base.CreateParams;
    cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
    return cp;
   }
  }

  protected void InvalidateEx()
  {
   if (Parent == null)
    return;

   Rectangle rc = new Rectangle(this.Location, this.Size);
   Parent.Invalidate(rc, true);
  }

  protected override void OnPaintBackground(PaintEventArgs pevent)
  {
   //do not allow the background to be painted
  }

  protected override void OnResize(EventArgs eventargs)
  {
   this.InvalidateEx();
  }

  Random r = new Random();
  protected override void OnPaint(PaintEventArgs e)
  {
   int h = this.Height / 2;
   int w = this.Width;

   Pen p = new Pen(Color.White, 2);
   e.Graphics.DrawLine( p,  0,h, w, 0);
   p.Dispose();
  }
 }
}


Posted by gsi
:

커스텀 컨트롤 EventHandler 등록하기

사용자 컨트롤을 추가한 후에 EventHandler 를 추가하고 나면 Form에 추가한 컨트롤에서
사용자가 입력한 변수 및 이벤트를 처리할 수 있습니다.
바로 아래 코드는 이벤트 핸들러 처리 코드 입니다.

private string prefix = "";
public event EventHandler PrefixChanged;

public string Prefix
{
    get { return this.prefix; }
    set {
        this.prefix = value;
   
        //PrefixChanged 이벤트를 발생시킨다.
        if (this.PrefixChanged != null)
        {
            PrefixChanged(this, EventArgs.Empty);
        }
        this.Invalidate();
    }
}

Posted by gsi
:

Drag a Panel

하나의 패널 속에 여러개의 패널을 삽입이 가능하다.
이걸 가지고 패널 속에 Visio 와 같은 에디팅 화면을 구현할 수 있을거 같다.
물론 Panel이 아닌 ScrollView 등 다양한 뷰에도 구현이 가능해 진다.

특정 이벤트에 따라서 Panel에 여러개의 Panel 자식 컨트롤을 추가 한 후에
자식 Panel의 이벤트를 사용해서 각각의 패널을 동작시킬 수 있다.

우선 이벤트에 따른 자식 Panel로 등록하는 코드 이다.

private void button2_Click(object sender, EventArgs e)
{
    Panel childPanel = new Panel();
    childPanel.BackColor = System.Drawing.Color.Gainsboro;
    childPanel.Location = new System.Drawing.Point(67, 44);
    childPanel.Name = "panel4";
    childPanel.Size = new System.Drawing.Size(71, 78);
    childPanel.MouseDown += new MouseEventHandler(childPanel_MouseDown);
    childPanel.MouseMove += new MouseEventHandler(childPanel_MouseMove);
    childPanel.MouseUp += new MouseEventHandler(childPanel_MouseUp);
    panel2.Controls.Add(childPanel);
}
- 여러개의 패널이 등록 되지만 이벤트를 처리 하는 함수는 동일하게 가져 가게 되면
  공통적으로 Panel을 처리할 수 있다. (childPanel_MouseDown, Move, Up)

이제 Drag a Panel을 구현하기 위한 코드이다.

private bool dragging = false;
private Point offset;

void childPanel_MouseDown(object sender, MouseEventArgs e)
{
    dragging = true;
    offset = new Point(e.X, e.Y);
}

void childPanel_MouseMove(object sender, MouseEventArgs e)
{
    if (dragging)
    {
        Panel selPanel = (Panel)sender;
        selPanel.Left = e.X + selPanel.Left - offset.X;
        selPanel.Top = e.Y + selPanel.Top - offset.Y;
    }
}

void childPanel_MouseUp(object sender, MouseEventArgs e)
{
    dragging = false;
}

- 전역 변수로 dragging, offset를 선언해 놓는다.
- Down 일때 드래그가 시작되었다고 알리고, 현재 위치를 저장한다.
- Move 일때 드래그라면 현재 선택된 패널 정보를 가져와서 Left, Top를 설정한다.
- Up 일때 드래그가 끝났다고 알린다.

드래그 이벤트는 다양한 컨트롤에서 사용되어 지며, 사용자의 입력을 받아서
처리 되는 다양한 효과를 구현할 수 있다.

관련 MSDN 주소 : http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=689097&SiteID=1

Posted by gsi
:

[C#] - IO 관련 자료

C# 2008. 3. 3. 00:05 |

(펌) - http://blog.naver.com/hahnes2?Redirect=Log&logNo=40023072069

System.IO.BinaryReader

System.IO.BinaryWriter

System.IO.BufferdStream

System.IO.Directory

System.IO.DirectoryInfo

System.IO.DirectoryNotFoundException

System.IO.EndOfStreamException

System.IO.ErrorEventArgs

System.IO.File

System.IO.FileInfo

System.IO.FileLoadException

System.IO.FileNotFoundException

System.IO.FileStream

System.IO.FileSystemEventArgs

System.IO.FileSystemInfo

System.IO.FileSystemWatcher

System.IO.InternalBufferOverflowException

System.IO.IODescriptionAttribute

System.IO.IOException

System.IO.IsolatedStorage.IsolatedStorage

System.IO.IsolatedStorage.IsolatedStorageException

System.IO.IsolatedStorage.IsolatedStorageFile

System.IO.IsolatedStorage.IsolatedStorageFileStream

System.IO.MemoryStream

System.IO.Path

System.IO.PathTooLongException

System.IO.RenamedEventArgs

System.IO.Stream

System.IO.StreamReader

System.IO.StreamWriter

System.IO.StringReader

System.IO.StringWriter

System.IO.TextReader

System.IO.TextWriter

관련 내용을 아주 자세하게 작성해 주셨네요.
감사^^

Posted by gsi
:

웹의 경로에 위치한 이미지를 가져오는 모듈입니다.
원래 이미지 사이즈를 구하기 위해서 사용했던건데요.
파일 다운로드 쪽으로 활용해도 가능성이 있을듯 하네요.

try
{
    byte[] data = new System.Net.WebClient().DownloadData(url);
    System.IO.MemoryStream ms = new System.IO.MemoryStream(data);
    Image img = Image.FromStream(ms);

    Size size = new Size(img.Width, img.Height);
    return size;
}
catch(Exception ex)
{
    return new Size(-1, -1);
}

msdn 주소 : http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=637975&SiteId=1
키워드 : Image Url

Posted by gsi
:

.Net WinForm DragAndDrop

C# 2008. 1. 7. 18:25 |

.Net WinForm에서 작업을 하다 보면 MFC의 확장성과는 비교도 되지 않을 만큼 좋은 컨트롤들로 무장되어 있는거 같다. 아직까지 다양한 확장 기능을 사용하고 .Net 의 좋은 기능들에 대해서 많이 모르지만 어느정도 선까지는 MFC의 생산성과는 비교가 안되는거 같다.

오늘 ListView 두개를 사용해서 드래그앤 드롭을 처리해 봤다.
참 쉽다고 느껴 진다.
코드 내용을 우선 정리해 볼려고 한다.

드래그 앤 드롭에는 몇가지 용어가 나오게 된다.

1. 소스(Source)
2. 타깃(Target)
3. 드롭 소스, 드롭 타깃

더 있지만. 큰 주제를 놓고 본다면 이것이 있을 것이다.

여기서 말을 풀어 보면 아래와 같을 것이다.
에플리케이션에서 드래그 앤 드롭(drag and drop) 기능을 추가 하려면 드롭 타깃(drop target)과 드롭 소스(drop source)를 고려 해야 한다. 우선, "무언가를 끌어다(drag) 놓을(drop)컨트롤" 이 하나 있어야 한다. 이런 종류의 컨트롤을 드롭 타깃(drop target)이라고 한다. 컨트롤의 AllowDrop 속성을 true로 설정하면 해당 컨트롤을 드롭 타깃으로 만들 수 있다.

작업 순서를 보겠다.
1. 두개의 ListView를 추가
2. 타깃이 될 ListView에 AllowDrop를 true로 설정
3. 소스 ListView에 MouseDown() 이벤트 등록
4. 타깃 ListView에 DragDrop(), DragEnter() 이벤트 등록
5. 코드 작성
6. 테스트

//
private void listView1_MouseDown(object sender, MouseEventArgs e)
{
    try
    {
        // 전달할 객체를 난 구조체를 사용하였다.
        EffectInfo ef = new EffectInfo();

        // 멀티 선택이 될수 있기 때문에 collection 객체로 받도록 한다.
        ListView.SelectedListViewItemCollection breakfast = this.listView1.SelectedItems;

        // 하나만 사용하기 위해서 개수를 검사 하고 throw로 던진다.
        if (breakfast.Count != 1)
            throw new Exception("멀티 선택 되었네요");

        // 내부에서 하나만 연결후에 DoDragDrop()를 호출한다.
        foreach (ListViewItem item in breakfast)
        {
            ef.imageidx = item.ImageIndex;
            ef.itemname = item.Text;
            // 드래그앤 드롭 시작.
            DoDragDrop(ef, DragDropEffects.Copy);
        }
    }
    catch (ArgumentException nullex)
    {
    }
    catch (Exception ex)
    {
    }
}

private void listView2_DragEnter(object sender, DragEventArgs e)
{
    // 타입을 검사 해서 커서 모양을 선택해 준다.
    if (e.Data.GetDataPresent(typeof(EffectInfo)))
        e.Effect = DragDropEffects.Copy;
    else
        e.Effect = DragDropEffects.None;
}

private void listView2_DragDrop(object sender, DragEventArgs e)
{
    // 드롭 했을때 값을 처리 한다.
    EffectInfo ef = (EffectInfo)e.Data.GetData(typeof(EffectInfo));
    ListViewItem listviewitem = new ListViewItem(ef.itemname, ef.imageidx);
    this.listView2.Items.Add(listviewitem);
}

Posted by gsi
:

사용자 삽입 이미지

이미지는 웹 iis 쪽에 있으며 그 이미지를 ImageList에 Form_Load() 시에 추가하고 Listview에 연결한 후에 item을 추가 한 코드 예제 입니다.

string[] filepathlist =
{
"http://localhost:8888/_01.gif",
"http://localhost:8888/_01.gif",
"http://localhost:8888/_02.gif",
"http://localhost:8888/_03.gif",
};

int count = 0; // Item 이름을 위한 임시 변수
foreach (string path in filepathlist)
{
    // WebClient 를 사용해서 원격 이미지를 로드 하고 Stream에 Write 한다.
    WebClient client = new WebClient();
    byte[] myDataBuffer = client.DownloadData(path);
    Stream stream = new MemoryStream();
    stream.Write(myDataBuffer, 0, myDataBuffer.Length);

    // Bitmap에 Stream을 입력 하고 ImageList에 등록한다.
    Bitmap bmp = new Bitmap(stream);
    this.imageList1.Images.Add(bmp);
    int idx = this.imageList1.Images.Keys.Count - 1;
    this.imageList1.Images.SetKeyName(idx, "");

    // ListViewItem에 값을 채우고 ListView에 추가 한다.
    ListViewItem listviewitem = new ListViewItem("test" + count.ToString(), idx);
    this.listView1.Items.Add(listviewitem);

    count++;
}

Posted by gsi
:

사용자 삽입 이미지
 
위와 같이 iis 쪽에 해당 이미지가 있다고 했을때 Winform 쪽에 PictureBox에 이미지를 Url 로 추가 하면 안되는거 같다.( 바로 적용이 가능한지 아시는분은 답변 부탁 ^^)
그래서 웹 브라우져 컨트롤을 써자니 좀 이상해서 PictureBox에 사용하기 위해서는 원격 주소에 있는 데이터를 클라이언트로 가져와야 하는걸 알았다.

이때 두가지 경우가 있는데 스트림, 파일 이 있다. 파일 보다는 스트림이 나을거 같아서 이것을 채택 했다.

그리고 위의 소스를 보면 아시겠지만 DB의 정보를 가져 와서 보여 주는 뷰어로 사용할려다 보니 DataSet와 연동을 하였다.

icon_img 정보를 가져 와서 iis의 주소에 맵핑 해서 해당 이미지를 보여 주도록 하였다.
그래서 바인딩 부분에서 몇가지 수정이 필요하다.

PictureBox에 바인딩이 있다고 가정한다.
Binding binding = icon_imgPictureBox.DataBindings["Image"];
binding.Format += new ConvertEventHandler(binding_Format);

위와 같이 Format 이벤트를 하나 생성한다.
그리고 아래와 같이 작성합니다.

void binding_Format(object sender, ConvertEventArgs e)
{
    if (e.Value != null)
    {
        try
        {
             //e.Value에 있는 값을 사용해서 파일 경로를 생성한다.
            string filepath = "http://local:8888/Icon/2000/" + e.Value + ".gif";
            // WebClient 객체를 생성해서 스트림을 가져 오도록 한다.
            WebClient client = new WebClient();
            byte[] myDataBuffer = client.DownloadData(filepath);
            // Stream 값을 가져 온다.
            Stream stream = new MemoryStream();
            stream.Write(myDataBuffer, 0, myDataBuffer.Length);
            // PictureBox에 스트림으로 로드 한다.
            this.icon_imgPictureBox.Image = Image.FromStream(stream, true);
        }
        catch (WebException webex)
        {
        }
    }
}

try, catch 를 사용한 이유는 e.Value 에 값이 파일 이름이 아닌 다른 정보가 들어 오는 경우가 있다. 그래서 catch로 넘기도록 해서 에러를 없애도록 한다.

Posted by gsi
:

// DataGridView 객체 얻어 오기
DataGridView dgv = sender as DataGridView;
if (dgv == null)
    return;

// 셀단위로 선택된 것이 있는지 찾는다. 하나도 없을때 리턴
if (dgv.SelectedCells.Count == 0)
    return;

// DB와 연결되어 있을때. DataSet의 테이블 정보를 가져온다.
DataTable dtItem = azitro_testDataSet.Tables[0];
// DataRow를 가져 오기 위해서 DataGridView의 선택된 셀정보를 가져와서
// RowIndex를 리턴해 준다.
// RowIndex의 값을 사용해서 DataRow를 구한다.
DataRow rwItem = dtItem.Rows[dgv.SelectedCells[0].RowIndex];

// Row의 셀 정보를 가져온다. (DB 내용)
string strCatenum = rwItem["cate_Num"].ToString();
string strCatedep = rwItem["cate_dep"].ToString();
string strCatesel = rwItem["cate_sel"].ToString();
string strsiImg = rwItem["icon_img"].ToString();

txtSelName.Text = rwItem["item_name"].ToString();
txtSelContents.Text = rwItem["item_contents"].ToString();

// DB에 있는 내용을 사용해서 폴더 경로를 구한다.
string filepath;
filepath = Application.StartupPath
    + "\\itemlist\\"
    + strCatenum + "\\"
    + strCatesel + "\\"
    + strsiImg + ".png";

// 파일이 존재 하는지 검사한다.
if (File.Exists(filepath))
{
    // 이미지를 연결하고 화면에 출력한다.
    picItemImage.Image = Image.FromFile(filepath);
}
else
{
    // 이미지가 없을때 null 처리
    picItemImage.Image = null;
}

Posted by gsi
:

사용자 삽입 이미지

여기서 알 수 있는 기술
1. TreeView에 DB의 정보를 입력하는 방법
2. Tree의 노드를 선택하면 좌측의 DataGridView의 Row를 제어
3. Detail Display
4. 옵션으로 좌측의 3개의 버튼으로 트리의 입력 방법을 몇개 예제로 구성해봤다.

이제 해야 될 건.. Drag & Drop

관련코드 :
Posted by gsi
:

[C#] TreeView 내용 추가하기

C# 2007. 12. 7. 08:34 |

사용자 삽입 이미지
입력 배열 :

        string[] parentString = { "son1", "son2", "son3", "son4" };
        string[] childString = { "byoung1", "byoung2", "byoung3" };

입력방법 #1

        private void button1_Click(object sender, EventArgs e)
        {
            treeView1.Nodes.Clear();
            treeView1.BeginUpdate();

            foreach (string str in parentString)
            {
                TreeNode tn = treeView1.Nodes.Add(str);

                foreach (string substr in childString)
                {
                    tn.Nodes.Add(substr);
                }
            }

            treeView1.EndUpdate();
        }

입력방법 #2

        private void button2_Click(object sender, EventArgs e)
        {
            treeView1.Nodes.Clear();
            treeView1.BeginUpdate();

            foreach (string str in parentString)
            {
                treeView1.Nodes.Add(str);
            }

            foreach (TreeNode tn in treeView1.Nodes)
            {
                foreach (string substr in childString)
                {
                    tn.Nodes.Add(substr);
                }
            }

            treeView1.EndUpdate();
        }

입력방법 #3

        private void button3_Click(object sender, EventArgs e)
        {
            treeView1.Nodes.Clear();
            treeView1.BeginUpdate();

            TreeNode tn = new TreeNode();
            foreach (string str in childString)
            {
                tn.Nodes.Add(str);
            }

            foreach (string str in parentString)
            {
                TreeNode tnParent = treeView1.Nodes.Add(str);
            }

            treeView1.EndUpdate();
        }

Posted by gsi
:

DataGridView dgv = ...
dgv 라고 객체를 생성 했다고 햇을때.

DataSet에서 값을 가져 오고,
현재 Row를 선택 했을때 SelectedIndex 같은 프로퍼티가 제공되지 않는거 같아요.
그래서 현재 구현한 방법은 아래와 같습니다.

자세한 코드 내용은 저도 잘 모르겠네요.
혹시 아시면 코멘트 부탁 드려요.

DataGridView dgv = sender as DataGridView;
//MessageBox.Show("선택한 Row=" + dgv.SelectedCells[0].RowIndex.ToString());

DataTable dtItem = azitro_testDataSet.Tables[0];
DataRow rwItem = dtItem.Rows[dgv.SelectedCells[0].RowIndex];


이상.
Posted by gsi
:

[C#] Graphics 객체 사용하기

C# 2007. 12. 5. 12:30 |

Graphics objGraphics = null;
objGraphics = this.CreateGraphics();
objGraphics.Clear(SystemColors.Control);
objGraphics.DrawRectangle(Pens.Blue,
    picShowPicture.Left - 1, picShowPicture.Top - 1,
    picShowPicture.Width + 1, picShowPicture.Height + 1);
objGraphics.Dispose();

> 사각형 테두리를 그린다.
Posted by gsi
:

[C#] Picture Viewer

C# 2007. 12. 5. 10:58 |

사용자 삽입 이미지
1. PictureBox를 추가 한다.
2. Select Picture 버튼을 추가 한다.
3. Quit 버튼을 추가한다.
4. OpenFileDialog 파일 오픈 상자를 위한 컨트롤을 추가 한다.

소스 코드 :

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnSelectPicture_Click(object sender, EventArgs e)
        {
            if (ofdSelectPicture.ShowDialog() == DialogResult.OK)
            {
                picShowPicture.Image = Image.FromFile(ofdSelectPicture.FileName);
                this.Text = string.Concat("Picture Viewer(" + ofdSelectPicture.FileName + ")");
            }
        }

        private void btnQuit_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }

Posted by gsi
:

Openfiledialog를 사용해서 파일을 가져와서 Stream의 정보를 Binary로 읽는 코드 입니다.

private void btnAzeSelect_Click(object sender, EventArgs e)
{
    Stream myStream = null;
    OpenFileDialog openFileDialog1 = new OpenFileDialog();

    openFileDialog1.InitialDirectory = "c:\\";
    openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
    openFileDialog1.FilterIndex = 2;
    openFileDialog1.RestoreDirectory = true;

    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        // 컨트롤에 이름 설정하기
        tbAzeName.Text = openFileDialog1.FileName;

        try
        {
            if ((myStream = openFileDialog1.OpenFile()) != null)
            {
                using (myStream)
                {
                    // 바이너리로 읽기 위해서 BinaryReader를 생성하고 myStream의
                    // 스트림 값을 넘겨 받는다.
                    BinaryReader r = new BinaryReader(myStream);
                    for (int i = 0; i < 5; i++)
                    {
                        Console.WriteLine(r.ReadInt32());
                    }
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
        }
    }
}

Posted by gsi
: