GSI

사용자 삽입 이미지

본 프로그램은 위의 그림의 Grid 객체가 중앙을 기준으로 회전하는 에니메이션 예제 입니다.
Start Angle, End Angle의 값을 변경해서 시작과 끝의 각도를 정해줄 수 있습니다.
Start, End의 회전각도를 정하고 Start 버튼을 누르면 원하는 각도만큼 회전할 수 있습니다.

본 예제는 Animation을 진행할 때 Value의 객체를 cs 파일에서 접근해서 처리 하기가 힘든 기존의 부분을 처리 하기 쉽도록 테스트를 해본 겁니다. ^^ (개인적으로 힘들었어요)

[코드 설명]
Animation의 SplineDoubleKeyFrame에 들어 가는 Value의 값을 바꾸기 위해서
처리용 클래스를 하나 제작했습니다.

    public class AniControl
    {
        private int start;
        private int end;

        public int Start
        {
            set { start = value; }
            get { return start; }
        }

        public int End
        {
            set { end = value; }
            get { return end; }
        }
    }

이제 연동을 위해서 xaml 코드에 추가작업을 했습니다.

xmlns:src="clr-namespace:CircleRotate" <-- 네임스페이스를 <Window.. 여기에 추가했습니다.

Window.Resources 내부에 미리 값을 지정하면서 aniControl을 하나 제작생성했습니다.

<src:AniControl x:Key="aniControl" Start="10" End="180" />

미리 제작한 Timeline1의 에니메이션 코드의 SplineDoubleKeyFrame 의 Value에 DataBind를 연결합니다.

<Storyboard x:Key="Timeline1">
 <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="grid" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)">
        <SplineDoubleKeyFrame KeyTime="00:00:00"
                              Value="{Binding Source={StaticResource aniControl}, Path=Start}"/>
  <SplineDoubleKeyFrame KeyTime="00:00:02"
                              Value="{Binding Source={StaticResource aniControl}, Path=End}"/>
 </DoubleAnimationUsingKeyFrames>
</Storyboard>

이렇게 해서 실행해 보면 객체를 회전시킬 수 있습니다.
여기서 조금더 추가를 해서 Start, End의 값을 TextBox를 통해서 값을 받아서 회전 값을 처리하도록 구현했습니다.
TextBox의 값을 바로 바인딩해도 되지만 aniControl로 값을 보내도록 해봤습니다.

<TextBox HorizontalAlignment="Left" Margin="90,80,0,0" VerticalAlignment="Top" Width="56" Height="24"
         Text="{Binding Source={StaticResource aniControl}, Path=Start, Mode=TwoWay}"
         TextWrapping="Wrap" RenderTransformOrigin="0,0.333" x:Name="txtStart"/>
<TextBox HorizontalAlignment="Left" Margin="90,108,0,0" VerticalAlignment="Top" Width="56" Height="24"
         Text="{Binding Source={StaticResource aniControl}, Path=End, Mode=TwoWay}"

자세한 코드 내용은 소스를 한번 보시구요.
모르는거 있으시면 연락 주세요 ^^.

관련 소스 :

Posted by gsi
:

[WPF] ColorScroll Demo

WPF Sample 2007. 11. 27. 13:13 |

ColorScroll

사용자 삽입 이미지

3개의 슬라이드 바를 사용해서 칼라 값을 조정하는 데모 입니다.
MultiBinding을 사용해서 3개의 슬라이드 바의 값을 합쳐서 RGB로 만들어 내는 방법입니다.
여기에는 IValueConverter 를 상속받아서 처리 하는 코드도 같이 포함되어 있습니다.

관련 코드 :

Posted by gsi
:

ListCtrl의 한줄로 선택되도록 처리 하는 방법 + 그리드 라인을 같이 그려주는 코드
생성시에 한번 호출해서 설정해 주면 됩니다.


m_listPortSequencePerAddress.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);

컬럼 설정하는 방법

// 리스트 컬럼 추가함수
void CDlgSequencePage::AddColumn()
{
 //컬럼 채우기
 int m_nColWidths[] = { 90, 60}; // sixty-fourths
 TCHAR * lpszHeaders[] = {
        _T("Port/Sequence"),
        _T("Address"),
        NULL };

 int i;
 LV_COLUMN lvcolumn;
 memset(&lvcolumn, 0, sizeof(lvcolumn));

 // add columns
 for (i = 0; ; i++) {
  if (lpszHeaders[i] == NULL)
   break;

  lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
  lvcolumn.fmt = LVCFMT_LEFT;
  lvcolumn.pszText = lpszHeaders[i];
  lvcolumn.iSubItem = i;
  lvcolumn.cx = m_nColWidths[i];
  m_listPortSequencePerAddress.InsertColumn(i, &lvcolumn);
 }
}

데이터 추가시
Lparam도 같이 추가할 때

void CDlgSequencePage::AddData(CString portName, int Address, lpFixtureElement pFixEle)
{
 CString strText;
 int index = 0;
 index = m_listPortSequencePerAddress.GetItemCount();

 // Insert the item, select every other item.
 strText = portName;
 int id = m_listPortSequencePerAddress.InsertItem(LVIF_TEXT|LVIF_PARAM, index, strText, 0, 0, 0, (LPARAM)pFixEle);

 // Insert 10 items in the list view control.
 strText.Format(TEXT("%d"), Address);
 m_listPortSequencePerAddress.SetItemText(index, 1, strText);
}

해당 Row를 선택시에 Lparam의 값을 가져와서 처리 하는 방법

void CDlgSequencePage::OnLvnItemchangedSequenceListInfo(NMHDR *pNMHDR, LRESULT *pResult)
{
 LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

 static int oldSelectItemLine = -1;

 // 해당 아이템 번호가 항상 3번 호출되고 다른 번호가 들어오기 때문에
 // 여기서 걸러 준다.
 if(pNMLV->iItem != oldSelectItemLine) {
  oldSelectItemLine = pNMLV->iItem;

  // 리스트 컨트롤에 저장된 포인터 정보를 사용해서
  // 선택정보를 변경하자.
  lpFixtureElement pFixEle = (lpFixtureElement)m_listPortSequencePerAddress.GetItemData(pNMLV->iItem);
  ASSERT(pFixEle);
  FixtureArray::GetInstance().ChangedFixtureElement(pFixEle);

  // PixelMap View 화면을 업데이트 한다.
  g_PixelMapView->Invalidate();
 }

 *pResult = 0;
}


 

Posted by gsi
:

오늘 일단락 지었다.

기존에 뎁스 테스트가 제대로 되지 않는 부분에서 z-Buffer의 값을 16 에서 32로 바꿨으며,
화면에 제대로 나오지 않는 경우는

모델링 파일의 겹침 현상도 한몪을 한거 같다.
맥스에서 안보이는 부분을 없애고 메쉬들을 Attach 시킨 다음에 obj로 다시 뽑아 냈다.
화면에 제대로 나오는 것을 확인 했다.

화면에 Normal의 값이 반대로 나오는 것은 모델링 파일의 오류는 아니였고,
중간에 계산을 하는 과정에서 LookAt의 방향이 오류가 나 있었다.
메트릭스 값이 반대로 되어서 Normal의 값이 반대로 보였고 기타 다른 처리가 되지 않았다.

예전에도 고민한 부분이 있는거 같은데

투패스를 통해서 블랜딩 처리를 할때 DepthTest를 꺼고 했을때 잘 나오지만
다른 오브젝트와의 ZBuffer가 제대로 처리 되지 않아서 원하는 결과가 나오지 않는다.

이 부분은 DepthTest를 켜고 다시 한번 시도를 해봐야 할거 같다.
Posted by gsi
:

ProgressBar Demo

WPF Sample 2007. 11. 26. 13:06 |

Gsi ProgressBar Demo

사용자 삽입 이미지

Start 버튼을 누르면 프로그래스바가 100%까지 차는 모양을 도시해봤습니다.

- TextBlock의 값은 IValueConverter 를 사용해서 double의 값을 string형태로 변환했습니다.
- Rectangle을 사용해서 프로그래스바를 하나 작성했습니다.
- Rectangle의 Width의 속성을 사용해서 증가율을 표시 하고
   해당 증가율을 옆에 TextBlock로 하나 작성해서 뿌렸습니다.

바인딩은 Rectangle의 Width를 소스형태로 하고 TextBlock의 Text가 타겟형태로 구성
모드는 디폴트로 처리 했습니다.

관련 소스 :

Posted by gsi
: