블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

C#에서 포인터

Programming/C# / 2011. 11. 15. 14:18

Marshal.PtrToStructure 메서드 (IntPtr, Type)

.NET Framework 4

관리되지 않는 메모리 블록의 데이터를 지정된 형식의 새로 할당된 관리되는 개체로 마샬링합니다.

네임스페이스:  System.Runtime.InteropServices
어셈블리:  mscorlib(mscorlib.dll)
[ComVisibleAttribute(true)]
public static Object PtrToStructure(
	IntPtr ptr,
	Type structureType
)

매개 변수

ptr
형식: System.IntPtr
관리되지 않는 메모리 블록에 대한 포인터입니다.
structureType
형식: System.Type
만들 개체의 형식입니다. 이 개체는 서식이 지정된 클래스나 구조체를 나타내야 합니다. 

반환 값

형식: System.Object
ptr 매개 변수가 가리키는 데이터가 있는 관리되는 개체입니다.
예외상황
ArgumentException

structureType 매개 변수 레이아웃이 Sequential 또는 Explicit이 아닌 경우

또는

structureType 매개 변수가 제네릭 형식인 경우

ArgumentNullException

structureType는 Nothing입니다.

PtrToStructure는 주로 구조체 매개 변수를 System.IntPtr 값으로 나타낼 때 COM interop 및 플랫폼 호출에 필요합니다. 값 형식을 이 오버로드 메서드에 전달할 수 있습니다. 이 경우 반환된 개체는 boxing된 인스턴스입니다.

다음 예제에서는 관리되는 구조체를 만들고 이를 관리되지 않는 메모리로 전달한 다음 PtrToStructure 메서드를 사용하여 다시 관리되는 메모리로 전달합니다.

using System;
using System.Runtime.InteropServices;

public struct Point
{
    public int x;
    public int y;
}

class Example
{

    static void Main()
    {

        // Create a point struct.
        Point p;
        p.x = 1;
        p.y = 1;

        Console.WriteLine("The value of first point is " + p.x + " and " + p.y + ".");

        // Initialize unmanged memory to hold the struct.
        IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(p));

        try
        {

            // Copy the struct to unmanaged memory.
            Marshal.StructureToPtr(p, pnt, false);

            // Create another point.
            Point anotherP;

            // Set this Point to the value of the 
            // Point in unmanaged memory. 
            anotherP = (Point)Marshal.PtrToStructure(pnt, typeof(Point));

            Console.WriteLine("The value of new point is " + anotherP.x + " and " + anotherP.y + ".");

        }
        finally
        {
            // Free the unmanaged memory.
            Marshal.FreeHGlobal(pnt);
        }



    }

}


다음 예제에서는 PtrToStructure 메서드를 사용하여 관리되지 않는 메모리 블록을 관리되는 구조체로 마샬링하는 방법을 보여 줍니다.

		[StructLayout(LayoutKind.Sequential)]

		public class  INNER

		{

			[MarshalAs(UnmanagedType.ByValTStr, SizeConst =  10)]

			public string field1 = "Test";

	 

		}	

		[StructLayout(LayoutKind.Sequential)]

		public struct OUTER

		{

			[MarshalAs(UnmanagedType.ByValTStr, SizeConst =  10)]

			public string field1;

			[MarshalAs(UnmanagedType.ByValArray, SizeConst =  100)]

			public byte[] inner;

		}





		[DllImport(@"SomeTestDLL.dll")]

		public static extern void CallTest( ref OUTER po);



		static void Main(string[] args)

		{

			OUTER ed = new OUTER();

			INNER[] inn=new INNER[10];

			INNER test = new INNER();

			int iStructSize = Marshal.SizeOf(test);



			int sz =inn.Length * iStructSize;

			ed.inner = new byte[sz];



			try

			{

				CallTest( ref ed);

			}

			catch(Exception e)

			{

				Console.WriteLine(e.Message);

			}

			IntPtr buffer = Marshal.AllocCoTaskMem(iStructSize*10);

			Marshal.Copy(ed.inner,0,buffer,iStructSize*10);

			

			int iCurOffset = 0;

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

			{

				

				inn[i] = (INNER)Marshal.PtrToStructure(new
IntPtr(buffer.ToInt32()+iCurOffset),typeof(INNER) );

				iCurOffset += iStructSize;

			}

			Console.WriteLine(ed.field1);

			Marshal.FreeCoTaskMem(buffer);

		}


.NET Framework

4, 3.5, 3.0, 2.0, 1.1, 1.0에서 지원

.NET Framework Client Profile

4, 3.5 SP1에서 지원
  • SecurityCriticalAttribute  

    직접 실행 호출자에 대한 완전 신뢰가 필요합니다. 이 멤버는 부분적으로 신뢰할 수 있거나 투명한 코드에서 사용할 수 없습니다.

Windows 7, Windows Vista SP1 이상, Windows XP SP3, Windows XP SP2 x64 버전, Windows Server 2008(Server Core는 지원되지 않음), Windows Server 2008 R2(Server Core는 SP1 이상에서 지원됨), Windows Server 2003 SP2

.NET Framework에서 모든 플랫폼의 전체 버전을 지원하지는 않습니다. 지원되는 버전의 목록을 보려면 .NET Framework 시스템 요구 사항을 참조하십시오.



반응형
Posted by blueasa
, |

전체 소스
     


특별히 설명이 필요 없을거 같습니다.





using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace WATTreeView

{

    public partial class Form1 : Form

    {

        Random m_random = new Random(); // 랜덤인스턴스생성

        public Form1()

        {

            InitializeComponent();

        }

 

        private void Form1_Load(object senderEventArgs e)

        {

            treeView1.Nodes.Clear();

        }

 

        // 선택된노드에노드추가하기

        private void button1_Click(object senderEventArgs e)

        {

            TreeNode node = treeView1.SelectedNode;

            if (null == node)

                treeView1.Nodes.Add(m_random.Next(0, 100).ToString());

            else

            {

                node.Nodes.Add(m_random.Next(0, 100).ToString());

                node.Expand();

            }

        }

 

        // 선택노드삭제

        private void button2_Click(object senderEventArgs e)

        {

            TreeNode node = treeView1.SelectedNode;

            if (null != node)

            {

                node.Remove();

            }

        }

 

        // 체크된노드삭제

        private void btnDelCheck_Click(object senderEventArgs e)

        {

            foreach (TreeNode n in treeView1.Nodes)

            {

                if (n.Checkedn.Remove();

            }

        }

    }

}


출처 : 
http://pcsak3.com/48 

반응형

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

C# C++ COM Interop  (0) 2011.11.15
C#에서 포인터  (0) 2011.11.15
TreeView에서 Node 검색 및 카테고리 구현  (0) 2011.11.14
PropertyGrid 속성 값 가져오기(사용하기)  (0) 2011.11.02
PropertyGrid and Drop Down properties  (0) 2011.11.02
Posted by blueasa
, |

프로그래밍, C#, Web, TreeViewNode 검색, 카테고리 구현

갓 C#을 접하게된 어설픈 프로그래머 입니다. C#을 하면서 익힌 스킬을 공유하고자 합니다. 만약, 고쳐야할 부분이 있으면 알려주시면 감사하겠습니다. 

이번에 다룰 부분은 TreeView 입니다.

TreeView(트리뷰)는 가장 쉽게 얘기해서 Tistory의 카테고리를 표현하는 것처럼 그룹들을 보기 좋게 트리형태로 표현해 주는 컴포넌트입니다. 즉, 부모가 있고 부모 밑에는 자식이 있고 다시 손자가 있는 일종의 계층구조를 표시해 주는 것입니다.

Tistory의 카테고리를 표현하는 것도 일종의 TreeView 형태입니다. 당연히 C#에서 TreeView를 지원합니다. 

그럼 사용해봐야겠네요. (WebControls.TreeView 기준입니다.)

TrewView를 웹 폼에 추가를 합니다.(여기서는 이름을 trvGroup이라 명명하였습니다.)
//최상위 그룹을 생성합니다.  4Cs라고 가정합니다.
TreeNode trvNode = new TreeNode();
trvNode.Text ="4Cs";
trvNode.Value = "0";

// 4Cs라는 트리의 하부에 표현할 IT,종이접기,사는이야기 를 구성합니다.

//IT 항목 추가
TreeNode trvNodeIT = new TreeNode(); // TreeNode 인스턴스를 생성합니다. 이름은 trvNodeIT라고 하였습니다.
trvNodeIT.Text = "IT";                           // 트리뷰 상에 표시할 이름
trvNodeIT.Value = "01";                         // 구분할 값(프로그램을 내부에 사용할 값)
trvNode.ChildNodes.Add(trvNodeIT);     // 4Cs하부의 자식노드에 추가합니다.

// 종이접기 항목 추가
TreeNode trvNodeOrigami = new TreeNode();
trvNodeOrigami.Text = "종이접기";
trvNodeOrigami.Value = "02";
trvNode.ChildNodes.Add(trvNodeOrigami);

//사는이야기 항목 추가
TreeNode trvNodeLife = new TreeNode();
trvNodeLife.Text = "사는이야기";
trvNodeLife.Value = "03";
trvNode.ChildNodes.Add(trvNodeLife);

// 최종적으로 TreeView에 추가를 합니다.
trvGroup.Nodes.Add(trvNode);

위와 같이 한 후 실행을 하면 다음과 같이 표시됩니다. 

그런데 위와 같은 경우는 구조를 알고 있는 관계로 부모를 지정하고 추가를 하면 되지만 표현해야할 구조가 Database 등에서 읽어서 자동으로 표시해야할 경우는 사용할 수가 없습니다.

예로 Tistory의 개발자가 프로그램을 위와 같이 했다면, 프로그래머는 Tistory를 사용하는 블로그의 모든 구조를 확인하고 일일이 표시해야하는(?) 난감한 문제가 발생합니다.

물론, Microsoft사도 C#을 만들면서 자동으로 추가할 수 있는 무언가를 만들어 놓았겠죠. 찾아보시면 FindNode(string valuePath)라는 함수가 있습니다. 그런데 자세히 보시면 FindNode의 인자값이 valuePath라고 되어있습니다. valuePath는 TreeView에서 특정 Node가 위치한 일종의 경로를 나타냅니다. 

Default 구분자로 "/"를 사용합니다. 위의 예에서 종이접기라는 노드의 valuePath는 "부모의 value/종이접기의 value"로 구성되어 "0/02"가 됩니다. 즉, 종이접기 노드 하부에 자식 노드를 추가하기 위해서는 종이접기의 Value 뿐만 아니라 종이접기 부모의 value까지 알아야 한다는 결론입니다. 

낭패죠, FindNode를 사용하려면 미리 데이터 구조를 FindNode에 맞게 구성이 되어져야합니다.

결론은 함수를 만들어야합니다. 그것도 재귀호출함수를 만들어야 제대로 구성할 수가 있습니다. (물론, 데이터량이 많을 경우 속도에 문제가 발생할 수 있습니다.)

        // 최초 SearchNode를 호출합니다.
        // 오버로드 함수는 이름이 같으나 파라미터 등으로 구분해서 사용합니다.
        public void Disply_Tree(){
            string strParentKey;

            // 레코드에서 부모 Key를 가져옴
            strParentKey = rdr.GetInt32(0).ToString();   
            //Nodes 콜렉션과 부모 Key를 가지고 함수 호출
            TreeNode trParent = SearchNode(objTreeView.Nodes, strParantKey);  

            TreeNode trChild = new TreeNode(); 
             // 레코드에서 자신의 Key를 가져옴 (예, "02")
             trChild.Value = rdr.GetInt32(1).ToString();

             // 레코드에서 자신의 Node 이름을 가져옴 (예, "종이접기")
             trChild.Text = rdr.GetInt32(2).ToString();

             // 부모노드에 추가
             trParent.ChildNodes.Add(trChild);
        }

 //Tree 검색 - 재귀 호출 함수 (TreeView.Nodes,Key)
        public TreeNode SearchNode(TreeNodeCollection objNodes, string strKey)
        {
            // Nodes의 node를 가지고 찾을 때까지 반복합니다.
            foreach ( TreeNodnode in objNodes )
            {
                // 해당 Node를 찾을 경우 Node를 리턴합니다.
                if (node.Value == strKey) return node;

                // 없을 경우 하위 Nodes를 가지고 다시 SearchNode를 호출합니다.
                TreeNode findNode = SearchNode(node.ChildNodes,strKey);

                // 하위노드 검색 결과를 비교하여 Null이 아닐경우(찾은 경우) node를 리턴합니다.
                if ( findNode != null )
                        return findNode;
            }
            // 검색 결과 조건에 맞는 Node가 없을 경우 Null을 리턴합니다.
            return null;
        }

위와 같이 재귀함수를 통해서 아래와 같이 자동으로 트리를 구성할 수 있습니다.


프로그래밍에 도움이 되시길 바랍니다.

(알려드리지만 위의 방법은 본인의 주관적인 방법이며 만약, 다른 효과적인 방법이 있을 경우 공유해 주시면 감사하겠습니다.)

 
출처 : 
http://all4cs.tistory.com/31 
반응형
Posted by blueasa
, |
게임엔진인 겜브리오는 데이타를 공유할 수 있도록 설계가 되어 있어서 자동적으로 텍스처메모리를 공유해서 사용하는 줄 아는 경우가 많다. 

물론 nif를 로딩한 뒤 그 것을 clone하여 사용하면 nif에 사용된 폴리곤과 텍스처메모리는 공유를 해서 사용하지만 다음과 같은 경우에는 텍스처메모리가 공유가 되지 않는다. 

1) a.nif 와 b.nif 가 t.dds 를 같이 사용하지만 텍스처를 내부에 넣어서 추출한 경우
 a.nif 로딩할 때랑 b.nif 를 로딩할 때는 각각 별도의 텍스처메모리로 생성되어서 사용된다.

2) a.nif 와 b.nif 가 t.dds 를 같이 사용하고 텍스처를 외부에 두고 추출한 경우
 a.nif 와 b.nif 로딩할 때 t.dds를 찾아 로딩하지만 역시나 별도의 텍스처메모리로 생성되어서 사용된다.

그럼 clone할 때를 제외하고는 텍스처메모리는 공유를 안된다는 이야기냐?! 기본적으로는 그렇다. 

다만 수동적으로 공유하게 할 수는 있다. 

여기에는 3가지정도의 방법론이 있다.

1) 똑같은 NiStream용 인스턴스를 사용하는 방법

NiStream fp;
fp.Load("a.nif");
:
fp.RemoveAllObjects();
fp.Load("b.nif");

위와 같이 하면 a.nif 에 쓰인 t.dds용 텍스처메모리는 b.nif 에서 공유되어서 사용된다. 

2) NiTexturePalette 객체를 NiStream끼리 공유하는 방법

(NiTexturePalette는 gamebryo에서 텍스처를 공유해서 사용할 수 있도록 만들어 놓은 인터페이스이다. 실제로는 NiDefaultTexturePalette 객체를 쓰면 된다)

NiDefaultTexturePalettePtr spTexturePalette = NiNew NiDefaultTexturePalette;
:
NiStream fp1;
fp1.SetTexturePalette(spTexturePalette);
fp1.Load("a.nif");
:
NiStream fp2;
fp2.SetTexturePalette(spTexturePalette);
fp2.Load("b.nif");

3) 전역으로 텍스처검색을 하도록 NiStream의 설정값을 변경하는 방법

기본적으로 NiStream은 생성자에서 NiDefaultTexturePalette객체를 하나 생성한다. 이때 NiDefaultTexturePalette가 내부검색옵션으로 되어 있는데, 이것을 글로벌검색으로 변경해주면 생성된 NiTexture 리스트를 모두 돌면서 검색해 같은 이름의 텍스처가 있으면 공유해 사용한다.

NiStream fp1;
((NiDefaultTexturePalette*)fp1.GetTexturePalette())->SetSearchGlobalTextureList(true);
fp1.Load("a.nif");
:
NiStream fp2;
((NiDefaultTexturePalette*)fp2.GetTexturePalette())->SetSearchGlobalTextureList(true);
fp2.Load("b.nif");


ps : 편의를 위해서는 겜브리오에서 기본설정이 전역을 찾도록 되어 있고 이를 수동으로 끄게 하는 게 더 편하지 않았을 까 생각해 본다. 


출처 : 
http://stnzone.com/gboard/blog/?id=1689 
반응형

'Gamebryo > Learn' 카테고리의 다른 글

DirectX 디바이스 얻어오기  (0) 2010.11.04
충돌 박스 노드에 임시 생성  (0) 2010.07.02
여러창 동시 렌더링  (0) 2010.07.02
Gamebryo 템플릿 클래스  (0) 2010.04.08
렌더러를 만들어보자  (0) 2010.04.08
Posted by blueasa
, |

스텐실 버퍼

stencil buffer는 특수한 효과를 위한 off-screen buffer로, back buffer 및 depth buffer와 동일한 해상도를 가진다. 따라서, stencil buffer 내의 (i, j)번째 픽셀은 back/depth buffer의 (i, j)번째 픽셀과 대응된다.

이름이 의미하는 것 처럼 stencil buffer는 back buffer의 일정 부분이 렌더링되는 것을 막는 효과를 위해 사용된다. 예를 들어, 거울에 특정 물체를 반사하도록 할려고 한다면, 거울에 반사되는 부분에 대해서만 드로잉을 수행하면 된다. 이 때 거울에 비치지 않는 부분은 렌더링되는 것을 막을 수 있는 있도록 하는 것이 바로 stencil buffer다.

 

다음과 같은 곳에 활용할 수 있다.

- 거울에 비치는 물체를 그릴때

- Shadow volume 을 이용한 그림자 렌더링

- 기타 다양한 마스킹( FPS 저격 줌인? )

 

기초 지식

렌더링 테스트의 순서 : 스텐실 테스트 -> Z-Test

 

 

In 게임브리오(StencilShadow.cpp)

 

NiStencilPropertyPtr spStencil = NiNew NiStencilProperty;
spStencil->SetStencilOn(true);

// 스텐실 테스트는 항상 통과하도록함
spStencil->SetStencilFunction(NiStencilProperty::TEST_ALWAYS);

// 스텐실 테스트에 실패해서 아무것도 그려지지 않게 생겼을 경우...
spStencil->SetStencilFailAction(NiStencilProperty::ACTION_KEEP);

// 스텐실 테스트와 Z-Test 모두 통과 했을 경우...
spStencil->SetStencilPassAction(NiStencilProperty::ACTION_INCREMENT);

// 스텐실 테스트는 통과했으나, Z-Test에서 통과하지 못했을 경우...
spStencil->SetStencilPassZFailAction(NiStencilProperty::ACTION_KEEP);

// 양면을 모두 그리도록..
spStencil->SetDrawMode(NiStencilProperty::DRAW_BOTH);
spShaft->AttachProperty(spStencil);

 

위에서 보면.. Stencil을 통과했다라는 말이.. Stencil + Z-Test 통과라는 것을 알 수 있다.

 

볼륨쉐도우

 

자세한 방법은 네이버씨에게 물어보거나, 아니면 책을 보면 쉽게 이해할 수 있다.

 

볼륨 쉐도우는

 

단순하고 정적인 Blocker가

 

복잡한 형태의 혹은 애니매이션 되는 대상에게 그림자를 드리울 때, 사용하면 가장 좋다!

 

왜? 볼륨쉐도우니까... 공부합시다!

[출처]
 Stencil buffer 사용하기|작성자 프라이드

반응형

'Gamebryo > Lecture' 카테고리의 다른 글

Mesh 만들기  (0) 2011.11.08
Mesh의 생성 ( Particle, 검궤적 등 )  (0) 2011.11.08
게임브리오 2D Line관련  (0) 2011.10.30
FrameRenderSystem에서.. 커스텀알파소터프로세스..  (0) 2011.09.18
무기잔상효과  (0) 2011.02.08
Posted by blueasa
, |

Mesh 만들기

Gamebryo/Lecture / 2011. 11. 8. 15:09

MeshData 제작

 

StencilShadow와 Eturnum 샘플을 보면 Mesh를 프로그램에서 만들어 내는 방법을 배울 수 있다.

 

( Eturnum의 Swoosh.cpp, StencilShadow의 StencilShadow.cpp )

 

아무래도 StencilShadow의 코드가 보기에 더 익숙하고 쉽게 보인다.

 

하지만, Eturnum 의 Mesh는 매 프레임 바뀌는 Mesh에 더 빠른 코드인것 같다.

 

자세한 내용은 두 개의 샘플을 열어보자.

 

Bound 설정

 

Gamebryo는 Camera culling을 기본적으로 행하고 있기때문에

 

Mesh를 만들면 반드시 WorldBound를 업데이트 시켜줘야 한다.

 

두 가지 함수를 통해서 할 수 있는데..

 

1 번 방식 ( Eturnum의 Swoosh.cpp )

----------------------------------------

NiBound kBound;
kBound.SetCenter(0.0f, 0.0f, 0.0f);
kBound.SetRadius(10000.0f);
m_pkMesh->SetModelBound(kBound);

 

2 번 방식 ( StencilShadow의 StencilShadow.cpp )

----------------------------------------

spSideWall->RecomputeBounds();

 

2 번 방식이 더 정확하고 편해보인다. 다만 계산이 조금 들어간다는게 단점이다. ( 요즘 CPU가 얼마나 빠른데... )

 

노말 설정

 

이 외에도 DirectX의 CalcNormal과 같은 Normal을 계산해주는 함수도 있다. ( StencilShadow의 StencilShadow.cpp )

 

NiMeshUtilities::CalculateNormals( spSideWall,
NiCommonSemantics::POSITION(), 0, NiCommonSemantics::NORMAL(), 0,
NiDataStream::ACCESS_CPU_READ | NiDataStream::ACCESS_GPU_READ |
NiDataStream::ACCESS_CPU_WRITE_STATIC );

[출처]
 Mesh 만들기|작성자 프라이드

반응형

'Gamebryo > Lecture' 카테고리의 다른 글

Stencil buffer 사용하기  (0) 2011.11.08
Mesh의 생성 ( Particle, 검궤적 등 )  (0) 2011.11.08
게임브리오 2D Line관련  (0) 2011.10.30
FrameRenderSystem에서.. 커스텀알파소터프로세스..  (0) 2011.09.18
무기잔상효과  (0) 2011.02.08
Posted by blueasa
, |

매 프레임마다 메쉬를 업데이트 해야하는 경우가 있을 경우...

 

void Update()

{

spMesh = NiNew NiMesh();

}

라는 식으로 코딩을 해서는 안된다.

 

NiNew 가 많이 느리고, 새롭게 만든 Mesh에 새로운 DataStream을 생성 해야하므로, 속도가 많이 느려지게 된다.

 

그것을 피하는 방법은 다음과 같다.

 

1. 최초 한번만 불리는 부분에서 Mesh를 생성

2. DataStream을 적당한 사이즈로 준비한다. 100개의 폴리곤 정도라면, Vertex = 3 * Poly, Index = 3 * Poly 정도로 만들면 충분함.

   ( 사용할 PrimitiveType 별로, 적당히 넣어주면 될 듯 )

3. 매 프레임 DataStream 을 Lock하여 데이터를 넣어주고,

4. DataStream의 SetRegion함수를 이용하여, 사용할 양을 지정해준다.

   ex >  kPositionLock.GetDataStream()->SetRegion( NiDataStream::Region(0,(NiUInt32)vecVertices.size()*iCount), 0 );

 

샘플에도 있는 코드지만, 의외로 아무 생각없이 만드는 경우가 있어서 ^_^;;

[출처]
 Mesh의 생성 ( Particle, 검궤적 등 )|작성자 프라이드

반응형

'Gamebryo > Lecture' 카테고리의 다른 글

Stencil buffer 사용하기  (0) 2011.11.08
Mesh 만들기  (0) 2011.11.08
게임브리오 2D Line관련  (0) 2011.10.30
FrameRenderSystem에서.. 커스텀알파소터프로세스..  (0) 2011.09.18
무기잔상효과  (0) 2011.02.08
Posted by blueasa
, |



11월 4일 00시부터 삽질..

KT쪽은 느려도 되는것 같더만..

SKT는 개판..2시간 반동안 짜증내면서 도전(?)하다가 드디어 사전예약 완료..

하고보니 1차수..

와..다들 이시간까지 난리치다가 포기했나보다..
반응형
Posted by blueasa
, |
-------------------------------------------------------------------------------------------------------------------------
class PropertySettings
{
    private int index;
       
    [CategoryAttribute("Base"),
    DescriptionAttribute("인덱스 입니다."),
    DefaultValueAttribute(-1)]
    public int Index
    {
        get { return index; }
        set { index = value; }
    }
}
-------------------------------------------------------------------------------------------------------------------------
propertyGrid1.SelectedObject = PropertySettings;
-------------------------------------------------------------------------------------------------------------------------
object obj = propertyGrid1.SelectedObject;

PropertySettings settings = (PropertySettings )obj;

int index = settings.Index; 
-------------------------------------------------------------------------------------------------------------------------

이렇게 하면 되네요.
다른 더 좋은 방법 아시는 분은 알려주세요. =ㅅ=

출처 : Mine 
반응형
Posted by blueasa
, |

Sample Image - DropDownProperties.jpg

Introduction

This article discusses three types of drop down properties:

  1. Dynamic Enumeration - View a drop down combo box with dynamic values.
  2. Images & Text - Show different bitmaps based on the value in the drop down list.
  3. Drop Down Editor - Show a custom UI type editor as a drop down form.

Dynamic Enumeration

Often, we would like to show dynamic values in a combo box, avoiding hard coded values. Instead, we may load them from a database or text files to support globalization and more. In this case, the property is called Rule, and rules are loaded from the RichTextBox. First, we define an internal class, having a string array containing the list of values.

internal class HE_GlobalVars
{
    internal static string[] _ListofRules;
}

We also define a type converter as follows:

public class RuleConverter : StringConverter
{
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        //true means show a combobox

        return true;
    }

    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
    {
        //true will limit to list. false will show the list, 

        //but allow free-form entry

        return true;
    }

    public override System.ComponentModel.TypeConverter.StandardValuesCollection 
           GetStandardValues(ITypeDescriptorContext context)
    {
        return new StandardValuesCollection(HE_GlobalVars._ListofRules);
    }
}

The Rule property is defined as follows:

true)>
[TypeConverter(typeof(RuleConverter))]
public string Rule
{

    //When first loaded set property with the first item in the rule list.

    get {
        string S = "";
        if (_Rule != null)
        {
            S = _Rule;
        }
        else
        {
            if (HE_GlobalVars._ListofRules.Length > 0)
            {
                //Sort the list before displaying it

                Array.Sort(HE_GlobalVars._ListofRules);
                S = HE_GlobalVars._ListofRules[0];
            }
        }
        return S;
    }
    set{ _Rule = value; }
}

Then, from the application itself, we fill the list of rules:

private void UpdateListofRules()
{
    int _NumofRules = richTextBox1.Lines.Length;
    HE_GlobalVars._ListofRules = new string[_NumofRules];
    for(int i = 0; i <= _NumofRules - 1; i++)
    {
        HE_GlobalVars._ListofRules[i] = richTextBox1.Lines[i];
    }
}

Images & Text

Some property types such as ImageColor, or Font.Name paint a small representation of the value just to the left of the space where the value is shown. This is accomplished by implementing the UITypeEditor PaintValuemethod. When the property browser renders a property value for a property that defines an editor, it presents the editor with a rectangle and a Graphics object with which to paint.

Here the property named SourceType is shown as a drop down list where each value has its own image located next to it. Images are loaded from a resource file.

public enum HE_SourceType {LAN, WebPage, FTP, eMail, OCR}

public class SourceTypePropertyGridEditor : UITypeEditor
{
    public override bool GetPaintValueSupported(ITypeDescriptorContext context)
    {
        //Set to true to implement the PaintValue method

        return true;
    }

    public override void PaintValue(PaintValueEventArgs e)
    {
        //Load SampleResources file

        string m = this.GetType().Module.Name;
        m = m.Substring(0, m.Length - 4);
        ResourceManager resourceManager =
            new ResourceManager (m + ".ResourceStrings.SampleResources", 
            Assembly.GetExecutingAssembly());
        int i = (int)e.Value;
        string _SourceName = "";
        switch(i)
        {
            case ((int)HE_SourceType.LAN): _SourceName = "LANTask"; break;
            case ((int)HE_SourceType.WebPage): _SourceName = "WebTask"; break;
            case ((int)HE_SourceType.FTP): _SourceName = "FTPTask"; break;
            case ((int)HE_SourceType.eMail): _SourceName = "eMailTask"; break;
            case ((int)HE_SourceType.OCR): _SourceName = "OCRTask"; break;
        }

        //Draw the corresponding image

        Bitmap newImage = (Bitmap)resourceManager.GetObject(_SourceName);
        Rectangle destRect = e.Bounds;
        newImage.MakeTransparent();
        e.Graphics.DrawImage(newImage, destRect);
    }
}

[Editor(typeof(SourceTypePropertyGridEditor), 
        typeof(System.Drawing.Design.UITypeEditor))]
public HE_SourceType SourceType
{
    get{return _SourceType;}
    set{_SourceType = value;}
}

Drop Down Editor

Visual Studio .NET uses type converters for text-based property editing and code serialization. Some built-in types, such as Color or DockStyle, get a specialized user interface in the property grid as well as text support. If you would like to supply a graphical editing interface for your own property types, you can do so by supplying a UI type editor as a drop-down editor user interface.

First, we create a form to be used as an editor. When initializing the form, we must set its TopLevel property tofalse. To make it caption-less, we have to set the following properties:

this.MaximizeBox = false;
this.MinimizeBox = false;
this.ControlBox = false;
this.ShowInTaskbar = false;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;

The Contrast property is used in this case.

The following code uses the IServiceProvider passed to EditValue. It asks it for theIWindowsFormsEditorService interface (which is defined in the System.Windows.Forms.Designnamespace). This service provides the facility for opening a drop-down editor, we simply call the DropDownControlmethod on it, and it will open whichever control we pass. It sets the size and location of the control so that it appears directly below the property when the drop-down arrow is clicked.

When we write the UI editor class itself, we have a choice as to the kind of user interface we can supply. We can either open a modal dialog or supply a pop-up user interface that will appear in the property grid itself. We indicate this by overriding the GetEditStyle method. This method returns a value from the UITypeEditorEditStyleenumeration, either Modal or DropDown. For either type of user interface, we must also override the EditValuemethod, which will be called when the user tries to edit the value. The value returned from EditValue will be written back to the property. It will call EditValue when the arrow button is clicked.

public class ContrastEditor : UITypeEditor
{
    public override UITypeEditorEditStyle 
           GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.DropDown;
    }

    public override object EditValue(ITypeDescriptorContext context, 
                            IServiceProvider provider, object value)
    {
        IWindowsFormsEditorService wfes = 
           provider.GetService(typeof(IWindowsFormsEditorService)) as
           IWindowsFormsEditorService;

        if (wfes != null)
        {
            frmContrast _frmContrast = new frmContrast();
            _frmContrast.trackBar1.Value = (int) value;
            _frmContrast.BarValue = _frmContrast.trackBar1.Value;
            _frmContrast._wfes = wfes;

            wfes.DropDownControl(_frmContrast);
            value = _frmContrast.BarValue;
        }
        return value;
    }
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


출처 :
 http://www.codeproject.com/KB/cpp/dropdownproperties.aspx

반응형
Posted by blueasa
, |