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
:

사용자 삽입 이미지

CDialog 베이스에 CStatic, CListBox를 사용해서 만들어 봤습니다.
마우스 휠을 사용하면 화면을 아래 위로 움직일 수 있습니다.
마우스로 타이틀을 더블클릭 하면 내용을 숨기고 보이게 할 수 있습니다.

[개선사항]
마우스로 휠을 사용할때 이동 폭을 지정해 주어야 할듯 하다.
타이틀 더블클릭으로 숨기기 모드가 되면 아래의 내용이 자동으로 올라 와야 한다.

관련 파일 :

Posted by gsi
:

CStatic를 상속해서 다른 컨트롤을 처리 할때 SS_NOTIFY 를 사용하면 마우스 이벤트를 받을 수 있다. 하지만 WM_MOUSEWHEEL 위쟈드에서 선택해서 함수 생성하면 신호가 들어오지 않는다. 하지만 PreTranslateMessage() 쪽에는 메시지가 들어 는거 같다.

BOOL CBarContainer::PreTranslateMessage(MSG* pMsg)
{
 if(pMsg->message == WM_MOUSEWHEEL)
 {
   // 처리하기
 }

 return CStatic::PreTranslateMessage(pMsg);
}

Posted by gsi
:

사용자 삽입 이미지

Canvas에 사용자 정의 객체를 바인딩 해서 적용해 본 결과.

관련 코드 :
Posted by gsi
: