GSI

맨날 도구상자에 있는 컨트롤만 쓰고 있는 나로서는..
새로운 UI를 구상할때면.. 좀 난감해 지네요 ^^..

이번에는 ListBox를 확장해야할듯 해서

바로 위와 같이 하나의 아이템에 복합적인 데이터가 들어가있다고 가정을 하고 작업을 해야 됩니다.
이미지 정보와 해당 이름 또는 나이 저노하 번호 등등..
이걸 위해서는 DrawItem()을 따로 구현해 줘야 되네요.

사용자 삽입 이미지

우선 데이터를 집어 넣을때는
listBox1.Items.Add(new TestTemplate("손병욱", "d:\\a.bmp"));
이와 같이 하나의 데이터 템플릿 클래스를 제작하고 그기에 맞도록 해당 데이터를 추가 해야 됩니다.

그리고 DrawItem()을 가능하게 하기 위한 ListBox의 설정또한 잊지 말아야 하구요.. ^^

간단하게 DrawItem의 드로잉 하는 부분을 아래와 같이 처리 하면 되는군요.

   private void listBox1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
  {
   if(listBox1.Items.Count <= 0)
    return;

   // Set the DrawMode property to draw fixed sized items.
   listBox1.DrawMode = DrawMode.OwnerDrawVariable;
   // Draw the background of the ListBox control for each item.
   e.DrawBackground();

   // Create a new Brush and initialize to a Black colored brush by default.
   Brush myBrush = Brushes.Black;

   // Determine the color of the brush to draw each item based on the index of the item to draw.
   switch (e.Index)
   {
    case 0:
     myBrush = Brushes.Red;
     break;
    case 1:
     myBrush = Brushes.Orange;
     break;
    case 2:
     myBrush = Brushes.Purple;
     break;
   }

    // 이 부분에서 해당 값을 가져 올때 TestTemplate의 값으로 형변환 한 후에 값을 접근가능..
   TestTemplate tt = (TestTemplate)listBox1.Items[e.Index];

   // Draw the current item text based on the current Font and the custom brush settings.
   e.Graphics.DrawImage(new Bitmap(tt.path), e.Bounds);
   e.Graphics.DrawString(tt.name, e.Font, myBrush,e.Bounds,StringFormat.GenericDefault);
   // If the ListBox has focus, draw a focus rectangle around the selected item.
   e.DrawFocusRectangle();
  }

이때 이미지와 여러가지를 표현하기 위해서는 아래의 함수도 오버라이딩 해서 변경해줘야 하네요.

  private void listBox1_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
  {
   e.ItemHeight = 100;
  }

위의 내용을 토대로 샘플을 하나 만들어 볼까 합니다.

하지만 고려되어야 하는 사항은 이미지가 들어가기 때문에
많은 양의 데이터를 읽어 들일때 UI가 블락킹 되는 현상이 불현듯 보이네요..
백그라운드 쓰레드나 일반 쓰레드를 통해서 따로 돌려야 할듯 합니다.
그러면 조금더 나은 UI 및 컨트롤을 구현할 수 있을거 같습니다.

개봉박두~~~..
 

Posted by gsi
:

[C#] Round Rectangle 처리하기

C# 2008. 8. 21. 17:04 |

사용자 삽입 이미지

RoundPanel 클래스를 제작했습니다.
Panel을 상속해서 처리 했습니다.

Round 하는 코드는 아래의 코드를 참조 하시면 됩니다.       

        static public GraphicsPath GetRoundedRectPath(Rectangle rect, int radius)
        {
            int diameter = 2 * radius;
            Rectangle arcRect =
                new Rectangle(rect.Location, new Size(diameter, diameter));

            GraphicsPath path = new GraphicsPath();

            path.AddArc(arcRect, 180, 90);

            arcRect.X = rect.Right - diameter;
            path.AddArc(arcRect, 270, 90);

            arcRect.Y = rect.Bottom - diameter;
            path.AddArc(arcRect, 0, 90);

            arcRect.X = rect.Left;
            path.AddArc(arcRect, 90, 90);

            path.CloseFigure();

            return path;
        }

Panel 함수에서 드로잉 하는 코드 입니다.
       

        private void roundPanel_title_Paint(object sender, PaintEventArgs e)
        {
            RoundPanel panel = (RoundPanel)sender;

            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.HighQuality;

            int width = panel.ClientRectangle.Width;
            int height = panel.ClientRectangle.Height;

            Rectangle rect = new Rectangle(0, 0, width-1, height-1);
            using (GraphicsPath path = RoundPanel.GetRoundedRectPath(rect, 8))
            {
                using (Brush brush = new LinearGradientBrush(
                                            new Rectangle(0, 0, panel.ClientRectangle.Width, panel.ClientRectangle.Height),
                                            Color.FromArgb(panel.Opcity, 102, 102, 102),
                                            Color.FromArgb(panel.Opcity, 0, 0, 0),
                                            90.0f))
                {
                    //graphics.FillRectangle(brush, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height);
                    g.FillPath(brush, path);
                }

                //g.FillPath(Brushes.Yellow, path);
                Pen pen = new Pen(Color.FromArgb(panel.Opcity, 255, 255, 255));
                g.DrawPath(pen, path);
            }
        }

이걸 처리 하다 보면 화면을 전환 하거나 리프레쉬할때 플리커 현상이 생기기도 합니다.
이걸 해결하기 위해서 RoundPanel에 더블버퍼링 처리 코드를 추가 했습니다.

        public RoundPanel()
        {
            ...
            this.SetStyle(  ControlStyles.UserPaint |
                            ControlStyles.AllPaintingInWmPaint |
                            ControlStyles.DoubleBuffer, true);
        }

실행 파일 :



.
관련 코드 :


.
 

Posted by gsi
:

특정 폴더를 기준으로 하위 폴더를 찾아 내는 코드 입니다.
그리고 그 폴더 내용을 xml 형태로 만들어 주는 코드도 포함되어 있습니다.
xml 데이터로 만들어진 내용은 CEdit 컨트롤에 표시되며, 그 내용을
저장할 수 있습니다.


관련 소스 :



.

Posted by gsi
:

MFC에서 xml 데이터를 읽어 들이는 예제입니다.
아래의 내용을 계층구조를 통해서 읽어 들이게 됩니다.
자세한 소스는 소스 코드를 참조 하세요.
  - XmlParser.h, cpp

[xml 샘플]

<?xml version="1.0" encoding="EUC-KR"?>

<PATHS>
 <PATH NAME="Install Files">
  <PATH NAME="Dev">
  </PATH>
  <PATH NAME="Dev2">
  </PATH>
  <PATH NAME="Dev3">
   <PATH NAME="Dev3_a">
   </PATH>
   <PATH NAME="Dev3_b">
    <PATH NAME="Dev3_b_a">
    </PATH>
    <PATH NAME="Dev3_b_b"/>
   </PATH>
  </PATH>
 </PATH>
 <PATH NAME="temp">
  <PATH NAME="temp_a"/>
  <PATH NAME="temp_b">
   <PATH NAME="temp_b_a">
   </PATH>
   <PATH NAME="temp_b_b">
    <PATH NAME="temp_b_c"/>
   </PATH>
  </PATH>
 </PATH>
</PATHS>

계층 구조를 읽어 들이는 코드 (재귀호출)

1. 초기화 및 도입부

 ///
 MSXML2::IXMLDOMNodePtr nodeList = m_pDoc->selectSingleNode( Token.c_str() );
 _bstr_t bsElements("PATHS");

 if ( nodeList )
  FindName( nodeList->GetchildNodes() );

 nodeList.Release();

2. 재귀호출 부분

int tabCount = 0;

HRESULT CXmlParser::FindName( MSXML2::IXMLDOMNodeListPtr& lparam )
{
 long elementCount = lparam->Getlength();
 for( int i = 0; i < elementCount; i++ )
 {
  MSXML2::IXMLDOMElementPtr Element = lparam->nextNode();
  if( Element == NULL )
   break;

  _bstr_t bsNodename = Element->GetnodeName();
  _bstr_t bsElement("PATH");
  if( bsNodename == bsElement )
  {
   _bstr_t bsname("NAME");
   _variant_t varElementName = Element->getAttribute(bsname);

   // 해당하는 엘러먼트 Name의 이름 == 폴더 이름을 의미한다.
   CString strName;
   strName.Format( "%S", varElementName.bstrVal );    

   // 탭 카운터를 통한 출력
   CString strTabMergy;
   for( int tc = 0; tc < tabCount; tc++ )
   {
    strTabMergy += "\t";
   }
   strTabMergy += strName;
   TRACE( "%s\n", (LPSTR)(LPCSTR)strTabMergy);

   MSXML2::IXMLDOMNodeListPtr childElementlist = Element->GetchildNodes();
   if( childElementlist )
   {
    tabCount++;
    FindName( childElementlist );
   }
  }

  Element.Release();
 }

 tabCount--;
 lparam.Release();

 return S_OK;
}

아래의 콘솔 화면 내용입니다.

사용자 삽입 이미지


소스 코드 :


.

Posted by gsi
:

Panel에 두장의 이미지(Bitmap)를 추가한 후에
위의 이미지에 알파값을 추가해서 블랜딩 효과를 줘봤습니다.

사용자 삽입 이미지


코드는 아래와 같아요..


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

            g.DrawImage(beforeLeftImage, new PointF(0, 0));

            float[][] ptsArray =
            {
                new float[] { 1, 0, 0, 0, 0},
                new float[] { 0, 1, 0, 0, 0},
                new float[] { 0, 0, 1, 0, 0},
                new float[] { 0, 0, 0, 0.7f, 0},
                new float[] { 0, 0, 0, 0, 1}
            };

            ColorMatrix clrMatrix = new ColorMatrix(ptsArray);
            ImageAttributes imageAtrr = new ImageAttributes();
            imageAtrr.SetColorMatrix(clrMatrix,
                ColorMatrixFlag.Default,
                ColorAdjustType.Bitmap);

            g.DrawImage(beforeXrayLeftIamge,
                new Rectangle(50, 50, beforeXrayLeftIamge.Width, beforeXrayLeftIamge.Height),
                0, 0, beforeXrayLeftIamge.Width, beforeXrayLeftIamge.Height,
                GraphicsUnit.Pixel,
                imageAtrr);

        }

Posted by gsi
:

C#의 Winfor에서 DataSet을 사용할때 BindingSource를 적용할 수 있습니다.
솔직히 아직까지 많은 부분 제대로 파악되지 않은듯 하지만.
참 편한듯 하지만 아직까지 사용하기 힘드네요.

우선 아래의 이미지 처름 MS Access의 파일을 사용해서
member, detail의 테이블을 제작했습니다.

사용자 삽입 이미지
사용자 삽입 이미지

member의 "_name"와 detail의 "_name"의 연결이 되어 있습니다.
잘 몰라서 "관계" 대화창에서 "관계만" 이걸로만 연결했습니다.
사용자 삽입 이미지

문제는 여기서 member의 _name의 정보를 사용해서 삭제 할때
detail의 _name가 같은 경우 모두 삭제를 해야 하는데요.

같은 이름의 내용을 모두 삭제 해야 하는데 자동으로 되는건지 모르겠네요.



그래서 우선 아래와 같이 해결했습니다.
1. member의 항목을 선택한다.
2. member의 memberBindingSource.Current의 값을 얻어 와서 해당 "_name"를 구합니다.
3. detail의 "_name"의 같은 이름을 구해옵니다.(쿼리함수 생성)
4. 구해온 detailDataTable의 정보를 사용해서 detailTableAdapter.Delete() 에서 삭제합니다.
5. memberBindingSource.RemoveCurrent()를 사용해서 member의 데이터를 삭제합니다.
6. .EndEdit()를 통해서 편집을 마칩니다.
7. tableAdapterManager.UpdateAll()를 통해서 값을 업데이트 합니다.

코드는 아래와 같습니다.
private void btnDelete_Click(object sender, EventArgs e)
        {
            try
            {
                DataRowView drv = (DataRowView)this.memberBindingSource.Current;
                TestJoinDataSet.memberRow memberRow = (TestJoinDataSet.memberRow)drv.Row;

                TestJoinDataSet.detailDataTable ddt =
                    this.detailTableAdapter.GetDataBy(memberRow._name);

                foreach (TestJoinDataSet.detailRow row in ddt.Rows)
                {
                    this.detailTableAdapter.Delete(row.ID, row._name, row._info);
                }

                this.memberBindingSource.RemoveCurrent();
                this.memberBindingSource.EndEdit();
                this.detailBindingSource.EndEdit();
                this.tableAdapterManager.UpdateAll(this.testJoinDataSet);
            }
            catch (InvalidOperationException oex)
            {
                MessageBox.Show(oex.Message);
            }
            catch (NotSupportedException nex)
            {
                MessageBox.Show(nex.Message);
            }
            catch (DataException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

이렇게 하는게 맞는지 조언 부탁해요 ^^

Posted by gsi
:

[C#] OpenGL 코드 연동하기

C# 2008. 8. 8. 12:50 |

사용자 삽입 이미지


관련코드 :


.
Posted by gsi
:

기본 소스는 아래 주소의 포스트를 사용했어요.. ^^
[MFC] Ruler 소스.. 메모리 DC 사용한 자연스러운 효과구현..


중점 :
  1. 줌인 줌아웃 처리를 위한 float 변수를 하나 추가 했습니다.
  2. ScrollView의 페이지 크기를 저장하는 CSize 변수를 하나 추가 했습니다.
  3. 방향키 UP, DOWN 을 사용해서 줌인, 줌아웃 처리를 보여 줍니다.

이제 설명을 시작하겠습니다.

Ruler 보완

Ruler의 기존 소스를 보게 되면 마우스로 스크롤 할때 Ruler가 따라 가지 않습니다.
기존 코드를 볼가요?
 // 기본 Ruler
 CRect rulerRect;
 rulerRect.left = scrollPosition.x;
 rulerRect.right = rulerRect.left + curArea.Width();
 rulerRect.top = scrollPosition.y;
 rulerRect.bottom = rulerRect.top + 20;
 m_RulerHorz.Draw( pDC, rulerRect.left, rulerRect.top, rulerRect.Width(), rulerRect.Height(), scrollPosition.x );

분명히 scrollPosition.y를 해줬는데도 안됩니다.
이걸 해결 하기 위해서는 휠을 움직여서 화면을 업데이트 한 것이기 때문에
아래의 OnMouseWheel함수를 오버라이드(?) 해서 Invalidate()를 해줘야 됩니다.

BOOL CRulerSampleView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
 Invalidate();
 return CScrollView::OnMouseWheel(nFlags, zDelta, pt);
}

그리고 Scroll의 Bar를 움직여도 화면이 업데이트 되어야 하기 때문에 아래의 함수들도 같이 처리

void CRulerSampleView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
 Invalidate( true );
 CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CRulerSampleView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
 Invalidate( true );
 CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}

이렇게 하고 나면 휠 또는 스크롤바를 움직여도 Ruler가 자연스럽게 화면에 보이는걸 알 수 있습니다.

자자..
이제 줌인 줌아웃 처리를 해볼까요..


줌인 줌아웃 처리를 위해서 아래의 코드를 RulerSampleView.h 에 추가 합니다.
 CSize     m_PageSize;
 float     m_Zoom;

그리고 RulerSampleView.cpp 에는 아래와 같이 해봅시다.

> 우선 줌 성분 초기화를 생성자 함수에 추가
m_Zoom = 1.f;

> ScrollVew이기 때문에 페이지의 크기를 추가
void CRulerSampleView::OnInitialUpdate()
{
 CScrollView::OnInitialUpdate();

 m_PageSize = CSize( 1000, 1000 );
 SetScrollSizes(MM_TEXT, m_PageSize);
}

> 드로잉 코드에 m_Zoom을 적절하게 수정해 줍니다.
테스트를 위한 위치값을 10개를 생성했습니다. 이건 코드 보시면 알수 있어요..
드로잉 할때 아래와 같이 처리 합니다.
 vector< CPoint >::iterator iter;
 for( iter = m_TestData.begin(); iter != m_TestData.end(); iter++ )
 {
  CRect rect;
  rect.left  = (*iter).x;
  rect.top  = (*iter).y;
  rect.right  = rect.left + 50;
  rect.bottom  = rect.top + 50;

  rect.left  *= m_Zoom;
  rect.top  *= m_Zoom;
  rect.right  *= m_Zoom;
  rect.bottom  *= m_Zoom;

  pDC->FillRect( &rect, &redbrush );
 }
위의 붉은 부분을 m_Zoom으로 곱해줍니다.

> 이렇게 하고 나서 이제 이벤트를 추가해줘야 겠죠.
방향키를 통해서 줌인 줌아웃 성분을 증가 감소 합니다.

void CRulerSampleView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
 if( nChar == VK_UP )
 {
  m_Zoom -= 0.1f;

  CClientDC dc(this);
  m_RulerHorz.CreateDC( &dc, 10000, 20, m_Zoom );

  m_PageSize = CSize( 1000*m_Zoom, 1000*m_Zoom );
  SetScrollSizes(MM_TEXT, m_PageSize);

  Invalidate();
 }

 if( nChar == VK_DOWN )
 {
  m_Zoom += 0.1f;

  CClientDC dc(this);
  m_RulerHorz.CreateDC( &dc, 10000, 20, m_Zoom );

  m_PageSize = CSize( 1000*m_Zoom, 1000*m_Zoom );
  SetScrollSizes(MM_TEXT, m_PageSize);

  Invalidate();
 }

 CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
}

위의 코드에서 보듯이 Ruler도 줌 성분이 달라지면, Ruler의 줌 성분을 보정해서 메모리 DC를 생성합니다.
그리고 ScrollView의 페이지도 m_Zoom에 따라서 사이즈를 제조정 해줍니다.

이렇게 하면 아래와 같은 프로그램을 만들 수 있습니다.

사용자 삽입 이미지
사용자 삽입 이미지

관련샘플 :


.


.


Posted by gsi
:

사용자 삽입 이미지

메모리 DC를 활용한 스크롤바의 Ruler 샘플입니다.
기존의 다른 다이얼로그에 포함시켜서 한 것보다 더 자연스럽네요.
그리고 스크롤 이동시에 잔상이 남지 않아서 더 좋은거 같습니다.

작업한 부분
1. 메모리 DC를 생성
2. 메모리 DC에 해당 Ruler의 크기 정보를 넣어서 미리 다 그려놓는다.
3. 스크롤 이동할때 마다 OnDraw()가 호출되고 그 내부에서 스크롤 포지션 값을 사용해서
    BitBlt 해서 처리 한다.
4. 잔상 효과는 OnHScroll(), OnVScroll()를 오버라이드 해서 Invalidate()를 해줘야 됩니다.

실행 파일 :


.
관련 파일 :


.
Posted by gsi
:

MFC의 UI를 배치 해보고, Winform의 UI배치를 보면 확연히 차이가 나는걸 확인할 수 있습니다.
그중에 가장 좋은건 아무래도 컨트롤 간의 도킹(?) 같은 기능이라고 보여 집니다.
아래의 이미지와 같이 컨트롤을 이동할때 마다 왼쪽, 오른쪽, 위, 아래, 그리고 중앙 에 대해서 실시간적으로 위치를 보정해 주는 기능이 정말 편하다고 생각 됩니다.
사용자 삽입 이미지

이번 툴의 샘플은 위와 같은 기능이 뷰에서도 많이 사용되게 되는데요.
가장 많이 사용되는 건 아무래도 스냅 기능이 아닐까 생각 됩니다.
해당 스냅의 간격에 맞춰서 객체를 이동시키는 방법 입니다.

스냅 구현
스냅을 구현할때 전 아래의 공식을 사용했습니다.

void CDataBox::MoveSnap( CPoint& pos )
{
 if( _bEnableSnap )
 {
  pos.x = pos.x - ( pos.x % _snapValue );
  pos.y = pos.y - ( pos.y % _snapValue );
 }
}
간단하게 설명을 하면 _snapValue가 스냅의 값이며, pos는 현재 위치를 담는 변수 입니다.
% 연산자를 사용해서 해당 스냅 간격에 대한 나머지를 구해서 현재 포지션에서 빼주는 방법으로 처리했습니다.

스냅을 처리하다 보면 현재 객체의 포지션값을 스냅으로 처리 하게 되면 제대로 동작하지 않습니다.
객체의 값은 항상 스냅이 적용되지 않은 값을 가지고 있어야 한다고 보여집니다.

화면에 보여질때 스냅의 처리를 통해서 보여지는게 조금더 유연하다고 생각 됩니다.

객체 도킹
객체의 도킹은 마우스로 이동할때마다 처리 해야 합니다.
다시 말해서 선택된 객체와 선택되지 않은 객체 간의 검사를 말합니다.
현재 객체의 위치와 다른 객체의 위치를 검사해서 도킹의 리미트 값의 범위 안에 들어왔을때
현재 객체를 대상 객체의 위치로 보정해 주는 방법 입니다.
여기에 더 해서 도킹이 이루어질 대상 객체와의 라인을 그려 주면 더 좋을듯 합니다.
사용자 삽입 이미지

위와 같이 해당 객체의 상태에서 파란선이 나오면서 객체가 같은 Y 축의 위치로 보정 됩니다.

이 소스는 조금 정리가 더 되어도 좋다고 생각 됩니다.
DataBox의 객체 관리 클래스에서 도킹을 담당하지만,
이것을 도킹 관련 클래스를 하나 두어서 작업 하는게 더 좋다고 보여 지네요..

관련 샘플 :


.

Posted by gsi
:

윈도우즈 업데이트 할때 일부 문제로 인해서 업데이트가 수행되지 않습니다.
아래와 같이 서비스 종료 후에 업데이트 dll을 등록해 주고 서비스 재시작 해주면 된다.

C:\>net stop wuauserv
C:\>regsvr32 %windir%\system32\wups2.dll
C:\>net start wuauserv

Posted by gsi
:

흑백의 이미지를 CxImage로 만들때 8비트, 24비트의 이미지로 만들 필요가 없습니다.
이때 1비트의 이미지로 해도 충분한 공간이 나온다는 얘긴데요.
아래의 코드는 1비트의 이미지를 생성하는 코드 입니다.

void GToleranceImage::MakeBuffer2Image()
{
 SAFE_DELETE( _pbuffer2Image );
 assert( _pbuffer2Image == NULL );
  // 넓이와 폭을 사용해서 이미지 버퍼를 생성합니다.
  // 이때 1비트의 이미지로 설정합니다.
 _pbuffer2Image = new CxImage( _width, _height, 1, CXIMAGE_FORMAT_BMP );

  // 이미지의 팔레트를 지정합니다.
  // 흑백 이미지를 만들거기 때문에 0번과 1번 팔레트를 설정합니다.
 _pbuffer2Image->SetPaletteColor(0, RGB(0, 0, 0));
 _pbuffer2Image->SetPaletteColor(1, RGB(255, 255, 255));

  // 해당 내용을 추가합니다.
  // SetPixelColor로 하지 않고, SetPixelIndex로 하게 됩니다.
 for( int y = 0; y < _height; y++ )
 {
  for( int x = 0; x < _width; x++ )
  {
   BYTE color = _bufferXY[y][x];
   if( color == 255 )
    _pbuffer2Image->SetPixelIndex( x, y, 1 );
   else
    _pbuffer2Image->SetPixelIndex( x, y, 0 );
  }
 }
 _pbuffer2Image->Flip();
}

Posted by gsi
:

x, y 의 포인터 배열을 폴리라인이 형성되어 있을때
그 라인에 대한 옵셋값을 사용해서 포인터를 찍는 샘플 코드 입니다.

사용자 삽입 이미지
















확대를 하면 아래와 같은 포인터가 생성되는걸 확인할 수 있습니다.
Left, Right 키를 통해서 옵셋 값을 늘리고 줄이고 할 수 있습니다.
사용자 삽입 이미지


실행 파일 :


.
관련 코드 :


.
Posted by gsi
:

사용자 삽입 이미지

그레이 스케일로 표현해주는 코드가 일부 들어가 있는 소스입니다.
MFC DLL 형태로 제작되어 있으며, 바로 이전의 게시물과 거의 동일한 구조입니다.
몇가지 단위 테스트를 위해서 제작된 샘플 프로젝트입니다.

관련 소스 :


.
Posted by gsi
:

사용자 삽입 이미지

MFC DLL : 한장의 이미지를 보여 주는 dll 파일입니다.
                현재 jpg의 파일만 인코딩이 가능합니다.
                (이 부분은 확장자를 사용해서 처리 하시면 됩니다. 아직 그건 추가 하지 않았네요. )

사용시에는 아래의 코드를 이용 하시면 됩니다.

 CDlgImage dlg( "E:\\Gsi_Project\\정상옥_프로젝트\\Project\\2008_06_23_LAM_ModuleTest\\bin\\blue.jpg" );
 dlg.DoModal();

이외의 생성자 인자로서는 해당 width, height를 입력해줄 수 있으며,
내부 코드에서는 해당 다이얼로그에 맞도록 리셈플링 처리가 되어 있습니다.


실행파일 :



.

프로젝트 파일 :


.

Posted by gsi
: