블로그 이미지
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

'전체 글'에 해당되는 글 2794건

  1. 2010.07.02 충돌 박스 노드에 임시 생성
  2. 2010.07.02 여러창 동시 렌더링
  3. 2010.07.02 C# 싱글톤
  4. 2010.07.02 Singleton
  5. 2010.07.02 창크기 조절 막기
  6. 2010.07.01 좌표계
  7. 2010.07.01 Spell 2.7(펌방지해제)
  8. 2010.06.30 VS2005 단축키
  9. 2010.06.30 파일 드래그&드롭 1
  10. 2010.06.29 Form-Form 데이터 전달

충돌정보를 넣어줄 노드는 임시로 NiNodePtr spNiNode; 로 한다~

우선은 바운드 박스로 한다!

NiBoxBV* CollisionBox;
CollisionBox = NiNew NiBoxBV();
CollisionBox->SetCenter(NiPoint3(5.0f,5.0f,5.0f));//바운드박스의 중앙을 잡는다.


바운드 박스의 사이즈 설정
CollisionBox->SetExtent(0, 10.0f);
CollisionBox->SetExtent(1, 10.0f);
CollisionBox->SetExtent(2, 10.0f);

 

여기까지 바운드박스 설정을 한후 충돌데이터에 링크 시킨다.
NiCollisionData *pCollisionData;

 

추가 시켜야할 노드의 정보로 충돌 데이터 생성한다.
pCollisionData = NiNew NiCollisionData(spNiNode);
pCollisionData->SetModelSpaceABV(CollisionBox);//위에서 만든 충돌박스 링크!

 

충돌방식에 대해 세팅한다.
pCollisionData->SetPropagationMode(NiCollisionData::PROPAGATE_NAVER);//콜백을 호출하기 위한 정보 세팅
pCollisionData->SetCollisionMode(NiCollisionData::USE_ABV);//ABV형식의 충돌검사를 한다는거?

 

이로서 충돌 데이터는 완성이다 이제 링크다
spNiNode->SetCollisionObject(pCollisionData);

 

이 박스의 와이어 프레임출력하고 싶을 시에는 박스정보를 이용해 색상을 설정하여 노드를 생성한다.
NiNode* CollisionBoundBox = NiDrawableBV::CreateWireframeBV(CollisionBox, NiColor(0.0f,1.0f,0.0f),1);

 

이걸 노드에 Attach!!!!
spNiNode->AttachChild(CollisionBoundBox);

 

이제 완성된 노드를 업데이트 시키면 된다아...
spNiNode->Update(0.0f);
spNiNode->UpdateProperties();
spNiNode->UpdateEffects();

 

이 노드를 CollisionGroup의 Collider이나 Collidee로 추가후

FindCollisions을 호출시 충돌이 일어나면 연결된 함수 포인터로 넘어간다.

 

...다른 좋은방법 아시는분 설명좀...;

출처 : http://tong.nate.com/ddpstddpst/mymaintong

반응형

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

겜브리오의 텍스처 공유  (0) 2011.11.11
DirectX 디바이스 얻어오기  (0) 2010.11.04
여러창 동시 렌더링  (0) 2010.07.02
Gamebryo 템플릿 클래스  (0) 2010.04.08
렌더러를 만들어보자  (0) 2010.04.08
Posted by blueasa
, |

기본적으로 랜더러는 여러개 생성이 되질 않으므로 하나의 랜더러를 가지고 카메라를 바꿔가며

 

여러창에 랜더링을 해주어야 한다.

 

그것을 위해 제공되는 아주 편리한 메소드가 있더라!

 

CreateSwapChainRenderTargetGroup(0, 윈도우핸들)

 

이것이다.

 

이것을 사용하게 되면 현 윈도우 핸들에 맞춰서 하나의 RenderTargetGroup이 리턴 된다.

 

문제점이 있다면 랜더타켓을 생성만 해주기 때문에 현재 랜더러 해상도에 맞춰서 랜더타켓이 생성이 된다.

 

만약 윈도우 사이즈가 변경이 된다면 랜더러의 해상도를 바꿔주면서 현재 랜더타켓을 삭제하고 다시금 랜더타켓

 

을 생성해야 하는 비효율적인 일을 해야한다.

 

GetSwapChainRenderTargetGroup(윈도우 핸들)

 

위의 메소드는 생성된 랜더타켓을 윈도우핸들을 인자로 받아 그게 맞는 랜더타켓을 리턴받게 된다.

 

이제 실제 랜더를 할때는 생성한 랜더타켓을 이용해

 

BeginUsingRenderTargetGroup(랜더타켓, 초기화)

 

//여기에 랜더링~

 

EndUsingRenderTargetGroup()

 

이후 디스플레이 시켜주면 끝이다.

 

툴에 4방향 랜더링 할때 유용할듯..

출처 : Tong - The_Ruins님의 GameBryo Engine통

반응형

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

겜브리오의 텍스처 공유  (0) 2011.11.11
DirectX 디바이스 얻어오기  (0) 2010.11.04
충돌 박스 노드에 임시 생성  (0) 2010.07.02
Gamebryo 템플릿 클래스  (0) 2010.04.08
렌더러를 만들어보자  (0) 2010.04.08
Posted by blueasa
, |

C# 싱글톤

Programming/C# / 2010. 7. 2. 16:55

이 전략에서는 클래스의 임의 구성원을 처음으로 참조할 때에 인스턴스가 만들어집니다. 공용 언어 런타임이 변수 초기화를 담당합니다. 파생을 차단하기 위해 클래스가 sealed로 표시되며 이로 인해 인스턴스가 추가될 수 있습니다. 클래스를 sealed로 표시할 때의 장단점에 대한 설명은 [Sells03]을 참조하십시오. 또한 변수가 readonly로 표시됩니다. 이 표시는 정적 초기화 (여기서 표시된 것처럼) 중이나 클래스 생성자에서만 변수를 할당할 수 있음을 의미합니다. 여기서는 정적 초기화가 나타나 있습니다.

이 구현은 공용 언어 런타임을 사용하여 변수를 초기화한다는 점을 제외하면 앞의 예제와 유사합니다. 이 구현에서는 싱글톤(Singleton) 패턴이 해결하려고 하는 두 가지 문제 즉, 글로벌 액세스와 인스턴스화 제어에 대해 다룹니다. public static 속성은 인스턴스에 글로벌 액세스 포인트를 제공합니다. 또한 생성자가 private로 선언되기 때문에 클래스 외부에서는 싱글톤(Singleton) 클래스를 인스턴스화할 수 없습니다. 따라서 변수가 의미하는 것은 시스템에 존재할 수 있는 인스턴스만을 말합니다.

싱글톤(Singleton) 인스턴스는 private로 선언된 정적 구성원 변수에 의해 참조되므로 Instance 속성 호출이 클래스를 처음으로 참조한 후에야 비로소 인스턴스화가 수행됩니다. 따라서 이 솔루션은 싱글톤(Singleton)의 Design Patterns 양식에서처럼 지연 인스턴스화 속성 양식을 구현합니다.

이 방식의 유일한 단점은 인스턴스화 구성에 대한 제어가 약간 저하된다는 점입니다. Design Patterns 양식에서는 인스턴스화 이전에 비기본 생성자를 사용하거나 다른 작업을 수행할 수 있었습니다. 이 솔루션에서는 .NET Framework가 초기화를 수행하므로 이 옵션이 필요 없습니다. 대부분의 경우는 .NET에서 싱글톤(Singleton)을 구현하기 위해 정적 초기화가 더 선호됩니다.

멀티 스레드 싱글톤(Singleton)

대부분의 상황에는 정적 초기화가 적합합니다. 응용 프로그램이 인스턴스화를 연기해야 하고, 인스턴스화 이전에 비기본 생성자를 사용하거나 다른 작업을 수행해야 하고, 멀티 스레드 환경에서 작업해야 하는 경우는 다른 솔루션이 필요합니다. 하지만 정적 초기화 예제에서처럼 스레드 안정성을 보장하기 위해 공용 언어 런타임을 사용할 수 없는 경우가 존재합니다. 이러한 경우는 여러 개의 스레드에 대해 개체 인스턴스가 하나만 만들어지도록 특정한 언어 성능을 사용해야 합니다. 보다 더 일반적인 솔루션은 각각의 스레드가 싱글톤(Singleton) 인스턴스를 동시에 만들지 못하도록 막기 위해 이중 확인 잠금(Double-Check Locking)[Lea99] 관용구를 사용하는 것입니다.

참고:공용 언어 런타임은 다른 환경에서 흔히 나타나는 이중 확인 잠금(Double-Check Locking) 사용에 관련된 문제를 해결합니다. 이 문제에 대한 자세한 내용은 메릴랜드 주립대, 컴퓨터 사이언스 학과 웹 사이트(http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html)에서 "The 'Double-Checked Locking Is Broken' Declaration" 을 참조하십시오.

다음 구현에서는 싱글톤(Singleton)의 인스턴스가 아직 만들어지지 않았을 때 한 개의 스레드만이 임계 영역(lock 블록에 의해 식별)에 들어갈 수 있습니다.

 

using System;

public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }

         return instance;
      }
   }
}
 

이 방식에서는 인스턴스가 필요할 경우에만 인스턴스가 단 한 개만 만들어지도록 합니다. 또한 인스턴스 변수에 액세스할 수 있기 전에 인스턴스 변수 할당을 완료하도록 변수를 volatile로 선언합니다. 마지막으로 이 방식에서는 교착 상태를 방지하기 위해 유형 자체를 잠그지 않고 syncRoot 인스턴스를 사용하여 잠급니다.

이 이중 확인 잠금(double-check locking) 방식은 Instance 속성 메서드의 모든 호출에 대한 독점적인 잠금을 막으면서도 스레드 동시 발생의 문제를 해결합니다. 이 방식에서는 또한 개체가 처음으로 액세스될 때까지는 인스턴스화를 연기할 수 있습니다. 실제로 응용 프로그램에는 이러한 유형의 구현이 거의 필요 없습니다. 대부분의 경우는 정적 초기화 방식만으로 충분합니다.

결과

C#에서 싱글톤(Singleton)을 구현할 경우 다음과 같은 이점과 단점이 있습니다.

이점

  • .NET Framework에서는 정적 변수 초기화가 언제 어떻게 일어나는지를 명시적으로 정의하므로 정적 초기화 방식이 가능합니다.

  • 위의 "멀티 스레드 싱글톤(Singleton)"에서 이미 설명한 이중 확인 잠금(Double-Check Locking) 관용구가 공용 언어 런타임에서 올바로 구현됩니다.

    단점

    멀티 스레드 응용 프로그램에 명시적 초기화가 필요한 경우는 스레딩 문제를 예방하기 위해 미리 조치를 취해야 합니다.

    참고 자료

    [Gamma95] Gamma, Helm, Johnson 및 Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1995.

    [Lea99] Lea, Doug. Concurrent Programming in Java, Second Edition. Addison-Wesley, 1999.

    [Sells03] Sells, Chris. "Sealed Sucks." sellsbrothers.com News. 다음 웹 사이트에서 구할 수 있습니다: http://www.sellsbrothers.com/news/showTopic.aspx?ixTopic=411

    참고: 제목과는 무관하게 "Sealed Sucks" 기사는 클래스를 sealed로 표시할 때의 장단점에 대해 실제로 설명합니다

    출처 : Tong - nicekiller77님의 C#통

  • 반응형
    Posted by blueasa
    , |

    Singleton

    Programming/C# / 2010. 7. 2. 16:53

    Definition

    Ensure a class has only one instance and provide a global point of access to it. 

    클래스는 오직 하나의 인스턴스만을 가질 수 있으며, 인스턴스에 접근할 수 있는 하나의 글로벌 포인터를 제공한다.

     

     UML Class Diagram

     

    Participants

    The classes and/or objects participating in this pattern are: Singleton   (LoadBalancer)

    • defines an Instance operation that lets clients access its unique instance. Instance is a class operation.
    • responsible for creating and maintaining its own unique instance.

    이러한 패턴으로 클래스들과 객체들이 참여하는것을 싱글톤(Singleton)이라 한다.

    • 클라이언트들이 유일한 인스턴에 접근하는 하나의 인스턴스 연산을 정의한다. 인스턴스는 클래스 연산(Operation)이다.
    • 자신의 유일한 인스턴스를 생성하고 유지하는 것에 대해 신뢰할 수 있다.

     

    < 글/ 이미지지/ C# 소스 출처 : http://www.dofactory.com/ >

     

    Example

    Singleton 패턴은 객체의 인스턴스가 유일한 즉, 단 하나의 인스턴스만을 생성한다. 그리고 전연 변수와 같이 어디서든지 유일한 인스턴스에 접근하여 사용하는 패턴이다. 단 하나의 유일한 인스턴스만을 가지고 있어 중요한 자원을 관리하는 객체의 경우 편리하다.

    사실 그냥 전역 변수를 사용해서 관리하는 것도 좋지 않나 라고 생각도 했지만, 전역 변수를 사용하는 목적이 어디에서든 접근 가능하다는 목적도 있는 반면에 중요한 자원을 관리함에있어 인스턴스를 이용하여 자원을 관리를 한다. 그래서 그 인스턴스가 유일하다는 것을 보장해 줄 때 사용할 수 있다. 다른 예로, 실생활에서는 대통령은 하나이며 그 유일한 대통령에 의해 임무가 수행된다. 하지만, 대통령 즉, 인스턴스가 여러군대 생성된다면 이것은 혼란을 야기시킬것이다. 이러한 문제를 미리 방지 하고자 Singleton을 사용한다.

     

    Singleton은 기본적으로 다음과 같은 구조로 되어있다.

    1. public class Singleton
      {
           private static Singleton singleton;
           private Singleton()
           {         
           }
    2.  
    3.      public static Singleton getInstance()
           {
    4.  if(Singleton == null)
    5. singleton = new Singleton();
    6.           return singleton;
           }
      }

     

    위 코드에서 생성자를 보자. public이 아닌 private 로 선언되었다.  보통 Singleton ex = new Singleton() 으로 인스턴스로 생성하지만, 이렇게 여러 곳에서 인스턴스가 생성되는 것을 막기 위해 private 로 선언되었다.

    그래서 다음과 같이 이 인스턴스를 사용할 수 있다.

    1. Singleton ex = Singleton.GetInstance();

     

    Sample Code In C#, C++Singleton.zip <- Click Here


    출처 : http://blog.naver.com/fish19?Redirect=Log&logNo=120051709260

    반응형

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

    Windows Forms FAQ - Windows Forms  (0) 2010.07.02
    C# 싱글톤  (0) 2010.07.02
    창크기 조절 막기  (0) 2010.07.02
    파일 드래그&드롭  (1) 2010.06.30
    Form-Form 데이터 전달  (0) 2010.06.29
    Posted by blueasa
    , |



    폼-속성-FormBorderSyle에서 FixedSingle이나 FixedDialog를 선택하면 됩니다.

    추가로 MaximizeBox/MinimizeBox도 꺼주시면 좋겠죠.

    창크기 조절 안되게 막으려는 용도니..

    - 설정하면 만들어지는 소스 -
     this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
    반응형

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

    C# 싱글톤  (0) 2010.07.02
    Singleton  (0) 2010.07.02
    파일 드래그&드롭  (1) 2010.06.30
    Form-Form 데이터 전달  (0) 2010.06.29
    .NET CF에서 WndProc 사용법  (0) 2010.06.29
    Posted by blueasa
    , |

    좌표계

    Programming/Math / 2010. 7. 1. 21:34

    가볍게..

     

    DirectX는 왼손 좌표계를 사용한다.

     

    x축이 오른쪽을 향하고 y축은 위를 향하며, z축은 안쪽을 향합니다.

     

     

    - 동차 좌표계

     

    평행 이동할 때 3차원 벡터인데도 굳이 4차원(아핀 벡터)으로 벡터의 변환을 확장했다. 3차원 공간에 w성분을 더해 w = 1로 벡터를 취급했지만, 이 논리를 진전시켜서 보통 때는 4차원 벡터로 다루고, 특별한 경우에는 w성분의 값으로 벡터를 나누어(x/w, y/w, z/w, 1) 을 실제 3차원 공간 벡터로 생각하는 좌표계를 동차좌표계라고 한다. 그림으로 그리면, 원점으로 부터 뻗어나간 직선위의 모든 점을 같은 벡터라고 생각.. 단, 관측 가능한 것은 w = 1일 때의 평면에서의 교점이다.

    이 방법의 장점은 (1, 1, 1, 2)과 (0.5, 0.5, 0.5, 1)을 같은 벡터로 생각하므로 3차원 벡터의 스칼라-곱을 할 경우 4차원 벡터의 w성분에 그 역수를 곱하는 것으로 끝난다.

    ( 다행스럽게도, 최근의 그래픽 칩은 동차 좌표계를 자동적으로 처리해준다.. 4차원 벡터를 넘겨주면 필요할 경우 자동적으로 3차원 벡터로 바꿔서 렌더링 해준다. )

     

    - 원근 보정

     

    서투르게 텍스처를 입히면 제대로 입혀지지 않는다..

    동차 좌표계에서의 평균 조작은 w=1에 투영한 공간에서의 평균 조작과는 다르다.

    두 벡터의 중점을 계산.. 원점 (0, 0, 0, 1), 또 하나는 (1, 1, 1, 1)과 (2, 2, 2, 2)..

    결과는..?

    3차원에서 텍스처를 입힐 때는 원래의 좌표를 (u/z, v/z, 1/z)과 같이, 동차 좌표로 확장하고 나서, 각 좌표를 선형으로 보간한 뒤, w=1 값으로 텍스처를 입히는 방법을 사용해야 올바른 결과가 나온다.

    DirectX로 원근 보정을 할 경우 정점 셰이더에서 픽셀 셰이더로 값을 넘길 때 주의해야 한다.

    위치 좌표나 텍스처 좌표 값은 래스터라이저에서 적절히 원근 보정되어 픽셀 셰이더 입력으로 넘겨진다. 1/z 처럼( 좌표에 관해서 선형이 아님 ) 기묘한 값을 정점 셰이더에서 픽셀 셰이더로 주고받으면, 원근 보정 처리 자체가 적절한 처리가 안 되기 때문에 픽셀 셰이더에 올바른 값이 입력되지 않는다.

    따라서, 정점 셰이더에서 좌표 변환에 관한 선형 값을 얻고, 픽셀 셰이더에서 비선형 값을 계산하는 것이 정확한 렌더링 결과를 얻기 위한 요령.

     

     

    -  기하 변환

     

    ㅁ 로컬 좌표계

    모델링 툴로 3D모델을 생성할 때 사용되는 좌표계입니다.

     

    ㅁ 월드 좌표계

    우리가 서 있는 대지를 기준으로 한 좌표계가 월드 좌표계

    행렬의 결합 순서는 신중하게 생각해야함..

    이동 행렬과 회전 행렬의 순서를 반대로 하면, 완전히 다른 장소로 이동해버린다..

     

    ㅁ 뷰 좌표계

    뷰 좌표계란 어디엔가 놓여있는 카메라를 월드의 중심으로 해서, 카메라가 보고 있는 방향을 z축에 맞춘 좌표계이다.

    카메라의 위치를 eye, 카메라가 응시하는 방향에 위치한 점 LookAt, 지면에서 수직방향 Up이라 할 때,

     

    카메라의 시선 방향 벡터

    e =   LookAt - eye

         ㅡㅡㅡㅡㅡㅡㅡ

         |LookAt - eye|

     

     

    카메라의 옆 방향

    v = Up X e

        ㅡㅡㅡㅡ

        |Up X e|

     

    카메라의 위쪽 방향

     

    u = e X v

     

     

    카메라가 놓여진 위치까지의 평행 이동도 필요..

    카메라의 월드 좌표계에서의 위치를 c = ( Cx, Cy, Cz )라고 하면..

    카메라가 놓여진 위치를 원점으로 되돌려야 하므로, 이 행렬은 벡터c에 의한 평행 이동 행렬의 역행렬이 된다. 

    결과적으로 최종적인 평행 이동은 카메라가 회전한 공간에서의 평행 이동이 된다.

     

     

    ㅁ 투영 좌표계( 클립 좌표계 )

     

    3차원 공간에서 디스플레이로 옮기는 2차원 좌표계가 투영 좌표계이다.

    실제로는 폴리곤의 앞뒤 관계를 판정하기 위해, 깊이 값도 출력.

    투영 좌표계는 화면의 중심을 원점으로해서 상하 좌우에 +-1의 폭을 가지는 좌표계, 깊이는 앞이 0이고 가장 안족이 1인 범위..

     

    컴퓨터에서는 무한히 멀리있는 거리는 다룰 수 없기 때문에, 시야 깊이에 범위를 마련한다. 시야의 먼 한계 값을 후방 클립면.. 시야에서 보이는 가까운 곳의 한계 값을 전방 클립면.. 이렇게 전후, 좌우, 상하로 둘러싸이는 3차원 공간 가운데에 표시되는 영역을 절두체라고 한다.

     

    뷰 좌표계에서 투영 좌표계로의 변환 행렬은 투영 행렬이다..

     

     

    ㅁ 화면 좌표계

     

    투영 좌표계는 x축, y축이 각각 01에서 1까지의 범위. 화면 영역은 640 X 480 등의 적당한 크기를 말한다. 투영 좌표계에서 화면 좌표계로 변환하는 행렬을 스크린 행렬, 혹은 뷰포트 행렬 또는 뷰포트 스케일링 행렬이라 한다.


    투영 좌표계와 화면 좌표계의 차이는 중심 좌표가 투영 좌표계에서는 한가운데에 있지만, 화면 좌표계에서는 좌측 상단에 있다고 하는 것.. 또 y축이 뒤집혀 있는 것도 큰 차이..

     

    투영 좌표계와 화면 좌표계의 대응을 식으로 정리하면.. 디스플레이 해상도를 ( W, H )로 했을 때, 중심좌표는 화면 좌표계에서는 ( W/2, H/2 )위치가 된다. 또 투영 좌표계로 ( -1, 1 )인 점이 화면 좌표계에 서는 ( 0, 0)에 위치 한다. 이상의 관계로, 투영 좌표 (Px, Py)의 점은 화면 좌표계에서 다음과 같다.

     

    X = W/2 ( 1 + Px )

    Y = H/2 ( 1 - Py )

    반응형

    'Programming > Math' 카테고리의 다른 글

    투영 벡터 ( Projection Vector )  (0) 2012.05.16
    동차좌표 ( 同次座標, Homogeneous coordinate )  (0) 2012.05.16
    [펌] 3D공간구조 기본충돌  (0) 2011.09.08
    역행렬(Inverse Matrix)  (0) 2010.03.17
    행렬식(Determinant)  (0) 2010.03.17
    Posted by blueasa
    , |

    Spell 2.7(펌방지해제)

    Utility / 2010. 7. 1. 01:42


    다들..아시죠 -ㅅ-;;

    출처 : http://rodream.net/
    반응형
    Posted by blueasa
    , |

    VS2005 단축키

    Tip & Tech / 2010. 6. 30. 21:54

    비쥬얼스튜디오2005 단축키 모음

    Ctrl-K, Ctrl-H : 바로가기 설정. ( 작업목록 창에서 확인가능 )
    Ctrl-K,K : 북마크 설정 / 해제
    Ctrl-K,L : 북마크 모두 해제
    Ctrl-K,N : 북마크 다음으로 이동
    Ctrl-K,P : 북마크 이전으로 이동
    Ctrl-K,C : 선택한 블럭을 전부 코멘트
    Ctrl-K,U : 선택한 블럭을 전부 언코멘트(코멘트 해제)
    Ctrl-F3 : 현재 단어 찾기
      -> F3 : 다음 찾기

    Ctrl-F7 : 현 파일만 컴파일
                : 현 프로젝트만 빌드
    Ctrl-Shift-B : 전체 프로젝트 빌드
    Ctrl-F5 : 프로그램 시작

    Ctrl-i : 일치하는 글자 연속적으로 찾기
    Ctrl+i 를 누르면 하단에 자세히보면, "증분검색" 이라는 텍스트가 나온다.
    그러면 그때 찾기 원하는 단어를 입력할때마다 일치하는 위치로 바로바로
    이동한다. (좋은기능)
    타이핑은 "증분검색" 이라는 텍스트옆에 커서는 없지만 입력이된다.
    입력하는 문자를 수정하려면, backspace로, 그만 찾으려면 엔터.

    줄넘버 보여주기 : 도구 > 옵션 > 텍스트편집기 > 모든언어 > 자동줄번호 선택하면 됨.

    Ctrl+ - (대시문자), Ctrl+Shift+ -  :
    현재 커서를 기억하는 Ctrl+F3(VS6에서), Ctrl+K,K(VS7에서) 와는 달리
    사용자가 별도로 입력을 해주는건 없고, 단지 이전에 커서가 있었던곳으로
    위 키를 누를 때마다 이동된다. (shift를 이용하면 역순)

    Ctrl-F12 : 커서위치 내용의 선언으로 이동( 즉, 대략 헤더파일 프로토타입으로 이동)

    F12 : 커서위치 내용의 정의로 이동( 즉, 대략 CPP파일 구현부로 이동)

    Shift+Alt+F12 : 빠른기호찾기 ( 이거 찾기보다 좋더군요. 함수나 define등 아무거나에서 사용)

    Alt+F12: 기호찾기. (s+a+f12 비교해볼것)

    Ctrl-M, Ctrl-L : 소스파일의 함수헤더만 보이기 (구현부는 감추고) (토글 키)
    Ctrl-M, Ctrl-M : 현재 커서가 위치한 함수를 접는다/편다. (토글 키)

    #include "파일명" 에서 "파일명" 파일로 바로 직접이동
    하고 싶을경우 -> Ctrl-Shift-G


    <편집>---------------------------------------------------------------------------
    Ctrl-F : 찾기 대화상자
    Ctrl-H : 바꾸기 대화상자
    Ctrl-Shift-F : 파일들에서 찾기 대화상자
    Ctrl-Shift-H : 파일들에서 바꾸기 대화상자
    Ctrl-G : 해당 줄로 가기 (별로 필요없음)
    Ctrl-K,Ctrl-F : 선택된 영역 자동 인덴트 (VS6의 Alt-F8기능)
    Ctrl-] :괄호({,}) 쌍 찾기 : 괄호 앞이나 뒤에서 눌러서 닫거나,
    여는 괄호이동
    Ctrl-Shift-Spacebar : 함수이름편집중 툴팁으로나오는 함수와매개변수설명이 안나올경우, 강제로 나오게

    alt-LButton ->Drag : 원하는 영역의 블럭을 세로로 잡기

    Ctrl+Shift+R (키보드 레코딩) :
      가끔 연속된 연속기만으로는 부족한경우가 있다.
      이럴때, 몇번의 키동작으로 레코딩하여, 이것을 반복하고 싶은경우가있다.
      이때 Ctrl+Shift+R 을 누르고, 원하는 동작들을 수행후, 다시 Ctrl+Shift+R을
      눌러 종료한다.  이 중간동작을 원하는 위치에서 반복하고 싶다면
      Ctrl+Shift+P 를 누른다.
     
    Ctrl+Shift+V (히스토리 붙이기) :
      Ctrl + V와는 달리 클립보드에 있는 복사된내용을 돌아가면서 붙여준다.
      따로 복사를 해주거나 할 필요는 없다. 그냥 Ctrl+C로 계속 원하는것을
      복사하면 된다.

    Ctrl-Z : 이전으로 되돌리기

    Ctrl-Shift-Z : 되돌렸다, 다시 복구하기

     

     

    <디버그/빌드>-------------------------------------------------------------------------
    F5 : 디버그 시작
    F9 :디버그 브렉포인트 설정
    Ctrl-F9 : 현위치 설정된 브렉포인트 해제
    Ctrl-Shift-F9 : 모든 브렉포인트 해
    Shift-F5 : 디버그 빠져나오기
    Ctrl-F10 : 커서가 있는곳까지 실행
    Shift-F11 : 현 함수를 빠져나감.

    Shift+Ctrl+B :  전체 빌드(프로젝트가 여러개있을경우 모두 빌드)
    Alt+B, C : 해당 프로젝트만 정리.
    Alt+B, U : 해당 프로젝트만 빌드.


     

    <창관련>-------------------------------------------------------------------------

    Shift+Alt+Enter : 전체 창 (토글 됨)
    F4 : 속성창 보여준다.
    Ctrl+Alt+X : 리소스에디터 툴박스창
    Ctrl+Alt+K : 작업목록 창.


     

    비주얼 스튜디오를 쓰다가 단축키를 잊어먹거나 까먹어서 잘 못쓰는 경우가 많아 정리를 해보았다.

    단축키 설명
    Ctrl + Tab Edit하고 있는 Child Window 간의 이동
    Ctrl + F4 현재 Edit하고 있는 Child Window를 닫기
    Ctrl + I 문자열 입력 점진적으로 문자열 찾기 (Incremental Search)
    Ctrl + F3 현재 커서에 있는 문자열 찾기 fowared (블록 지정 안 해도 됨)
    Shift + F3 현재 커서에 있는 문자열 찾기 backward
    F3 찾은 문자열에 대한 다음 문자열로 이동 (Next Search)
    Ctrl + H 문자열 찾아 바꾸기 (Replace)
    Ctrl + Left/Right Arrow 단어 단위로 이동
    Ctrl + Delete 또는 Backspace 단어 단위로 삭제
    Ctrl + F2 현재 라인에 북마크 지정/해제
    F2 지정된 다음 북마크로 이동
    Ctrl + Shift + F2 지정된 모든 북마크를 해제
    F9 현재 라인에 Breakpoint를 지정/해제
    Ctrl + Shift + F9 현재 Edit하고 있는 소스파일에 지정된 모든 Breakpoint 해제
    Ctrl + ] 또는 E '{'괄호의 짝을 찾아줌 ('{'에 커서를 놓고 눌러야 함}
    Ctrl + J, K #ifdef 와 #endif의 짝을 찾아줌
    Ctrl + L 한 라인을 클립보드로 잘라내기 (Cut)
    Ctrl + Shift + L 한 라인을 삭제
    Alt + Mouse 블록 설정 세로로 블록 설정하기 (마우스로)
    Ctrl + Shift + F8 세로로 블록 설정하기 (키보드로), 취소할 때는 Esc키를 눌러야 함
    블록 설정 -> Tab 선택된 블록의 문자열을 일괄적으로 들여쓰기(Tab) 적용
    블록 설정 -> Shift + Tab 선택된 블록의 문자열을 일괄적으로 내어쓰기 적용
    Alt + F8 -> Tab 또는 Shift + Tab 들여쓰기 자동 조정 (Tab:들여쓰기, Shift + Tab : 내어쓰기)
    Ctrl + T 현재 커서에 있는 변수/함수에 대한 Type이 Tooltip 힌트 창에 나타남
    Ctrl + Alt + T 멤버 변수/함수 목록에 대한 팝업 창이 나타남
    Ctrl + Shift + T 공백/콤마/파이프/괄호 등을 기준으로 좌우 문자열을 Swap시킴
    Ctrl + Shift + 8 문단기호 표시/감추기 : Tab은 ^, Space는 .으로 표시
    Ctrl + D 툴바의 찾기 Editbox로 이동
    Ctrl + Up/Down Arrow 커서는 고정시키고 화면만 스크롤 시키기


    디버깅에 관련된 단축키 하나 더.
    변수이름을 적어 놓고 브래이크 포인터의 위치 여부와 관계 없이 변수의 내용을 추적하는 기능이 Watch Window에 들어 있다. 디버그 모드에서 추가하고픈 변수나 등등 앞에 커서를 위치 시킨후 Shift + F9를 누르면 그냥 바로 추가된다.


    Tab 들여쓰기,자동완성
    Shift+Tab 내어쓰기
    블록 설정 >> Tab 선택된 블록의 문자열을 일괄적으로 들여쓰기(Tab) 적용
    블록 설정 >> Shift+Tab 선택된 블록의 문자열을 일괄적으로 내어쓰기 적용

     


    F2 설정된 북마크로 이동
    F2 설정된 다음 북마크로 이동
    F3 다음 단어 찾기
    F4 다음 에러메세지로 이동
    F5 Debugging 모드로 작동
    F9 현재 라인에 BreakPoint를 설정/해제
    F10 Debugging 모드로 작동하되 엔트리 포인트부터 시작
    F12 마우스 오른쪽 버튼 눌렀을때 go to definition 단축기

     

     

    Ctrl+Up/Down Arrow 커서는 고정시키고 화면만 스크롤 시키기
    ctrl+*(맨오른쪽 부분) 위에서 F12 눌렀을때 이전화면으로 돌아가기
    Ctrl+Left/Right Arrow 단어 단위로 이동
    Ctrl+Delete 또는 Backspace 단어 단위로 삭제
    Ctrl+Tab Edit하고 있는 Child Window 간의 이동
    Ctrl+Space 인텔리센스 출력(멤버목록 팝업창)

    Ctrl+F2 북마크 설정
    Ctrl+F2 현재 라인에 북마크 지정/해제
    Ctrl+F3 현재 커서에 있는 단어로 찾기
    Ctrl+F4 현재 Edit하고 있는 Child Window를 닫기
    Ctrl+F5 빌드 후 프로그램 실행
    Ctrl+F10 Debugging 모드로 작동하되 커서의 위치까지

    Ctrl+] 괄호 짝 찾기
    Ctrl+] 또는 E {괄호의 짝을 찾아줌 ({에 커서를 놓고 눌러야 함}
    Ctrl+A 전체 선택
    Ctrl+B 브레이크 포인트 관리 메뉴
    Ctrl+D 툴바의 찾기 Editbox로 이동
    Ctrl+E 현재 괄호랑 맞는 괄호를 찾아준다.
    Ctrl+F 현재 커서에 있는 단어로 찾기
    Ctrl+G 라인 바로 가기(GoTo)
    Ctrl+H 문자열 찾아 바꾸기 (Replace)
    Ctrl+I >> 문자열 입력 점진적으로 문자열 찾기 (Incremental Search)
    Ctrl+J, K #ifdef 와 #endif의 짝을 찾아줌
    Ctrl+L 한 라인을 클낳링藥?잘라내기 (Cut)
    Ctrl+T 현재 커서에 있는 단어의 툴팁정보 보기
    Ctrl+U 모두 소문자로
    Ctrl+W 클래스 위자드 (MFC 코딩시에만 사용)

    Ctrl+Shite+Space 현재 가르키고 있는 함수의 매개변수 보기

    Ctrl+Shift+F2 지정된 모든 북마크를 해제
    Ctrl+Shift+F3 이전 단어 찾기
    Ctrl+Shift+F8 열 블럭(키보드로), 취소할 때는 Esc키를 눌러야 함
    Ctrl+Shift+F9 현재 Edit하고 있는 소스파일에 지정된 모든 Breakpoint 해제

    Ctrl+Shift+8 문단기호 표시/감추기 : Tab은 ^, Space는 .으로 표시

    Ctrl+Shift+L 한 라인을 삭제
    Ctrl+Shift+P 매크로 실행
    Ctrl+Shift+R 매크로 기록
    Ctrl+Shift+T 공백/콤마/파이프/괄호 등을 기준으로 좌우 문자열을 Swap시킴
    Ctrl+Shift+U 모두 대문자로

    Ctrl+Alt+T 멤버 변수/함수 목록에 대한 팝업 창이 나타남

     

     

    Alt+MouseMove 컬럼 Selection

    Alt+B -> E Clean
    Alt+B -> R Rebuild All
    Alt+E+I 프로젝트 내의 모든 파일에서 찾기
    Alt+G 그 함수가 선언된 파일이나 위치로 고!
    Alt+O 헤더와 소스파일을 번갈아 보여줌

    Alt+0 WorkSpace 윈도우
    Alt+2 output 윈도우

    Alt+F7 Project Setting
    Alt+F8 들여쓰기 자동 조정
    Alt+F9 브레이크포인트 관리

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

    반응형
    Posted by blueasa
    , |

    먼저 데이터를 받을 폼이나 콘트롤의 AllowDrop 프로퍼티를 True 로 합니다.

    그런 다음 DragEnter Event에서 데이터를 확인하시고

    DragDrop event에서 실제 처리를 하시면 됩니다.

     

    이 예제는 다른 프로그램에서 파일을 드래그해서 리스트에 떨구면 파일을 추가하는 예제입니다.

     

            private void listBox1_DragEnter(object sender, DragEventArgs e)
            {
                    if (e.Data.GetDataPresent(DataFormats.FileDrop))
                    {
                        e.Effect = DragDropEffects.Copy;
                    }
                    else
                    {
                        e.Effect = DragDropEffects.None;
                    }
            }

            private void listBox1_DragDrop(object sender, DragEventArgs e)
            {
                try
                {
                    if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
                    {
                        string[] fileNames = (string[])e.Data.GetData(DataFormats.FileDrop);
                        foreach (string fileName in fileNames)
                        {

                            // 여기서 기타 파일에 대한 처리를 해주시면 됩니다.
                            listBox1.Items.Add(fileName);
                        }
                    }
                }
                catch (System.Exception ex)
                {
                    //예외
                }
            }

    출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNo=8&no=95686&ref=95686

    반응형

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

    Singleton  (0) 2010.07.02
    창크기 조절 막기  (0) 2010.07.02
    Form-Form 데이터 전달  (0) 2010.06.29
    .NET CF에서 WndProc 사용법  (0) 2010.06.29
    C# 주의해야 할 문법(dispose,using,close)  (2) 2010.06.28
    Posted by blueasa
    , |

    데브피아 윤성님의 팁입니다.

    저는 보통 폼끼리 참조하여 사용해왔는데.. 이쪽이 훨씬 마음에 드네요.. :)

     

     

    ------------------- 이하 원문

     

    이글을 적게되는 이유의 하나는 지속되는 질답란의 질문들이며

    또 하나의 이유는 아래의 허접한 하나의 생성에 대해서 감사 댓글이 달렸기 때문이다.

     

    사실상 이걸 적어볼까 하고 생각한지가 일년은 훌쩍 넘은듯 싶다.

    귀찮기도 하고 별게 아닌거라서 뭐하자는 이야기인지 허접스럽기도 하고 말이다.

     

    사실상 아래의 "하나의 생성"인지.. 글에 대략 이건 옳지 못합니다. 클래스 생성이 낭비됩니다등의 댓글이 달릴것이라 예측했다.

    또는 openform 비교가 아닌 indexer적인 접근으로 null 비교를 하지 않는가 하는 의문이 달리지 않을까 했는데.. 적어놓은 시간이 짧아서인지 그런글은 없는듯싶다.

     

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

     

    Form collection 존재한다는 사실을 알고 있는이는 알고 있는데도 불구하고

    사람들은 이것을 이용하지 않는듯 싶다.

    (?)인지는 익숙하지 않아서 그런것이라.

    MS에서는 FromCollection ControlCollection Indexer까지 구현해서 만들어 두었음에도

    대부분의 경우 무식하게 Indexer 사용하지 않고 Loop 돌리거나 해서 찾는경우가 많다.

     

    아래의 ( 하나생성) 또한 그런 오류를 범한것중 하나이다.

    (과연 그럴까?.... 나름 이유가 있을까? 이유는 게을러서? 이지 않을까 싶다만.. 죽어도 잘난척이란..)

     

    Form Collection 있다는 사실 또는 이것을 이용할줄 모르는 사태로 인해서 가끔식은 FrameWork이라고 만든것들은 임의로 자신의 FormCollection 구현하고 이로인해서 오히려 쉬운길을 두고 어렵게 가기도 한다.

     

    기초적인것이면서 한줄짜리? 지식이라

    사실 이렇게 글을 적는게 오히려 민망하기도 하고 황망스럽기도 하나..

     

    몰라서 저지르는 실수들이 너무 많아서 이렇게 펜을 들어본다( 그러는 나는 알고 있을까나?)

     

    일단.. 기초과정을.. 밟아 보도록 하자..

     

    1. Indexer이용하기.

    이렇게.. 폼을 두개를 만들자.

     

    이런식으로.. 두개의 폼을.. 만들도록 하자.

    Form2 닫게 하려면 어떻게 하는가?

     

    Form2 닫지를 못하는 사람? 자진납세하자.(댓글함 적어다오 얼마나 많은지 파악이 안된다.)

    문제의 시작은 이것이다. Form2 생성했는데 어떻게 하질 못하겠다는것이다.

    Form2 생성은 이렇게 했다.

    결국 문제를 해결하기 위해서.. 어떤이는?...

     

    Form1 클래스의 변수로.. Xx 선언한다. 일종의 전역변수같은거 말이다.

    다른경우는 프로젝트의 자체 컬랙션에서 처리한다.

     

    두가지 나쁜 방법은 아니다.

    단지.. 내가 의문을 지니는것은 그럴까? 하는것뿐이다.

     

    Form2 닫는건 이렇게 적으면 된다.

     

    그렇다. 내가 그랬지… 한줄짜리 지식이라고..

    한줄 적어주고 어지간히 아는척이 많다.

     

    .. 이제는 FW 경우를 살펴보자.(FW FrameWork 준말로 사용한다. )

    솔류션을 이렇게 만들고 FW에서 기준폼으로 MyForm 만들고

    Form3 Myform 상속받았다고 치자.

     

    요렇게 상속받음..

     

    Myform 필요도 없지만.. 행여나 보여주자면..

    이런식이라고 보자.

     

    이런식이 될때 FormCollection.. 과연 Form3 가질까 하는것이다.

    대답은.. 모든 Form개체 상속받은것들은.. 무조건 Show할때.. FormCollection 들어간다.

    그럼 반대로 Hide하면 어떻게 될까? 사라질까?

    대답이 뭐일것 같은가? 귀찮아서 그냥 알려준다만.. 사라지기 전까지는 들어가 있다.

    hide 여전히 존재한다. Close 호출되어야 사라진다.

    다시 강조해서 말하자면.. Show할때 들어가고..(그냥 생성한다고 들어가진 않는다.)

    (여유되시면 reflection으로 show 까보면 좋겠다만.. 귀차니즘의 끝은 어디에 있는지 누가 해다오)

     

    하여간.. 위의 예제에서 말하고자 하는 이야기는

    FW 만들더라도 굳이 컬랙션을 만들지 마라.. 피곤하다.

    (말은 이렇게 하지만 대부분의 FW에서 필요하긴 하다. Form 경우 특정 영역성이 필요하게 되는데 일반적으로 기준 Form(위에서 말한 Myform) 에서 Show메세드의 오버로딩을 통해서 영역을 설정하곤 한다. / 또한 대부분의 경우 Dictionary같은 지네릭타입으로 해서 "as" 적지 않고 처리하길 원한다.)

     

    이제는 FW 사용하는 이들은 의문을 가질것이다. 그럼 Myform 상속받은것은 어떻게 구분하냐고?

    "is" 녀석은 그냥.. 있는게 아니다. 사용하면 될꺼 아닌가

    한줄이지만. 굳이 예제를 만들기도 귀찮은 관계로.. 패스다. 모른다고 누가 손든다면... 너무한거 아냐? 라고 말하고 싶다.

    안되면 확장메서드 하나 만들어 버리던지..

     

    . 이제 본론에 들어가야 하는데 폼에게 특정한 메시지를 전송한다는것 자체가 무의미한 수준까지 왔다.

    이미 눈치 코치 알아버렸듯이 할것이 없다.

     

    그래도 행여나 하는 맘으로 몇자 적어보자.

     

    나같은 경우는 Form에서 Form으로 특정메세지나 무시기를 전달하기 위해서 SendMessage같은 API 써본적은 없다. 물론 Domain 다른 Application이라면 어쩔수 없겠지만..

    그런경우만..WinProc override해서 처리하면 된다.

    이럴때도 광역인지 뭔가 방법이 있을법도 하다만.. 내가 모르는덕분에.. 이건 배워야 할듯 싶다.

     

    계속 주제를 어긋나는데 주제에 집중하자.

    하여간 나의 경우는 Interface 정의해서 사용한다.

     

    심풀하게 설명해서 이렇게 인터페이스를 만들어 보자.

     

     

    그럼.. 이걸 가지고.. Form2에게 이녀석을 구현하도록 해보자.

    이렇게 구현하고 나서..

     

    이지의 좌측 아래에 있는 버튼을 누르면.. 이렇게 실행이 된다.

    .. Form2 에게 궁극적으로 메시지를 보냈다.(물론 헛소리다.)

    .. From2 매서드를 단지 실행한것에 불과하다 args넣어서.

     

    소스야 앞서 이야기 했듯이 is 사용하면 된다.

     

    이렇게.. 물론 이것의 응용(?)으로 앞서 이야기 했듯이  Indexer 입력받아 바로.. Is 인터페이스 체크하고 실행하는 방법도 있겠다. (업무에 따라서..)

    응용은 알아서 하길 바란다. 계속 곁가지로 나가면.. 사실 적을게 너무 많다.

     

     

    위와 동일한 형태지만.. Myform 에서 가지고 하는걸 보자.

    (이건 필요 없을것 같다..... 그냥 대충 대충 진행하자.. 생략해도 좋다.)

    FW 경우에는 이렇게 해야될것이다.

    우리가 사용할 녀석에게 당연히 상속을 받아 구현하게 해야할것이다.

     

    여기서 주의깊게 봐야 하는것은 상속받고 구현하고.. 그리고 Virtual이라고 적어두는것이다.

    그래야… 이녀석을 다시 상속받는 녀석들에게.. Override 할수 있도록 하기 위함이다.

    아차차.. virtual앞에 public 붙쳐야되는데 얼른 적다보니 빠뜨렸다. 알아서 넣자.

     

    하여간..

     

    한줄짜리 기초가 이렇게 많은 글을 적어야 되는지는 .. 당연히 설명하는 능력의 부재이겠지만..

    이게 나름 적기 시작하면 무지 적을게 많기도 하다.( 뻥이다. 귀찮아서 적지 않을뿐이다.)

    여하튼 인터페이스에 정의하는것들로는  Clear같은거라든지.. 여타 몇몇개는 고정적으로 사용되는것들이 있는데 그런것들도 알아서 하도록 하자..

    반응형

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

    창크기 조절 막기  (0) 2010.07.02
    파일 드래그&드롭  (1) 2010.06.30
    .NET CF에서 WndProc 사용법  (0) 2010.06.29
    C# 주의해야 할 문법(dispose,using,close)  (2) 2010.06.28
    Handling Application Events: On Idle  (0) 2010.06.28
    Posted by blueasa
    , |