1.    Purpose

The purpose of this document is to make initial recommendations based on a comparative analysis of VC++, VB.NET and C# for development of Blu Ray Disc authoring application. The document first talks about features of VC++, VB.NET and C#. Then it compares the pros and cons of each development environment with respect to various evaluation criteria. Recommendation follows in the later section.

2.    Introduction

2.1.   VB.NET

Visual Basic .NET as its predecessor Visual Basic inherits the RAD (Rapid Application Development) infrastructure. It leverages the understanding of the developers’ existing knowledge of Visual Basic to create application with .NET Framework.

 

With Visual Basic .NET, rapid application development is taken to the next level by leveraging the skills Visual Basic developers already possess and enabling them to address any programming task using paradigms that are both familiar and intuitive.

 

VB.NET enables the developers to

Ø  Build rich desktop applications using Microsoft Windows Forms

Ø  Offers flexible and simplified data access mechanism.

Ø  Create broad-reach Web and mobile Web applications

Ø  Develop non-visual business logic components, including XML Web services

Ø  Supports Object Oriented Programming

Ø  Easier to build web based applications.

Ø  All the classes in the .NET Framework support VB.NET

 

2.2.   C#

Visual C# (VC# or just C# as it is called) is a strongly typed object oriented language designed to give the optimum blend of simplicity, expressiveness and performance. C# and .NET are a little symbiotic: Some features of C# are there to work well with .NET and some features of .NET are there to work well with C#. C# is easy to write, read and maintain like Visual Basic and offers the power and flexibility of C++.

 

Following are some key features of C#

 

Ø  It is a simple and powerful programming language for writing enterprise edition applications.

Ø  It helps developers to easily build web services that can be used across the Internet through any language on any platform.

Ø  It helps the developer write fewer lines of code to implement the same functionaliy that will lead to fewer errors in code.

Ø  It introduces considerable improvement and innovations in areas such as type safety, versioning, events and garbage collection.

Ø  Can be used to develop enterprise applications on the Web or Client server applications.

Ø  It comes with the powerful distributed object model (Remoting) and supports XML web services natively.

2.3.   VC++ (Referred to as Unmanaged C++ in .NET documentation)

 

Ø  Because VC++ does not take advantage of the services provided by the EE (Execution Engine) or Run Time, it often runs faster than C#. But this is a significant advantage only in case of low level programming rather than GUI development.

Ø  It can call Win32 API's (such as DirectX to access and render video/audio content) and other existing code without the additional transition overhead required by EE such as using managed marshalers.

Ø  VC++ IDE supports the development of applications as well as the low-level modules (like drivers).

Ø  It will live for a long time because there will be times when you will have to develop components in C++ and then use Interop services (provided by .NET framework) to access them from a .NET application.

Ø  It provides good framework support for COM (Component Object Model)/DCOM (Distributed Component Object Model).

Ø  VC++ code execution will be on an unmanaged memory space, where as C# code runs on safe, managed application domains.

 

 

3.    Comparison Matrix

 

Key

Parameter

Wght

(W)

VB.NET

C#

VC++

Rapid Application Development (RAD) Or

Time to Market

35

High

VB is best known for RAD.

It has large developer base in the industry and enables rapid development.

Medium-High

It is a new language and has a

comparatively smaller developer base in the industry.

Low-Medium

It is a language for low-level programming. GUI development will take comparatively more time.

Rating(R)

 

5

4                                  

3

Weighted Rating

 

175

140

105

Cost Saving

35

High

Needs lesser development effort and a short learning curve. Therefore cost saving is high.

Medium-High

Cost saving is intermediate between VB .NET and VC++. Depending on the nature of application and its complexity, it may be closer to that of VB .NET or VC++.

Medium

Cost saving is the least because the development effort is considerably higher.

Rating(R)

 

5

4

3

Weighted Rating

 

175

140

105

Performance

20

Medium

VB code is slightly slower than C# because in some instances it generates more lines of MSIL (Microsoft Intermediate Language) code. This difference in performance may not be visible in many applications.

Medium-High

C# code is slightly faster but difference may be insignificant because both VB.NET and C# code get converted into MSIL eventually.

Medium-High

VC++ code is faster than both C# and VB but the difference in performance across VC++, C# and VB may be insignificant in case of GUI development.

Rating(R)

 

3

4

4.5

Weighted Rating

 

60

80

90

Scalability and

Interoperability

15

High

VB.NET and C# scale equally well because this is supported by CLR (Common Language Runtime)

High

VB.NET and C# scale equally well because this is supported by CLR

High

Scalability is slightly better because of MFC. But this may be insignificant for GUI development.

Rating(R)

 

5

5

5

Weighted Rating

 

75

75

75

Availability of Information And Support

10

Medium-High

Documentation, technical support and sample source code are available from newsgroups/developer communities such as MSDN (Microsoft Developer Network).

Medium-High

Documentation, technical support and sample source code are available from newsgroups/developer communities such as MSDN (Microsoft Developer Network).

Medium-High

Documentation, technical support and sample source code are available from newsgroups/developer communities such as MSDN (Microsoft Developer Network).

Rating(R)

 

4

4

4

Weighted Rating

 

40

40

40

IDE Support

5

High

Has good support for IDE.

E.g. Intellisence

Medium-High

IDE support is not as good as VB.NET.

High

Well-developed and proven IDE.

Rating(R)

 

4.5

4

5

Weighted Rating

 

27.5

20

25

Well Structured

10

High

Can write structured code in VB.

High

Can Write structured code in C#

High

Can Write structured code in VC++

Rating(R)

 

5

5

5

Weighted Rating

 

50

50

50

Reliability/Maintenance

30

High

Because Memory management and object life cycle management is automatically handled, it is easier to write more reliable and maintainable code. Good inline documentation support

 

High

Because Memory management and object life cycle management is automatically handled, it is easier to write more reliable and maintainable code. Good inline documentation support

Medium

Although it has good inline documentation, programmer needs to manage memory and object life cycle himself and therefore it is more difficult to write reliable and maintainable code.

Rating(R)

 

5

5

3

Weighted Rating

 

150

150

90

Ease of Development

30

High

  • Richness in built in functions
  • Case insensitive
  • Declarative Code handling
  • Background compilation.
  • Re-allocation of arrays using Redim.
  • Short learning curve.

 

Medium-high

  • Support for unsigned data types.
  • Overloaded operators.
  • Steeper learning curve than VB.
  • Declarative Memory mgmt.

 

Medium

  • Steeper learning curve than C#.
  • Programming will be time consuming.
  • Memory mgmt done by developer. More control on object life cycle but at the same time code is more prone to memory leak and dangling pointers.
  • Mgmt of pointers is bit time consuming and causes run time errors.

 

Rating(R)

 

5

4

3.5

Weighted Rating

 

150

120

105

Support for Object Oriented Programming

15

Medium

Even though VB.NET supports object oriented programming, it would be difficult for old VB developers to switch to this new paradigm.

High

C# is designed for object oriented programming and developer community is mostly made up of previous C++, Java developers.

High

VC++ is designed for object-oriented programming.

Rating(R)

 

3

5

5

Weighted Rating

 

45

75

75

Microsoft Commitment

20

High

VB brought huge success to Microsoft and now it has a large user and developer community. Hence Microsoft is committed to this in the future as well.

High

This is designed for .NET development and has inherent features. Microsoft is equally committed to increase its usage.

High

VC++ will live for a long time because there will be times when you will have to develop components in C++ and then use Interop services to access them from .NET application. Microsoft is equally committed to its usage in low-level programming.

Rating(R)

 

5

5

5

Weighted Rating

 

100

100

100

Support on other platforms

20

Low

It is very less probable that VB will be supported on other platforms when CLR becomes available and therefore VB is not highly portable

High

C# will be supported on other platforms when   CLR becomes available.

Low

It is tied to Windows. Raw C++ can be used in different environments.

Rating(R)

 

1

5

2

Weighted Rating

 

20

100

40

 

GRAND TOTAL

 

 

1067.5

 

1090

900

 

4.    Scenarios

4.1. Scenario 1 – Speed and cost of application development.

If one wants to choose the language that aids rapid application development, the natural choice would be VB.NET or C# because of its simplicity and familiarity among the developer community. Still C# is a fairly new language and it has not yet become popular among developers. At the same time you can get the advantage of rich GUI in C#. You can avoid the development complexity of VC++.

4.2. Scenario 2 – Performance.

VC++ gives the best performance in any development, but it is not a RAD tool. In case of GUI, we can achieve almost same performance using VB.NET or C#. Theoretically both VB.NET and C# offer similar performance levels because both these languages compile the code into MSIL code which is then executed by CLR. But number of lines of MSIL code generated by C# will be slightly lesser because it uses a technique called reflection. For most practical applications the difference in performance would be negligible.

 

4.3. Scenario 3 – Scalability and Interoperability.

VC++ is very much scalable. Also code written in VC++ can interoperate with code written in VB.NET/C# or vice versa. We can develop complex computation intensive code in VC++ (resulting in superior performance) and GUI in VB.NET and/or C#. All the .NET compliance languages use the same CLR/CTS (Common Type System), so that interoperability is not an issue. As VB.NET and C# are supported by CLR, it doesn’t make any difference in terms of scalability and interoperability whether VB.NET or C# is chosen.

 

5.    Initial Recommendations

To sum up, all the three languages have their own advantages and disadvantages. VC++ is a good choice for time critical computation intensive code and therefore will give better performance. For GUI design, both VB.NET and C# on the whole do equally well. When it comes to taking advantage of the .NET features, C# is a little ahead as it conforms to OOAD standards.

 

We could use a good mix of VC++ and C# (and/or VB .NET) for development purposes. This will help us reduce development effort/time using the .NET features and also get the expected performance in low level modules.

 


신고

'프로그래밍 > C#.NET' 카테고리의 다른 글

VB.NET, C# and VC++ Comparison  (0) 2009.12.09
값이 오버플로우되는지 확인하기 - checked  (0) 2009.03.24
C# 정규식 예제  (1) 2009.03.17
.Net Framework 버젼별 포함된 기술들  (0) 2009.03.11

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret
C#에서는 다양한 키워드들을 제공하는데 이번에는 아래의 약간의 특별한 키워드에 대해 포스팅 할 예정이다.

- checked / unchecked

이 키워드는 오버플로우가 일어나는지 체크하여 오버플로우시 예외를 발생시킨다. 사용법은 아래와 같다.

checked( 체크할문장 )  또는 checked { 체크할 코드 블럭 }

예제

        static void Main(string[] args)
        {
            byte b1 = 200;
            byte b2 = 100;

            try
            {
                byte b3 = checked((byte)(b1 + b2));      //byte는 0부터 255까지의 값만 가질 수 있다!
                Console.WriteLine("b3 = {0}", b3);
            }
            catch (OverflowException e)
            {
                Console.WriteLine(e.Message);
            }
        }


반면에 unchecked 키워드는 checked 를 수행하는 코드 블럭 중 일부 코드 블록에서 발생할 수 있는 오버플로우는 무시하고 지나가고 싶을때에 사용된다.
신고

'프로그래밍 > C#.NET' 카테고리의 다른 글

VB.NET, C# and VC++ Comparison  (0) 2009.12.09
값이 오버플로우되는지 확인하기 - checked  (0) 2009.03.24
C# 정규식 예제  (1) 2009.03.17
.Net Framework 버젼별 포함된 기술들  (0) 2009.03.11

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

static void Main(string[] args)
{
        string str = "abcwDW2";
        Regex regex = new System.Text.RegularExpressions.Regex(@"^[0-9a-zA-Z]{1,100}$");

        Boolean ismatch = regex.IsMatch(str);
        if (!ismatch)
        {
            Console.WriteLine("숫자와 영문 소문자,대문자만 입력가능합니다.(글자제한100)");
        }
}


영문 소문자, 대문자와 숫자만 가능하도록 하는 유효성 체크에 사용될 만한 예제입니다.
글자수 제한도 저렇게 하는군요^^

신고

'프로그래밍 > C#.NET' 카테고리의 다른 글

값이 오버플로우되는지 확인하기 - checked  (0) 2009.03.24
C# 정규식 예제  (1) 2009.03.17
.Net Framework 버젼별 포함된 기술들  (0) 2009.03.11
3D 기초 강좌 - 1  (0) 2009.02.06

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글 하나 달렸습니다.
  1. 좋은 정보 얻고 갑니다 ^^
secret

.NET Framework 2.0에 포함된 기술

다음과 같은 기술이 .NET Framework 2.0에서 제공됩니다.

  • CLR(공용 언어 런타임)

  • 제네릭 형식 및 메서드에 대한 지원

  • C#, Visual Basic, C++ 및 J#용 컴파일러

  • 기본 클래스 라이브러리

  • ADO.NET

  • ASP.NET

  • Windows Forms

  • 웹 서비스

.NET Framework 3.0에 포함된 기술

.NET Framework 3.0을 컴퓨터에 설치하려면 .NET Framework 2.0이 필요합니다. .NET Framework 2.0이 없는 컴퓨터에 .NET Framework 3.0을 설치할 경우 .NET Framework 2.0이 자동으로 설치됩니다.

다음과 같은 기술이 .NET Framework 3.0에서 제공됩니다.

  • WPF(Windows Presentation Foundation).

  • WCF(Windows Communications Foundation)

  • Windows WF(Workflow Foundation)


.NET Framework 3.5에 포함된 기능

.NET Framework 3.5에서는 2.0 및 3.0의 기술에 대한 새 기능과 새 어셈블리 형식의 추가 기술이 소개됩니다. 다음과 같은 기술이 .NET Framework 3.5에서 제공됩니다.

  • LINQ

  • C#, Visual Basic 및 C++용 새 컴파일러

  • ASP.NET AJAX

  • 기본 클래스 라이브러리의 추가 클래스



    출처 : MSDN (ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.ko/dv_fxintro/html/f75a72de-e2f2-4a7a-9574-3f278684ea90.htm)

신고

'프로그래밍 > C#.NET' 카테고리의 다른 글

C# 정규식 예제  (1) 2009.03.17
.Net Framework 버젼별 포함된 기술들  (0) 2009.03.11
3D 기초 강좌 - 1  (0) 2009.02.06
데이터 바인딩 정복 1  (0) 2008.12.11

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

안녕하세요!

레브민호 입니다.

 

틈틈히 강좌를 하나 진행해볼까 합니다.

강좌 주제는 3D기초 강좌 입니다. 써먹을데가없습니다. 공부용입니다..ㅎㅎ

 

1. 호도법과 라디안

2. 사인과 코사인

3. 2D의 이해

4. 애니메이션

4. X-Y-Z축의 이해

5. 원근감

6. 3D공간 평면 회전

7. 3D공간 큐브 회전

 

이렇게 대충 목차를 정해보았습니다.

모든 강좌는 실버라이트 기반으로 작성되어질 예정입니다.

코드설명은 주석으로 대체할 예정이며 주로 이론을 정리할까 합니다.

 

저도 미숙하지만 공부한다는 생각으로 준비해보겠습니다.

, 마지막 강좌까지 얼마나 걸릴지 저도 장담은 못합니다. ^^;

 

=========================================================

1. 호도법과 라디안

2. 사인과 코사인

3. 2D의 이해

4. 애니메이션

4. X-Y-Z축의 이해

5. 원근감

6. 3D공간 평면 회전

7. 3D공간 큐브 회전

 

 

1. 호도법과 코사인

일상 생활에서 가장 널리 쓰이고 있는 것은 60분법이죠. 일반적으로 “45, 90이렇게

사용하는 방식입니다. 다시 말해 원 둘레를 360등분하여 각 원호의 중심각 크기를 1도로

하고 이것을 단위로 각을 측정합니다.

 

수학이나 공학에서는 60분법이 아닌 호도법을 사용하죠.

호도법은 반지름 r인 원에서 길이가 r인 원호에 대한 중심각 크기를 1호도 또는 1라디안

이라 하고 기호로 1rad로 씁니다. (그림생략-인터넷참조)

 

반지름 r인 원의 둘레는 2πr 이고 이것은 반지름의배란 의미가 되므로 원의 중심각은

2π rad 입니다. 이때 원의 중심각은 60분법에 의해 360° 이므로

2π rad = 360°

, π rad = 180° 입니다.

 

프로그래밍시 π Math.PI 로 사용할 수 있습니다.

 

첫 강좌.. 쉬워서 더 쓸 게 없군요. ^^;

 

 

그럼 예제 코드 들어갑니다.

 

CustomEllipse.xaml 공과 공 주변에 각을 표시합니다.

<Canvas x:Name="LayoutRoot" >

        <!--축구공-->

        <Image Source="ball.png" Width="200" Height="200" />

        <!--축구공 중앙 십자라인-->

        <Path Width="200" Height="200" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Data="M0,0 L1,0" Canvas.Left="0" Canvas.Top="100"/>

        <Path Width="200" Height="200" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Data="M0,0 L0,1" Canvas.Left="100" Canvas.Top="0"/>

        <!--축구공 주변 각도표시-->

        <TextBlock Width="40" Height="20" Canvas.Left="-30" Canvas.Top="95" Text="270˚" TextAlignment="Center" TextWrapping="Wrap">

            <TextBlock.RenderTransform>

                <RotateTransform CenterX="20" CenterY="10" Angle="90" />

            </TextBlock.RenderTransform>

        </TextBlock>

        <TextBlock Width="40" Height="20" Canvas.Left="75" Canvas.Top="-20" Text="180˚" TextAlignment="Center" TextWrapping="Wrap">

        <TextBlock.RenderTransform>

            <RotateTransform CenterX="20" CenterY="10" Angle="180" />

        </TextBlock.RenderTransform>

        </TextBlock>

        <TextBlock Width="40" Height="20" Canvas.Left="190" Canvas.Top="95" Text="90˚" TextAlignment="Center" TextWrapping="Wrap">

        <TextBlock.RenderTransform>

            <RotateTransform CenterX="20" CenterY="10" Angle="270" />

        </TextBlock.RenderTransform>

        </TextBlock>

        <TextBlock Width="40" Height="20" Canvas.Left="80" Canvas.Top="200" Text="0˚" TextAlignment="Center" TextWrapping="Wrap"/>

    </Canvas>

 

 

 

Page.xaml

<UserControl x:Class="lecture01.Page"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:user="clr-namespace:lecture01"         

    Width="800" Height="300" Loaded="UserControl_Loaded">

    <Canvas x:Name="LayoutRoot" Background="Beige">

 

        <!--원과 라인-->

        <user:CustomEllipse x:Name="MyEllipse" Canvas.Left="20" Canvas.Top="20">

            <user:CustomEllipse.RenderTransform>

                <TransformGroup>

                    <RotateTransform CenterX="100" CenterY="100" Angle="0" />

                </TransformGroup>

            </user:CustomEllipse.RenderTransform>

        </user:CustomEllipse>          

        <Path x:Name="MyEllipseline" Width="100" Height="100" Fill="#FFFFFFFF" Stretch="Fill" StrokeThickness="2" Stroke="#FF000000" Data="M0,0 L1,0" Canvas.Left="120" Canvas.Top="220"/>

   

        <!--재생시간-->

        <TextBlock Text="시간:" Canvas.Left="10" Canvas.Top="235"/>

        <TextBox x:Name="BoxSecond" Width="30" Height="22" Canvas.Left="40" Canvas.Top="232" Text="3" TextAlignment="Center" KeyUp="BoxSecond_KeyUp"/>

        <TextBlock Text="" Canvas.Left="73" Canvas.Top="235"/>

       

        <!--제어버튼-->

        <Button x:Name="BtnStart" Content="Start" Canvas.Left="10" Canvas.Top="260" Width="80" Height="30" Click="BtnStart_Click" />

        

        <!--상태표시-->

        <TextBlock x:Name="TxtDistance" Canvas.Left="100" Canvas.Top="250" Width="100" Height="20" Text="Distance : 0"/>

        <TextBlock x:Name="TxtAngle" Canvas.Left="100" Canvas.Top="270" Width="100" Height="20" Text="Angle : 0˚"/>

        <TextBlock x:Name="TxtRadian" Canvas.Left="190" Canvas.Top="270" Width="100" Height="20" Text="Radian : 0 rad"/>

       

        <!--설명-->

        <TextBlock Canvas.Left="300" Canvas.Top="230" Width="100" Height="20"

Text="1 radian = 2*r (diameter)"/>

        <TextBlock Canvas.Left="300" Canvas.Top="245" Width="100" Height="20" Text="360˚(degree) = 3.14 * 2 * r"/>

        <TextBlock Canvas.Left="300" Canvas.Top="260" Width="100" Height="20" Text="radian : π(3.14) = degree : 180"/>

        <TextBlock Canvas.Left="300" Canvas.Top="275" Width="100" Height="20"

Text="radian = degree * PI / 180"/>

    </Canvas>

</UserControl>

 

 

 

 

 

Page.xaml.cs

public partial class Page : UserControl

    {

        int direct = 1;           // 객체 회전 방향 (1:오른쪽, -1: 왼쪽)

        bool IsMove;            // 객체 회전

        bool IsPause;            // 객체 회전 잠시 중지       

        double girth;            // 객체 둘레 (2*PI*r)

        double r = 200 / 2;      // 객체의 반지름

        double beginningPostion; // 객체의 최초 Canvas.Left

        Storyboard currentMove;  // 이동,회전 애니메이션

        Storyboard statusChange; // 객체 상태값을 보여주기 위함

 

        public Page()

        {

            InitializeComponent();

        }

 

        private void UserControl_Loaded(object sender, RoutedEventArgs e)

        {          

            girth = 2 * Math.PI * r;

            beginningPostion = (double)MyEllipse.GetValue(Canvas.LeftProperty);

            MyEllipseline.Width = girth;      // 객체 아래 라인의 길이를 객체 둘레만큼 변경

           

            // 객체 상태값을 보여준다.

            statusChange = new Storyboard();

            statusChange.Completed += new EventHandler(status_Completed);

            statusChange.Begin();

        }

 

        /// <summary>

        /// 객체의 상태 값에따라 Textblock 값을 변경한다.

        /// </summary>

        void status_Completed(object sender, EventArgs e)

        {                       

            TransformCollection myTransforms = MyEllipse.RenderTransform.GetValue(TransformGroup.ChildrenProperty) as TransformCollection;

            RotateTransform roate = myTransforms[0] as RotateTransform;

            TxtAngle.Text = string.Format("Angle : {0:F1}˚", roate.Angle);

            TxtRadian.Text = string.Format("Radian : {0:F1}rad", roate.Angle * Math.PI / 180);

            TxtDistance.Text = string.Format("Distance : {0:F2}", (double)MyEllipse.GetValue(Canvas.LeftProperty) -20);

 

            statusChange.Begin();            // 계속 반복

        }

 

        private void BtnStart_Click(object sender, RoutedEventArgs e)

        {

            // 이동중일때

            if (IsMove)

            {

                // 잠시 멈춤 상태면 재개한다

                if (IsPause)

                {

                    currentMove.Resume();

                    IsPause = false;

                    BtnStart.Content = "Pause";

                }

                // 잠시 멈춘다

                else

                {

                    currentMove.Pause();

                    IsPause = true;

                    BtnStart.Content = "Resume";

                }

            }

            // 이동이 끝났을때

            else

            {              

                int playTime = int.Parse(BoxSecond.Text);

                // 오른쪽으로 이동 시작

                if (direct == 1)

                {

                    currentMove =

ObjectMove(MyEllipse, beginningPostion + girth, 360, playTime);

                    currentMove.Begin();

                }

                // 왼쪽으로 이동 시작

                else if (direct == -1)

                {

                    currentMove = ObjectMove(MyEllipse, beginningPostion, 0, playTime);

                    currentMove.Begin();

                }

                BtnStart.Content = "Pause";

                IsMove = true;

            }           

        }

 

        /// <summary>

        /// 애니매이션을 위한 스토리보드 객체 생성

        /// </summary>

        /// <param name="element">이동할 객체</param>

        /// <param name="targetPostion">이동할 X </param>

        /// <param name="targetAngle">회전할 angle</param>

        /// <param name="durationTime">재생 시간</param>

        /// <returns></returns>

        private Storyboard ObjectMove(FrameworkElement element, double targetPostion, double targetAngle, double durationTime)

        {

            // 스토리 보드 객체와 재생 시간

            Storyboard sb = new Storyboard();

            Duration duration = new Duration(TimeSpan.FromSeconds(durationTime));

            sb.Duration = duration;

 

            // 객체의 수평 이동

            DoubleAnimation myDoubleAnimation = new DoubleAnimation();           

            myDoubleAnimation.Duration = duration;           

            sb.Children.Add(myDoubleAnimation);

            Storyboard.SetTarget(myDoubleAnimation, element);

            Storyboard.SetTargetProperty(myDoubleAnimation,

new PropertyPath("(Canvas.Left)"));

            myDoubleAnimation.To = targetPostion;

 

            // 객체의 회전

            DoubleAnimation rotateAnimation = new DoubleAnimation();

            rotateAnimation.Duration = duration;

            sb.Children.Add(rotateAnimation);

            Storyboard.SetTarget(rotateAnimation, element);

            Storyboard.SetTargetProperty(rotateAnimation,

                new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(RotateTransform.Angle)"));

            rotateAnimation.To = targetAngle;

 

            sb.Completed += new EventHandler(sb_Completed); //애니메이션이 끝났을때 이벤트

            return sb;

        }

 

        /// <summary>

        /// 애니메이션이 끝나면 방향을 바꾸고 플래그 값을 변경한다.

        /// </summary>

        void sb_Completed(object sender, EventArgs e)

        {

            direct *= -1;

            IsMove = false;

            BtnStart.Content = "Start";

        }

 

 

        /// <summary>

        /// 임시 예외처리

        /// </summary>

        private void BoxSecond_KeyUp(object sender, KeyEventArgs e)

        {

            if (e.Key >= Key.A && e.Key <= Key.Z)

                (sender as TextBox).Text = "";

        }

    }

 

신고

'프로그래밍 > C#.NET' 카테고리의 다른 글

.Net Framework 버젼별 포함된 기술들  (0) 2009.03.11
3D 기초 강좌 - 1  (0) 2009.02.06
데이터 바인딩 정복 1  (0) 2008.12.11
XAML (Extensible Application Markup Language) 개요  (0) 2008.12.02

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret
A를 B에 바인딩을 시킨다는 것은 즉, A와 B를 묶는다는 개념이다.
이와 마찬가지로 데이터 바인딩은 데이터를 어떠한 곳에 묶어놓는 것인데, 텍스트 박스에 묶으면 텍스트 박스에 데이터가 표시되고
리스트에 묶으면 리스트에 데이터가 표시되는 것이다.

간단한 예제로 TextBlock에 문자를 바인딩 시키는 예제를 보자.

1. XAML에 TextBlock 생성하고 이름을 준다.
     <Grid x:Name="LayoutRoot" Background="White">
        <TextBlock x:Name="MyText" />
    </Grid>

2. Load 이벤트를 추가시킨다.
 Loaded="UserControl_Loaded"
*UserControl 태그 속에서 Loaded를 치고 엔터치면 대화상자가 나오는데 여기서 새 이벤트 처리기를 선택하면 자동으로 생성된다.


3. XAML 비하인드 코드(.cs)에서 아래와 같은 코드를 삽입한다.
 - using 추가
 using System.Windows.Data;

 - 페이지 Load시 바인딩 되도록 구현

         private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            string s = "안녕하세요.";
            Binding b = new Binding();
            b.Mode = BindingMode.OneTime;
            b.Source = s;

            MyText.SetBinding(TextBlock.TextProperty, b);
        }



위의 예제에서는 Binding 클래스를 이용하여 TextBlock에 문자열을 바인딩하고 있다.
여기서 바인딩의 모드(b.Mode) 를 짚어보고 넘어가자.

 Mode 설명
 TwoWay 대상 속성이나 소스 속성중 하나가 변경되면 자동으로 업데이트한다. 편집 가능한 폼이나 대화형 UI등에 유용하다 
 OneWay  소스 속성이 변경될 때 대상 속성을 업데이트 한다. 대상 속성의 변경 내용을 모니터링 할 필요가 없을 경우 이 방법을 쓰면 TwoWay보다 오버헤드를 줄일 수 있다
 OneTime  응용 프로그램이 시작되거나 DataContext가 변경될때만 대상 속성을 업데이트 한다.
신고

'프로그래밍 > C#.NET' 카테고리의 다른 글

3D 기초 강좌 - 1  (0) 2009.02.06
데이터 바인딩 정복 1  (0) 2008.12.11
XAML (Extensible Application Markup Language) 개요  (0) 2008.12.02
[예제] 객체 끌어 놓기  (0) 2008.12.01

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret
1. XAML의 정의

 - XAML(Extensible Application Markup Language)은 선언적 언어로 XAML태그를 이용하여 시각적인 사용자 인터페이스 요소를
  만들 수 있습니다. 별도의 코드숨김 파일을 가지고 있어서 이벤트를 처리하거나 선언된 개체들을 조작할 수 있죠.
  여기서는 실버라이트에서 쓰이는 XAML을 기본으로 진행 하겠습니다.

 - 실버라이트 프로젝트 생성시 초기 XAML코드

<UserControl x:Class="SilverlightApplication3.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">

    </Grid>
</UserControl>


- XAML은 XML에 기반을 두고 있으며, 대/소문자를 구분합니다.



2. 개체 선언

 - 여는 태그와 닫는 태그를 이용한 선언
   <objectName> </objectName>
예제
<Canvas>
  <Rectangle />
</Canvas>
  위처럼 개체 요소 구문을 사용하여 선언하며, 일부 개체는 다른 개체를 포함시킬 수도 있습니다.
  그리고 편의상 개체가 다른 개체를 포함하지 않을 경우에 <Rectangle /> 처럼 자체적으로 닫는 태그를 바로 사용할 수 있습니다.



3. 개체 속성

 - 특성 구문을 사용
  <objectName propertyName="propertyValue" .../>
예제
 <Rectangle Width="100" Height="100" Fill="Blue" />

 - 속성 구문을 사용
<object>
   <object.Property>
      PropertyValueAsObjectElement
   </object.Property>
</object>
예제
 <Rectangle
  Width="100"
  Height="100">
  <Rectangle.Fill>
    <SolidColorBrush Color="Blue"/>
  </Rectangle.Fill>
</Rectangle>

 - 컨텐츠 요소 구문을 사용
   일부 실버라이트 개체는 속성 이름을 생략하고 단순히 소유하는 형식의 개체 요소 태그내에 값을 제공하여 속성을 설정 할 수 있습니다.
예제
 <TextBlock>
  Hello!
</TextBlock>
* 위의 경우 Text속성을 명시적으로 지정하지 않고 TextBlock의 Text속성을 설정하였다.

 - 컬렉션 구문을 사용
예제
<StackPanel>
  <!-- 수직 그라디언트로 칠해진 사각형 -->
  <Rectangle Width="200" Height="100">
    <Rectangle.Fill>
      <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
        <GradientStop Color="Yellow" Offset="0.0" />
        <GradientStop Color="Red" Offset="0.25" />
        <GradientStop Color="Blue" Offset="0.75" />
        <GradientStop Color="LimeGreen" Offset="1.0" />
      </LinearGradientBrush>
    </Rectangle.Fill>
  </Rectangle>
</StackPanel>
 

컬렉션 구문과 콘텐츠 구문의 조합은 패널과 같은 컨트롤 합성에 광범위하게 사용되는 클래스에서 흔히 볼 수 있습니다.

다음 예제는 특성 구문을 사용하여 Rectangle의 채우기를 설정합니다. Fill속성은 SolidColorBrush를 사용하여 속성을 설정하는데
특성구문을 사용할 수 있도록 합니다.
예제
 <Rectangle Width="100" Height="100" Fill="Blue" />
 <Rectangle Width="100" Height="100">
  <Rectangle.Fill>
    <SolidColorBrush Color="Blue"/>
  </Rectangle.Fill>
</Rectangle>

*Brush형식 변환기때문에 SolidColorBrush는 리소스 참조나 바인딩을 사용하지 않고 새 Fill 값을 만드는 데 속성 요수 구문이나
특성 구문중 하나를 선택할 수 있습니다. 아래 예제처럼 다른 Brush형식의 경우에는 Fill에 대한 속성 요소 구문을 사용하고
ImageBrush를 개체 요소로 선언하여 속성값을 제공하거나, 태그확장을 사용해야 합니다.
 <Rectangle Width="100" Height="100">
  <Rectangle.Fill>
    <ImageBrush ImageSource="forest.jpg"/>
  </Rectangle.Fill>
</Rectangle>



4. 태그 확장

중괄호 ( { 와 } )는 태그확장 사용을 의미하며 실버라이트 XAML 구현에서 주로 사용되는 개념입니다.
형식에 변환기가 없고 참조 형식 값을 사용하는 속성에는 항상 새 인스턴스를 만드는 속성 요소 구문 또는 태그 확장을 통한
개체 참조가 필요합니다.(실버라이트 태그확장은 기존 인스턴스를 반환)

 - Binding : 데이터 바인딩 제공
 - StaticResource : 정의된 리소스 참조하며 모든 XAML 속성 특성에 대한 값 제공
 - ResourceDictionary : 실버라이트 기반 응용프로그램의 구성요소에 사용되는 키가 지정된 리소스 사전 제공
 - TemplateBinding : XAML에서 템플릿 개체의 코드 속성과 상호 작용할 수 있는 컨트롤 템플릿 제공

예제
 <Canvas.Resources>
  <Style TargetType="Border" x:Key="PageBackground">
    <Setter Property="BorderBrush" Value="Blue"/>
    <Setter Property="BorderThickness" Value="5"/>
  </Style>
</Canvas.Resources>
...
<Border Style="{StaticResource PageBackground}">
  ...
</Border>




5. 이벤트

XAML은 개체 및 개체 속성을 선언하는 것 이외에도 개체에 이벤트 처리기를 연결하는 구문도 제공합니다.
특성이름은 이벤트 이름을 지정하고, 특성값으로는 코드에서 정의하는 이벤트 처리기 함수의 이름을 지정합니다.

XAML 루트 요소에 x:Class 특성이 있을 경우 페이지에 관리되는 API를 사용하는 것이고 없으면 JavaScript API를 사용하게 됩니다.
페이지에서 관리되는 API의 경우 코드 숨김 파일에 이벤트 처리기 함수가 작성되어 있어야 합니다.

예제
Page.xaml
     <StackPanel x:Name="LayoutRoot" Background="White">
        <TextBlock x:Name="Text1"  Text="버튼을 클릭하세요." />
        <Button Content="클릭" Width="100" Height="50" Click="Button_Click"/>
    </StackPanel>
Page.xaml.cs
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Text1.Text = "버튼이 클릭되었습니다.";
        } 

* 코드숨김 파일은 XAML파일이 컴파일될때 네임스페이스와 클래스를 XAML페이지 루트 요소의 x:Class 특성으로 지정하여 식별합니다.



6. XAML 루트 요소 및 xmlns

XAML 파일에는 하나의 루트 요소만 있어야 합니다.
루트 요소에는 특성 xmlns 및 xmlns:x 도 포함이 됩니다. 이러한 특성은 태그가 참조하는 요소의 정의가 포함된 XML 네임스페이스를 XAML 프로세스에 알려줍니다.

기본 XML 네임스페이스는 거의 항상 실버라이트 클라이언트 네임스페이스(http://schemas.microsoft.com/client/2007)에  매핑이 됩니다. 아래와 같이 표기합니다.
xmlns="http://schemas.microsoft.com/client/2007"

xmlns:x 특성은 추가적인 XML 네임스페이스를 나타내며 이 맵핑에 있는 파일의 태그에서 참조될때 구성 요소 앞에는 x:가 접두사로 붙습니다. 이 x: 접두사는 실버라이트 기반 프로젝트용 템플릿, 예제 및 설명서 전체에서 XAML 네임스페이스를 매핑 하는데 사용됩니다.아래와 같이 표기합니다.
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

다음은 가장 많이 사용하게 될 x: 접두사/XAML 네임스페이스 프로그래밍 구문입니다.

 - x:Key : ResourceDictionary 의 각 리소스에 대한 고유키 설정
 - x:Class : XAML 페이지에 대한 코드 숨김을 제공하는 클래스에 대한 CLR 네임스페이스 및 클래스 이름을 지정
 - x:Name : XAML에 정의된 개체 요소가 처리된 후 런타임 코드에 있는 인스턴스에 대한 런타임 개체 이름 지정


신고

'프로그래밍 > C#.NET' 카테고리의 다른 글

데이터 바인딩 정복 1  (0) 2008.12.11
XAML (Extensible Application Markup Language) 개요  (0) 2008.12.02
[예제] 객체 끌어 놓기  (0) 2008.12.01
Silverlight 2 Developer Reference  (0) 2008.11.23

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

1. 새프로젝트 -> DragAndDropSimple 생성
2. XAML 코드
 그리드 대신 캔버스로 바꾼 후 사각형 하나를 추가시킨다.

 <UserControl x:Class="DragAndDropSimple.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="300">
  <Canvas x:Name="rootCanvas"  >

    <!-- 이동할 사각형 개체 -->
    <Rectangle
    MouseLeftButtonDown="Handle_MouseDown"
    MouseMove="Handle_MouseMove"
    MouseLeftButtonUp="Handle_MouseUp"
    Canvas.Left="30" Canvas.Top="30" Fill="Red"
    Width="50" Height="50" />
  </Canvas>

</UserControl>



3. C#코드
마우스 왼쪽 버튼 다운시, 업시, 마우스 이동시에 대한 이벤트를 처리해준다.

 // 마우스 클릭으로 이동중인지 체크를 위한 변수와 포인터 위치를 위한 변수
bool isMouseCaptured;
double mouseVerticalPosition;
double mouseHorizontalPosition;

public void Handle_MouseDown (object sender, MouseEventArgs args)
{
    Rectangle item = sender as Rectangle;
    mouseVerticalPosition = args.GetPosition(null).Y;
    mouseHorizontalPosition = args.GetPosition(null).X;
    isMouseCaptured = true;
    item.CaptureMouse();
}

public void Handle_MouseMove(object sender, MouseEventArgs args)
{
    Rectangle item = sender as Rectangle;
    if (isMouseCaptured)
    {

        // 개체의 현재 위치를 계산
        double deltaV = args.GetPosition(null).Y - mouseVerticalPosition;
        double deltaH = args.GetPosition(null).X - mouseHorizontalPosition;
        double newTop = deltaV + (double)item.GetValue(Canvas.TopProperty);
        double newLeft = deltaH + (double)item.GetValue(Canvas.LeftProperty);

        // 개체의 위치 적용
        item.SetValue(Canvas.TopProperty, newTop);
        item.SetValue(Canvas.LeftProperty, newLeft);

        // 멤버 변수 갱신
        mouseVerticalPosition = args.GetPosition(null).Y;
        mouseHorizontalPosition = args.GetPosition(null).X;
    }
}

public void Handle_MouseUp(object sender, MouseEventArgs args)
{
    Rectangle item = sender as Rectangle;
    isMouseCaptured = false;
    item.ReleaseMouseCapture();
    mouseVerticalPosition = -1;
    mouseHorizontalPosition = -1;
}


4. 참고
 - GetPosition( ) : 전체 플러그인 좌표계를 기준으로 지정시 element 매개변수를 null로 설정
 - CaptureMouse( ) / ReleaseMouseCapture( ) : 마우스를 캡쳐한 개체는 마우스 포인터가 해당 경계내에 있는지 여부에 관계없이 마우스 입력을 받을 수 있다.

 

신고

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

실버라이트2 기준
Developer Reference 이미지 하나 올립니다.
다른이름으로 사진 저장 하시면 될 듯 합니다.
 
조금더 고화질(6750x4200)은 여기서 받으실 수 있습니다.
Silverlight 2 Developer Reference
신고

'프로그래밍 > C#.NET' 카테고리의 다른 글

[예제] 객체 끌어 놓기  (0) 2008.12.01
Silverlight 2 Developer Reference  (0) 2008.11.23
실버라이트 기능별 데모 영상  (0) 2008.11.21
실버라이트 시작하기  (0) 2008.11.21

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

이번 실버라이트 관련 프로젝트를 시작하기 앞서 정리했던 내용들 입니다.

1. Deep Zoom

- 영화나 광고에서 봤던, 광대한 영역의 이미지에서 극도로 줌인하여 아주 미세한 부분의 이미지를 명확하고 세밀하게 볼 수 있는 것처럼 구현하기 위해, 미세한 각 image들을 모아 광대한 Image로 만든 후, 이를 줌아웃하여 보여주는 기법

- silverlight에서는 기존에 선보였던 seadragon 기술을 silverlight에서 구현되도록 한 것인데, Multi resolution images를 MultiScaleImage object 에 loading 함으로써 가능하다.

<!-- xaml code -->

<MultiScaleImage x:Name="msi" MinHeight="480" MinWidth="640" Height="768" Width="1024"/>

// behind code

this.msi.Source = new DeepZoomImageTileSource(new Uri("GeneratedImages/dzc_output.xml", UriKind.Relative));

- 구현된 사이트

http://memorabilia.hardrock.com/


- SITE : http://www.silverlightshow.net/showcase/randomizingimagesdemo/demo.html

- Source :

http://www.silverlightshow.net/showcase/randomizingimagesdemo/RandomizingImagesDemo.zip

2. 위젯

http://www.silverlightshow.net/items/Silvester-A-Silverlight-Twitter-Widget.aspx (소스포함)


3. 그래프 표현

- http://www.iterature.com/dadameter/rrengine.php

-

4. 정다면체

- http://www.picturespice.com/ps/Polyhedra/ClientBin/TestPage.html

5. 이미지 뷰

- http://imagebot.org/silverlight/picview/

6. 차트 컨트롤

- http://www.visifire.com/silverlight_chart_designer.php

7 페이지 넘기기

- http://pwp.netcabo.pt/deviations/dev01/default.html

- 소스 : http://pwp.netcabo.pt/deviations/dev01/PageTurn2%20Run%2020081015a.zip

8. 슬라이드 창 효과

- http://firstfloorsoftware.com/slideshow/slideshow-2-preview/

사이드에 있는 원과 중앙의 원을 통해 마우스로 창을 자유롭게 컨트롤 가능

- 프로젝트에서 창 개념에 도입하기에 적당한 기능

9. 포탈에 적용된 실버라이트

- http://www.tafiti.com

- 이미지나 사이트등의 스크랩기능이 포함되어 있다. (drag & drop)

10. 3D 이미지 로테이션

http://www.shinedraw.com/3d-illusion/flash-and-silverlight-3d-image-rotation/

11. 전환 효과

- http://www.microsoft.com/korea/20th/index.htm

 

[ 실버라이트 관련 한국어 블로그 ]

1) 기술
UX팩토리 http://uxfactory.com/ - UX 기술 트렌드
철수네
 http://blogs.msdn.com/bkchung/ - 새버전 출시 소식
준서아빠 http://uxkorea.net/ - 기술 설명 & 적용 방안
중스닷넷
 http://joongs.net/ - 신기술 및 적용사례 소개

2) 개발
세티 http://joongs.net/ - 강좌 &기술문서 번역
이과장
 http://www.feelmind.com/ - 강좌 &새소식 &사진 후기
ONESTONE
 http://onestone.tistory.com/ - 강좌 &세미나 후기
공도소프트 http://gongdo.tistory.com/ - 개발 노하우 &각종 실험
길버라이트 http://gilverlight.net/ - 사람들 소식 & 문제해결 팁

3) 디자인
짱묜
 http://zzangmyon.tistory.com/ - 디자인 &블렌드 강좌
피터씨 http://peterc.tistory.com/ - 블렌드 강좌4) 팁&소스
에러천일 http://error1001.com/ - 각종 에러 해결 방법
데모집
 http://demozip.com/ - 기초 소스 코드


[ 기타 실버라이트 각종데모 ]

1. 드래그앤 드랍 가능한 리스트

- http://shiverlight.net/Demos_v2/DraggableListBox/

2. 마우스 위치 영역인식(빨간테두리) 하여 좌우 스크롤

http://shiverlight.net/

신고

'프로그래밍 > C#.NET' 카테고리의 다른 글

[예제] 객체 끌어 놓기  (0) 2008.12.01
Silverlight 2 Developer Reference  (0) 2008.11.23
실버라이트 기능별 데모 영상  (0) 2008.11.21
실버라이트 시작하기  (0) 2008.11.21

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret