Window/Surface2012. 9. 18. 20:29

 

Surface 개발 ( 현재는 Pixelsense 로 이름이 변경되었죠. ) 을 하다보면

기본적으로 제공되는 SurfaceScrollViewer 에서는 Scroll은 잘 되지만

Scale, Rotate, Drag 과 같은 Transform 관련 조작들이 되지 않습니다.

 

현재 스마트폰들에서는 당연히 되는 기능이 되지 않아 UX 적인 부분에서 매우 아쉬운 점입니다.

하지만 이미 스마트폰에 젖어 있는 사용자들에게 꼭 필요한 기능이기 때문에

예전에 하나의 마우스로 멀티터치처럼 Scale, Rotate, Drag 를 할 수 있도록

작성해 보았던 소스를 Surface SDK 환경에 맞게 조금 수정하여 Behavior를 만들어 보았습니다.

http://shine10ee.blog.me/10079192174

 

 

- IsOnlyContentScale : SurfaceScorllViewer의 Content 사이즈를 변경 여부 속성,

                                     false 일 경우 SurfaceScrollViewer의 사이즈가 변경 됩니다. ( default : false )

- CanScale : 사이즈 변경 속성, Ture일 경우 SurfaceScrollViewer의 사이즈를 변경합니다.

- CanRotate : 회전 속성, True일 경우 SurfaceScrollViewr를 회전시킵니다.

                      IsOnlyContentScale이 True일 경우 적용되지 않습니다.

- CanDrag : 드래그 속성, True 일 경우 SurfaceScrollViewer의 위치를 변경합니다.

- MinScale : 최소 사이즈 속성, MaxScale 보다 클 경우 MaxScale 로 설정합니다.

- MaxScale : 최대 사이즈 속성, MinScale 보다 작을 경우 MinScale 로 설정합니다.

 

[ IsOnlyContentScale : True, CanScale : True ]

 

 

[ IsOnlyContentScale : False, CanScale : True ]

 

 

[ CanRotate : True ]

 

 

 

 

[ CanScale : True, CanRotate : True ]

 

 

 

 

[ CanDrag : True ]

 

 

 

 

 

[ CanScale : True, CanRotate : True, CanDrag : True ]

 

 

SurfaceScrollViewerBehavior.zip

 

'Window > Surface' 카테고리의 다른 글

[ WPF ] TagVisualization  (0) 2010.07.15
[ WPF ] Surface LibraryStack & LibraryBar - Drag and Drop  (0) 2010.07.10
[ WPF ] Surface LibraryStack & LibraryBar  (0) 2010.07.04
[ WPF ] Surface ScatterView  (0) 2010.07.03
[ WPF ] Surface SDK 예제  (0) 2010.07.03
Posted by 열ㅇl
Languages/C, C++2012. 8. 17. 17:17

C# 에서 C++로 작성된 dll 을 사용할 경우에는 DllImport 를 사용하여 손쉽게 사용할 수 있지만

C++ 에서 C#으로 작성된 dll 을 사용할 경우에는 COM으로 등록하는 작업이 추가적으로 필요합니다.

사용법에 대해서 하나씩 살펴보겠습니다.

 

[ C# dll ]

 

1. C++에서 사용가능한 메소드를 노출시키기 위한 인터페이스를 선언합니다.

 

Tip

 

- Guid 는 Visual Studio의 [ Tools ] - [ Create GUID ] 메뉴를 통해 쉽게 만들 수 있습니다.

- [ComVisible(true)] 대신 다음과 같이 Make assembly COM-Visible을 체크할 수 있습니다.

 

[ComVisible(true)]

[Guid("61EA822A-82BC-4CCE-A0BF-5A24855FF613")]

public interface ICShapSample

{

    void ShowMessage();

}

 

2. 인터페이스를 상속받아 클래스를 구현합니다.

 

[ComVisible(true)]

[ClassInterface(ClassInterfaceType.None)]

[Guid("36EA856C-99E3-4365-B157-6C0D75173F48")]

public class CShapSample : ICShapSample

{

    public void ShowMessage()

    {

        MessageBox.Show("Hello World!!");

    }

}

 

3. dll 을 COM으로 등록합니다.

 

두 가지 방법이 있습니다.

 

1 ) Visual Studio를 관리자 권한으로 실행 시킨 후 다음과 같이 Register for COM interop을 선택한 후 빌드합니다.

 

 

2 ) 커맨드 창을 관리 권한으로 실행시 킨 후 regasm 을 이용해 등록합니다.

- 환경변수가 설정이 되어 있지 않으면

  C:\Windows\Microsoft.NET\Framework\v4.0.30319 ( 설치 버전에 따라 다름 )

  경로에 있는 RegAsm 과 regasm 파일을 dll 폴더에 복사합니다.

  커맨드 창에서 dll 폴더로 이동한 후,

  regasm ClassLibrary.dll /tlb 를 입력 후 실행합니다.

 

[ 등록이 완료되면 tlb 파일이 생성됩니다. ]

 

[ C++ ]

 

tlb 파일을 import 하여 사용합니다.

 

#include <Windows.h>

 

#import "..\ClassLibrary\bin\Debug\ClassLibrary.tlb"

 

using namespace ClassLibrary;

 

void main()

{

             CoInitialize(NULL);

 

             ICShapSamplePtr ptr(__uuidof(CShapSample));

             ptr->ShowMessage();

 

             ptr->Release();

             CoUninitialize();

}

 

[ 실행화면 ]

 

 

CShapDllImport.zip

 

Posted by 열ㅇl
Window/WPF2012. 8. 17. 15:07

VisualTree 를 순회하며 해당 타입과 이름이 일치하는 자식을 찾는 소스 코드입니다.

Template 에 유용하게 사용할 수 있습니다.

 

public static T FindChild<T>(this FrameworkElement obj, string name)

{

    DependencyObject dObj = obj as DependencyObject;

    T findChild = default(T);

   

    if (dObj != null)

    {

        int childCount = VisualTreeHelper.GetChildrenCount(dObj);

 

        for (int i = 0; i < childCount; i++)

        {

            DependencyObject childObj = VisualTreeHelper.GetChild(dObj, i);

            FrameworkElement child = childObj as FrameworkElement;

 

            if (child.GetType() == typeof(T) && child.Name == name)

            {

                findChild = (T)Convert.ChangeType(child, typeof(T));

                break;

            }

 

            findChild = child.FindChild<T>(name);

 

            if (findChild != null) break;

        }

    }

 

    return findChild;

}

 

'Window > WPF' 카테고리의 다른 글

Pixel Shader Effect in WPF  (0) 2015.02.26
[ WPF ] Word Cloud  (0) 2014.02.23
데이터 바인딩 ( Data Binding )  (0) 2012.07.24
WPF Media Player ( Design. GomPlayer )  (0) 2012.03.12
Brush ColorAnimation  (0) 2011.06.22
Posted by 열ㅇl
Languages/C#2012. 8. 17. 14:27

Struct 를 Byte 로, Byte 를 Struct 로 변환하는 소스 입니다.

 

public static byte[] StructToByte(object obj)

{

    int size = Marshal.SizeOf(obj);

    byte[] arr = new byte[size];

    IntPtr ptr = Marshal.AllocHGlobal(size);

 

    Marshal.StructureToPtr(obj, ptr, true);

    Marshal.Copy(ptr, arr, 0, size);

    Marshal.FreeHGlobal(ptr);

    return arr;

}

 

public static T ByteToStruct<T>(byte[] buffer) where T : struct

{

    int size = Marshal.SizeOf(typeof(T));

 

    if (size > buffer.Length)

    {

        throw new Exception();

    }

 

    IntPtr ptr = Marshal.AllocHGlobal(size);

    Marshal.Copy(buffer, 0, ptr, size);

    T obj = (T)Marshal.PtrToStructure(ptr, typeof(T));

    Marshal.FreeHGlobal(ptr);

    return obj;

}

 

'Languages > C#' 카테고리의 다른 글

[ C# ] FTP  (4) 2013.02.26
[ C# ] Object To Byte, Byte To Byte  (0) 2013.02.26
[ C# ] Win32 API MouseEvent  (8) 2010.12.07
[ C# ] C# FTP Download  (3) 2010.07.21
[ C# ] Default Sound Device 변경하기  (0) 2010.07.19
Posted by 열ㅇl
Window/WPF2012. 7. 24. 12:00

데이터 바인딩을 주제로 작성한 스터디 발표 자료입니다.

 

 

데이터 바인딩 ( Binding ).pptx

 

'Window > WPF' 카테고리의 다른 글

[ WPF ] Word Cloud  (0) 2014.02.23
[ WPF ] VisualTree FindChild  (0) 2012.08.17
WPF Media Player ( Design. GomPlayer )  (0) 2012.03.12
Brush ColorAnimation  (0) 2011.06.22
Storyboard.SetTargetProperty에 RenderTransformProperty 설정하기  (0) 2011.03.04
Posted by 열ㅇl
Window/WPF2012. 3. 12. 16:17
예전에 회사 내 스터디를 진행하면서 만들었던 미디어 플레이어입니다.
디자인은 보시는 바와 같이 곰플레이어를 따라 해봤습니다. ( Design by 찰스님 ) 
: 디자인이 문제가 된다면 삭제하도록 하겠습니다. 







많은 기능들을 구현해 보려고 했는데 시간상 다음 기능들만을 구현해보고 마무리되었네요.

구현된 기능은

- Play / Pause / Stop
- Full Screen / Maximum / Minimum / Close
- Volume / Mute
- FileOpen / FileOpen 시 자동 사이즈 조정 / PlayList
- Drag & Drop
- Slider 와 영상 싱크 동기화 / 재생시간 / 타이틀
: 마우스 클릭 지점으로 슬라이더바를 움직이는 것은 예전 포스팅에서 만들었던 Custom Slider를 사용했습니다.

WPF를 처음 접해보시거나 관심있는 분들에게 도움이 되었으면 합니다.


'Window > WPF' 카테고리의 다른 글

[ WPF ] VisualTree FindChild  (0) 2012.08.17
데이터 바인딩 ( Data Binding )  (0) 2012.07.24
Brush ColorAnimation  (0) 2011.06.22
Storyboard.SetTargetProperty에 RenderTransformProperty 설정하기  (0) 2011.03.04
ListBox ItemsPanel 변경하기  (0) 2011.03.04
Posted by 열ㅇl
Web/Sliverlight2011. 12. 5. 00:03
OOB 의 가장 큰 매력 중에 하나는 COM 오토메이션을 통해 COM 객체를 사용할 수 있다는 점 일텐데요.

이번 포스팅에서는 OOB의 COM 오토메이션 기능을 사용자가 만든 COM 객체와 함께 어떻게 사용하는지에 대해서
간단한 계산기 예제를 통해 알아보도록 하겠습니다.


먼저,
간단한 덧셈, 뺄셈 기능을 가지는 dll 파일을 하나 만들어 보도록 하겠습니다.
다음에 dll 등록을 위해 비주얼 스튜디오를 관리자 권한으로 실행합니다.
ComExampleCalculator란 이름의 새로운 Class Library 프로젝트를 생성하고 다음과 같이 작성하였습니다.

namespace ComExampleCalculator

{

    public delegate void CalculatorCompletedHandler(int result);

 

    [Guid("D51692ED-0A50-4AB8-8BD8-474EF3910AC3"),

    ProgId("ComExampleCalculator.Application"),

    ComSourceInterfaces(typeof(ICalculatorEvents))]

    public class Calculator

    {

        public event CalculatorCompletedHandler CalculatorCompleted;

 

        public void Add(int a, int b)

        {

            if (CalculatorCompleted != null)

            {

                CalculatorCompleted(a + b);

            }

        }

 

        public int Sub(int a, int b)

        {

            return a - b;

        }

    }

 

    /// <summary>

    /// Interface for the events raised by the com object.

    /// </summary>

    [Guid("D6D34CD5-497E-4943-8A11-F4F922C992D3"),

    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]

    public interface ICalculatorEvents

    {

        void CalculatorCompleted(int result);

    }

}


클래스 명 위에 Guid와 ProgId를 선언함을 볼 수 있습니다.
COM 고유의 식별 번호를 부여하기 위한 Guid와
COM 오토메이션 사용 시 dll 을 식별할 수 있는 ProgId 입니다.
기본적으로 위 두 가지 속성외에 ComSourceInterfaces는 이벤트 사용을 위해 추가한 속성으로
아래 ICalculatorEvents 인터페이스의 CalculatorCompleted 이벤트를 사용하고 있습니다.

Guid 는
비주얼 스튜디오 상단 메뉴 탭의 [ Tools ] -> [ Create GUID ]를 통해 생성할 수 있습니다.

 

 

 

다음으로,
dll을 COM으로 등록하기 위해 클래스 라이브러리의 속성 중 두 가지를 설정합니다.
[ Applicarion ] 탭의 Assemly Information 버튼을 눌러 Make assembly COM-Visible 에 체크합니다.


[ Build ] 탭의 Register for COM interop 에 체크합니다.


위 과정은
콘솔창을 통해 다음과 같이 등록하는 과정과 동일합니다.
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm ComExampleCalculator.dll /tlb

이것으로 COM 객체를 생성하게 되었습니다.
그럼 마지막으로 OOB 프로그램에서 COM 오토메이션을 통해 사용해 보도록 하겠습니다.

OOB 프로그램을 먼저 만들어 보도록 하겠습니다.

새로운 Sliverlight Application 프로젝트를 생성하고 다음과 같이 MainPage 의 디자인을 만들었습니다.

[ MainPage.xaml ]


프로젝트의 [ Properties ] 창에서 그림과 같이 [ Enable running application out of the browser ] 에 체크를 합니다.


추가적으로 빨간 테두리 밑의 Out-of-Browser Settings 버튼을 누르게 되면 옵션을 설정할 수 있습니다.


윈도우에 관련된 타이틀, 사이즈, 시작 위치, 아이콘, GPU 가속, 설치 메뉴, 권한상승 여부를 설정할 수 있는데
COM 오토메이션을 사용하기 위해서는 권한상승이 필요함으로
Require elevated trust when running outside the browser 에 체크를 합니다.

권한상승을 하게 되면 윈도우창의 스타일을 변경할 수 있을 뿐더러
로컬 파일에 접근할 수 있고 전체화면 모드에서 키 입력이 가능해집니다.

자, 이것으로 OOB 환경에서 COM 오토메이션을 사용하기 위한 환경이 만들어졌습니다.

이 후 dynamic 을 사용하기 위한  Microsoft.CSharp과 System.Core 를 다음과 같이 작성하였습니다.

namespace SilverlightUsingCom

{

    public partial class MainPage : UserControl

    {

        public MainPage()

        {

            InitializeComponent();

        }

 

        private void Button_Click(object sender, RoutedEventArgs e)

        {

            if (App.Current.HasElevatedPermissions)

            {

                try

                {

                    if (AutomationFactory.IsAvailable)

                    {

                        using (dynamic calculator =
                                         AutomationFactory.CreateObject("ComExampleCalculator.Application"))

                        {

                            AutomationEvent calculatorCompelted = 
                                                 AutomationFactory.GetEvent(calculator, "CalculatorCompleted");

                            calculatorCompelted.EventRaised += 
                               new EventHandler<AutomationEventArgs>(calculatorCompelted_EventRaised);

 

                            int num1 = int.Parse(tbNum1.Text);

                            int num2 = int.Parse(tbNum2.Text);

                            calculator.Add(num1, num2);

 

                            int subResult = calculator.Sub(num1, num2);

                            tbSub.Text = subResult.ToString();

                        }

                    }

                }

                catch (Exception ex)

                {

                    MessageBox.Show(ex.Message);

                }

            }

        }

 

        private void calculatorCompelted_EventRaised(object sender, AutomationEventArgs e)

        {

            int addResult = (int)e.Arguments[0];

            tbAdd.Text = addResult.ToString();

        }

    }

}


먼저 App.Current.HasElevatedPermissions 프로퍼티를 통해 권한상승 여부를 확인 후
AutomationFactory.IsAvailable 프로퍼티를 통해 COM 오토메이션을 사용할 수 있는지 확인합니다.
AutomationFactory.CreateObject 메소드를 통해 위에서 설정했던 ProgId를 입력 하여 COM 객체를 반환 받은 뒤
정의해 두었던 이벤트를 연결하고 메소드를 호출하고 있습니다.

마지막으로 실행 화면입니다.


'Web > Sliverlight' 카테고리의 다른 글

Sliverlight OOB 에서 IPAddress 얻어오기  (0) 2011.12.04
Posted by 열ㅇl
Web/Sliverlight2011. 12. 4. 00:48

실버라이트 OOB 환경에서 로컬 컴퓨터의 IPAddress를 가져오는 방법입니다.
기존 실버라이트에서는 InitParams를 이용하거나 WCF 서비스등을 통해 얻어 올 수 있지만
OOB에서는 사용할 수 없음으로 다른 방법이 필요한데요.
OOB의 COM 오토메이션과 WMI를 이용하면 가능합니다.

     public class Util

    {

        public static string GetLocalIPAddress()

        {

            if (!Application.Current.HasElevatedPermissions)

            {

                return string.Empty;

            }

 

            try

            {

                if (AutomationFactory.IsAvailable)

                {

                    using (dynamic wmi = AutomationFactory.CreateObject("WbemScripting.SWbemLocator"))

                    {

                        dynamic service = wmi.ConnectServer(".", @"root\cimv2");

                        dynamic query = service.ExecQuery(@"select IPAddress from 
                                                Win32_NetworkAdapterConfiguration where DNSHostName is not null"
);

 

                        string ipAddress = query.ItemIndex(0).IPAddress[0];

                        return ipAddress;

                    }

                }

                else

                {

                    return string.Empty;

                }

            }

            catch (Exception ex) { MessageBox.Show(ex.Message); }

 

            return string.Empty;

        }

    }


'Web > Sliverlight' 카테고리의 다른 글

Sliverlight Using COM  (0) 2011.12.05
Posted by 열ㅇl
Window/WPF2011. 6. 22. 21:38
Brush 속성의 색상을 변경시키는 애니메이션에 대한 내용입니다.

ColorAnimation 으로,
TabItem 컨트롤, Rectangle 컨트롤, Border 컨트롤 등의 Brush 속성 값을 변경시킵니다.

Storyboard.SetTargetPropertyPropertyPath 속성으로
Brush 관련 프로퍼티 후에 SolidColorBrush.ColorProperty를 연결 시킵니다.

예 ) Rectangle 컨트롤의 Fill 속성 변경 시

Storyboard.SetTargetProperty(colorAnimation, new PropertyPath("(0).(1)",

  new DependencyProperty[]

  {

      Shape.FillProperty,

      SolidColorBrush.ColorProperty

  }));

다음은 TabItem, Rectangle, Border 의 Brush 속성들을 변경시키는 예제입니다.

[ 실행화면 ]

 

 [ 소스 코드 ]

  void MainWindow_Loaded(object sender, RoutedEventArgs e)

  {

        tabItem.BeginStoryboard(CreateStoryboard(Colors.Blue, Border.BorderBrushProperty));

        rectangle.BeginStoryboard(CreateStoryboard(Colors.LightSeaGreen, Shape.FillProperty));

        rectangle.BeginStoryboard(CreateStoryboard(Colors.Green, Shape.StrokeProperty));

        border.BeginStoryboard(CreateStoryboard(Colors.Red, Border.BorderBrushProperty));

   }

 

  Storyboard CreateStoryboard(Color color, DependencyProperty property)

  {

       ColorAnimation colorAnimation =
                      new ColorAnimation(color, new Duration(TimeSpan.FromSeconds(2)));

 

       Storyboard.SetTargetProperty(colorAnimation, new PropertyPath("(0).(1)",

             new DependencyProperty[]

             {

                  property,

                  SolidColorBrush.ColorProperty

             }));

 

        Storyboard storyBoard = new Storyboard()

        {

             AutoReverse = true,

             RepeatBehavior = RepeatBehavior.Forever,              

        };

           

        storyBoard.Children.Add(colorAnimation);

 

        return storyBoard;

  }







Posted by 열ㅇl
Project/Kinect2011. 6. 17. 10:32

키넥트 SDK 베타 버전이 릴리즈 되었습니다.
앞으로 이제 재미난 개발들을 많이 해볼 수가 있을 것 같네요. ^^

URL : http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/default.aspx

샘플 테스트 해보았습니다.

     

    

[ 게임 샘플 동
영상 ]
Get Microsoft Silverlight

'Project > Kinect' 카테고리의 다른 글

OpenNI Sample Test  (0) 2010.12.29
MikuMikuDance with OpenNI  (0) 2010.12.29
Posted by 열ㅇl