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

카테고리

분류 전체보기 (2738)
Unity3D (817)
Programming (475)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (58)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (53)
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
05-05 21:38

Form 에서 다른 Form 을 생성하는 경우 작업표시줄에도 표시되고 Alt+Tab을 누르면 나오는 화면에도 나옵니다.

이것을 없애는 방법이 여러가지 있습니다.

ShowDialog() 로 호출하는 방법도 있고, FormBorderStyle을 FixedToolWindow 또는 SizableToolWindow 로 지정하면 Alt+Tab 화면에 보이지 않습니다. 하지만 이 방법들은 무언가 꺼림찍하죠?

다들 특정한 목적으로 쓰도록 만든 것이기 때문에 일반 폼에 적용하기는 무리가 있습니다.

제가 만드는 App의 경우에는 FormBorderStyle을 None으로 설정하고, 소유하는 폼에도 접근해서 작업을 하도록 만들었기 때문에 위의 방법을 쓸 수가 없더군요

 

그래서 열심히 구굴링을 해서 찾아낸 방법!

        protected override CreateParams CreateParams
        {
            get
            {
                // Turn on WS_EX_TOOLWINDOW style bit
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x80;
                return cp;
            }

         }

이 코드를 Form의 클래스에 넣기만 하면 Alt+Tab을 눌러도 보이지 않습니다.
보니까 어떤 속성을 오버라이드 해서 ToolWindow 속성을 부여하는 것 같습니다. 정확한지는 저도 잘 ^^;

 

출처: http://www.csharp411.com/hide-form-from-alttab/

반응형
Posted by blueasa
, |

Form.Location 이라는 속성을 이용해서 창의 위치를 결정할 수 있습니다.
그리고 Form.Show() 라는 메써드를 이용해서 창을 보여줄 수 있습니다.
그렇다면!!
위치를 지정하고 그 위치에 창을 띄울 수 있을 것 같은데... 어라? 잘 안됩니다 ㅡㅡ;
일단 Show() 메써드를 사용한 후에는 Location 속성을 이용해서 창이 잘 움직이는데 처음 시작할 때는 잘 안되는군요~
Show() 메써드를 실행하기 전에 지정한 Location 속성은 Form의 위치에 영향을 주지 못하는 것 같습니다.

이럴 때!!
Form.StartPosition 속성을 이용합니다.
오호라! 시작 위치를 지정할 수 있을 것 같은 속성 이름이군요!

Form.StartPosition 속성은 Point 객체가 아니고 FormStartPosition 이라는 열거형입니다.
그렇다면 어떻게 처음 위치를 지정할까요?

Form.StartPosition = FormStartPosition.Manual; //이렇게 지정해 주면 Location을 시작 위치로 사용합니다.
이 방법을 사용하면 Form을 원하는 위치에 띄울 수 있겠죠? ^^

form1.StartPosition = FormStartPosition.Manual;
form1.Location = new Point(10,10);
form1.Show();


이렇게요~ 참 쉽죠?

반응형
Posted by blueasa
, |

사용자 삽입 이미지
입력 배열 :

        string[] parentString = { "son1", "son2", "son3", "son4" };
        string[] childString = { "byoung1", "byoung2", "byoung3" };

입력방법 #1

        private void button1_Click(object sender, EventArgs e)
        {
            treeView1.Nodes.Clear();
            treeView1.BeginUpdate();

            foreach (string str in parentString)
            {
                TreeNode tn = treeView1.Nodes.Add(str);

                foreach (string substr in childString)
                {
                    tn.Nodes.Add(substr);
                }
            }

            treeView1.EndUpdate();
        }

입력방법 #2

        private void button2_Click(object sender, EventArgs e)
        {
            treeView1.Nodes.Clear();
            treeView1.BeginUpdate();

            foreach (string str in parentString)
            {
                treeView1.Nodes.Add(str);
            }

            foreach (TreeNode tn in treeView1.Nodes)
            {
                foreach (string substr in childString)
                {
                    tn.Nodes.Add(substr);
                }
            }

            treeView1.EndUpdate();
        }

입력방법 #3

        private void button3_Click(object sender, EventArgs e)
        {
            treeView1.Nodes.Clear();
            treeView1.BeginUpdate();

            TreeNode tn = new TreeNode();
            foreach (string str in childString)
            {
                tn.Nodes.Add(str);
            }

            foreach (string str in parentString)
            {
                TreeNode tnParent = treeView1.Nodes.Add(str);
            }

            treeView1.EndUpdate();
        }



출처 : http://www.iamgsi.com/entry/C-TreeView-내용-추가하기
반응형
Posted by blueasa
, |
C++ 에서 FILE 를 사용해서 데이터를 바이너리로 저장 했다면 C#에서 어떻게 읽어야 할까?.

C#을 배우는 상태에서 C++ 과의 파일 연동 문제가 고민이 되었다.
사실 모르니 궁금증이 생긴 거지만 몇가지 테스트를 하다 보니 바이너리 데이터는 BinaryReader 로 읽을수 있었다.

해당 파일을 읽을때 FileInfo를 사용해서 오픈 한 다음에 BinaryReader로 읽을 수 있다.
FileInfo fi = new FileInfo(@"D:\Testbinary.dat");
BinaryReader br = new BinaryReader(fi.OpenRead());

C++ 에서 아래 데이터를 저장했습니다.
FILE* fp = fopen(path, "wb");
int data0 = 100;
float data1 = 100.123f;
char buf0[128] = "son byoung uk";
fwrite(&data0, sizeof(int), 1, fp);
fwrite(buf0, 128, 1, fp);
fwrite(&data1, sizeof(float), 1, fp);
fclose(fp);

C# 에서 아래와 같이 데이터를 읽었습니다.
int data0;
float data1;
char[] buf0;
string buf1; data0 = br.ReadInt32();
buf0 = br.ReadChars(128);
buf1 = new string(buf0);
data1 = br.ReadSingle();

위의 내용을 아래와 같이 정리해봤습니다.

C++

C#

int

br.ReadInt32()

float

br.ReadSingle()

double

br.ReadDouble()

char[]

string a = new string(br.ReadChars(128))



출처 : http://www.iamgsi.com/?page=35
반응형

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

Form을 원하는 위치에 띄우자!  (0) 2010.07.14
TreeView 내용 추가하기  (2) 2010.07.14
윈폼에서 단축키 개발하기  (0) 2010.07.13
Windows Forms Application  (2) 2010.07.07
PointToClient 와 PointToScreen  (0) 2010.07.07
Posted by blueasa
, |

윈폼(via C#)으로 각종 툴, 어플리케이션을 만들 때 유저키덕후들을 위한 단축키가 필요할 수 있다. 마우스라는 혁신적인 입력 장치가 있더라도 숙련되면 키보드 이상가기 힘드니까 :)
언뜻 생각하기에는 System.Windows.Forms.Form 클래스에서 KeyDown 이벤트를 잡아서 처리를 하면 될 것 같아 해보았지만, 동작하지 않는다 ㅇㅂㅇ;;
Google신(MS는 Bing신...)에 문의 결과 ProcessCmdKey 메소드를 오버라이드 한다면 된다고 한다. 간단히 해보면 다음과 같다.
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
        if (!base.ProcessCmdKey(ref msg, keyData)) // 위에서 처리 안했으면
        {
                // 여기에 처리코드를 넣는다.
                if (keyData.Equals(Keys.F1))
                {
                        // 대충 이런 식으로 처리한다.
                        return true;
                }
                else
                {
                        return false;
                }
        }
        else
        {
                return true;
        }
}


위 코드에서 return false; 의 의미는 내가 처리를 안했으니 혹시나 자식 클래스에서 오버라이드 할꺼면 밑에서 처리해라~ 라는 의미이다. 반대로 return true; 는 밑에서 처리하지 말라는 소리다. 마찬가지로  base.ProcessCmdKey가 거짓일 때만 처리하는 것도 부모 클래스에서 키입력에 대해서 처리를 했다면 처리를 하지 않는다는 의미이다.

아무튼, 이리하여 간단히 단축키를 구현할 수 있다.


출처 : http://zeru.kr/blog/539
반응형

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

TreeView 내용 추가하기  (2) 2010.07.14
C++ 바이너리(Binary) 데이터를 C# BinaryReader 로 읽기.  (0) 2010.07.14
Windows Forms Application  (2) 2010.07.07
PointToClient 와 PointToScreen  (0) 2010.07.07
단축키 만들기 with C#  (1) 2010.07.07
Posted by blueasa
, |

1.    Windows Forms
 Application

 

Windows Forms Application Visual Studio .NET에서 쉽게 윈도우 기반 응용 프로그램을 개발할 수있는 환경을 제공합니다.

그리고 C++/CLI(C#, VC.NET…)문법을 이용해 .NET 프레임워크환경의 모든 장점을 가질 수 있는 통합 개발 환경을 제공합니다.

Windows Forms Application Win32/MFC의 업데이트 버전이나 추가된 버전이 아닌 전혀 다른 .NET CLR 위에서 실행되는 윈도우 개발환경 입니다.

하지만 MFC Windows Forms Application은 서로 임베딩 될수 있는 환경을 제공하고 앞으로 더 많은 관련된 기능이 추가될 것으로 기대 됩니다.

 

2.      Windows Forms Application
시작

Visual Studio 2005에서 파일>>새로만들기>>프로젝트 메뉴에서 Window Forms Application  프로젝트를 추가 할 수 있습니다.

 

 

새 프로젝트 추가 메뉴를 선택하면 아래 그림과 값이 새 프로젝트를 설정하는 박스가 나타납니다.

Windows Forms Application C#, J#, VB에서는 윈도우프로그램이라는 이름으로 생성이 되고 Visual C++에서는 CLR탭에서 Windows Forms Application을 선택하여 만들 수 있습니다.

프로젝트 타입을  Windows Forms Application 으로 선택하고 프로젝트 이름 , 위치 등을 설정하고 확인버튼을 클릭합니다.

 

 

프로젝트를 생성하면 기존 MFC 윈도우 프로그램과는 많이 다른 모습을 하고 있습니다.

제일 처음 보이는 화면은 디자인템플릿입니다.

디자인 템플릿에서 여러가지 .NET 콤포넌트를 추가/삭제 하여 프로그래밍을 하는 환경을 제공합니다.(델파이와 똑같습니다.)

.NET 컴포넌트를 추가할 때는 Visual Studio 오른쪽에 도구상자에서 컴포넌트를 선택해서 추가합니다.

Windows Forms Application에서 기본적으로 제공하는 컨트롤 클래스들은

 System.Windows.Forms 네임스페이스내에 존재 합니다.

.NET 콤포넌트들을 Forms Designer에 올려놓아 이벤트나 속성등을 설정하여 쉽게 응용 프로그램을 개발할 수 있습니다.

 

.NET 콤포넌트 기본 구성요소

Button : 버튼.

CheckBox : 체크박스.

CheckedListBox : 체크 박스가 있는 리스트 컨트롤.

ComboBox : 콤보박스 컨트롤.

DateTimePicker : 날짜와 시간을 선택하는 콘드롤..

Label : Label(Win32 Static Control 보다 확장) 컨트롤..

LinkLabel : 클릭하면 특정 프로그램을 실행하는 라벨 컨트롤.

ListBox : 리스트박스를 생성 합니다.

ListView : 리스트 뷰 컨트롤

MaskedTextBox : 사용자의 입력에 따라 어떤동작을 할수 있는 텍스트

박스 컨트롤.

MonthCalendar : //일을 표시하는 컨트롤.

NumericUpDown : 숫자를 증가/감소 시키는 모양의 컨트롤.

PictureBox : 이미지를 추가할 수 있는 컨트롤.

ProgressBar : 프로그레스 컨트롤.

RadioButton : 라디오 버튼 컨트롤.

RichTextBox : 리치텍스트박스 컨트롤.

TextBox : 텍스트 박스 컨트롤

ToolTip : 툴팁 컨트롤.

TreeView : 트리뷰 컨트롤.

WebBrowser : 웹 브라우징 컨트롤

FlowLayoutPannel : 컨트롤을 올려 놓을 수 있는 panel

컨트롤. 정렬및 도킹 가능.

GroupBox : 그룹박스 컨트롤

Panel : 컨트롤을 올려 놓을수 있는 Panel 컨트롤.

SplitContainer : 두 개의 Panel로 구성된 사이즈가 조절

되는 Panel 컨트롤

TabControl : 탭 컨트롤

TableLayoutPanel : 행과 열의 구조로 컨트롤을 구성할 수

 있는 Panel 컨트롤

ContextMenuStrip : Context 메뉴 컨트롤

MenuStrip : 메뉴 컨트롤

StatusStrip : 상태바 컨트롤

ToolStrip : 툴바 컨트롤

ToolStripContainer : Panel컨트롤과 비슷하고, 도킹이  

가능한 컨트롤

DataSet : 메모리에 있는 데이터 소스를 표현하는 컨트롤.

DataGridView : 데이터를 그리드에 표시할수 있는 컨트롤

BindingSource : 폼내의 컨트롤과 동적으로 연결되어

데이터를 표시하는 컨트롤.

BoundingNavigator : BindingSource와 연동하여 데이터를

 순회하거나 편집/표시 할 수 있는

컨트롤.

ReportViewer : 데이터를 리포트 형식으로 보여주는

컨트롤.

 

BackgroundWorker : 별도의 쓰레드를 생성하는 컨트롤

DirectoryEntry : 액티브 디렉토리 의 객체에 연결하는

클래스.

DirectorySearcher : 액티브 디렉토리에 쿼리를 보내는

클래스

ErrorProvider : Windows Forms 에 등록된 컨트롤에서

발생된 오류를 관리하는 클래스.

EventLog : 윈도우 시스템에서 발생하는 소프트웨어/

하드웨어 이벤트 로그를 관리하는 클래스.

FileSystemWatcher : 시스템 파일에 대한 변경 이벤트

통지를 받는 클래스.

HelpProvider : 사용자가 ‘F1’키를 눌렀을 때 도움말

기능을 제공 하는 컨트롤.

ImageList : Image캑제를 관리하는 컬렉션 클래스.

MessageQueue : Message Queueing Service를 생성하여

메시지를 주고 받을 수 있는 컨트롤.

PerformanceCounter : 시스템의 성능을 구성하는 컨트롤.

Process : 프로세스에 관련된 조작을 할 수 있는 컨트롤.

SerialPort : 시리얼 통신 컨트롤.

ServiceController : 서비스 프로그램을 조작할 수 있는

 컨트롤.

Timer : 타이머 컨트롤.

PageSetupDialog : 인쇄할 페이지를 설정하
는 다이얼로그
박스 클래스.

PrintDialog : 프린터를 선택하거나, 어느
부분을 인쇄
할지 설정하는 다이얼로그
박스 클래스.

PrintDocument : 특정 문서를 바로 인쇄하게 하는 클래스.

PrintPreviewControl : 인쇄할 페이지 미리보기 컨트롤.

PrintPreviewDialog : PrintPreviewControl을 가지고 있는 다이얼로그 박스를 생성
하는
클래스.

ColorDialog : 색상 정보를 선택하는 클래스

FolderBrowserDialog : 디렉토리 탐색 다이얼로그 박스 클래스.

FontDialog :폰트 선택하는 다이얼로그
박스

OpenFileDialog : 파일 열기 다이얼로그 박스.

SaveFileDialog : 파일 저장 다이얼로그 박스.

CrystalReportViewer : 크리스탈 리포트를 보여주는

컨트롤

ReportDocument : 보고서 정의, 서식 지정, 로드, 내보내기 및

인쇄를 위한 속성 및 메서드를 포함하는 클래스.

 

  

 

3.    Windows Forms
Application
동작

Windows Forms Application 프로그램도 다른 프로그램과 마찬 가지로 main함수가 있습니다.

[프로젝트 이름].coo 파일을 열면 다음과 같은 main함수를 볼 수 있습니다.

using namespace WinFormsTest;

 

[STAThreadAttribute]

int main(array<System::String ^> ^args)

{

        // 컨트롤이만들어지기전에Windows XP 시각효과를활성화합니다.

        Application::EnableVisualStyles       ();

        Application::SetCompatibleTextRenderingDefault(false);

 

        // 주창을만들어실행합니다.

        Application::Run(gcnew Form1());

        return 0;

}

STAThreadAttribute Attribute로 현재 메인 함수에 대한 COM Threading 모델을  Single 쓰레드 로 설정합니다

다중 쓰레드 모델로 설정할려면 MTAThreadAttribute Attribute를 선언합니다.

Application::EnableVisualStyles()메서드를 호출하여 XP스타일의 UI를 적용합니다.

그리고 Application::SetCompatibleTextRenderingDefault()함수로 텍스트를 그리는데 GDI+를 사용할지 GDI를 사용할지 설정합니다.

True GDI+를 사용하고, false GDI를 사용하여 텍스트를 그립니다.

Application::SetCompatibleTextRenderingDefault()함수는 Windows Forms 응용프로그램을 다른 응용프로그램에 삽입(host)할 때 호출하면 안돱니다.

설정들이 끝마치고 나서 디자인한 Forms를 실행합니다.

Application::Run  함수를 호출 하면 현재 메인 쓰레드에서 메시지루프를 돌면서 Forms 프로그램을 실행 합니다.

 

Forms 응용프로그램은  아래 그림과 같은 이벤트 호출 루틴으로 실행이 됩니다.

 

Forms Application 프로젝트를 생성하면 Form 클래스에 상속받은 클래스와 InitializeComponent()멤버 함수가 생성됩니다.

InitializeComponent() 함수는 Form다이얼로그에 올려진 컨트롤들의 초기화나 폼 다이얼로그의 이벤트 핸들러 추가 등을 Form Designer가 자동으로 코드를 만들어 콘트롤들을 초기화 하고 폼 컴포넌트 컨테이너에 등록하는 등의 루틴이 들어가는 함수입니다.

아래는 폼디자이너에서 컨트롤 을 추가하고 이벤트를 추가했을 때 InitializeComponet함수에서 자동으로 추가되는 코드의 일부입니다.

 

this->AutoScaleDimensions = System::Drawing::SizeF(7, 12);

this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;

this->ClientSize = System::Drawing::Size(227, 326);

//폼 컨트롤 컨테이너에 컨트롤들을 추가.

this->Controls->Add(this->elapsed_time);

this->Controls->Add(this->mine_cnt);

this->Controls->Add(this->label3);

this->Controls->Add(this->label1);

this->Controls->Add(this->menuStrip1);

this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedDialog;

this->MainMenuStrip = this->menuStrip1;

this->Name = L"MineForm";

this->Text = L"지뢰찾기v1.0";

this->Load += gcnew System::EventHandler(this, &MineForm::MineForm_Load);

this->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &MineForm::DrawItems);

this->menuStrip1->ResumeLayout(false);

this->menuStrip1->PerformLayout();

this->ResumeLayout(false);

this->PerformLayout();

 

이 함수는 편집하지 않는 것을 원칙으로 합니다.( 편집 해도 되지만 계속 편집하다 보면 사용자가 폼 디자이너를 추가/삭제하면 사용자가 넣은 코드가 지워집니다.)

///<summery>   ////</summery>  내에는 변수 선언 같은 편집을 하면 폼디자이너가 Fail되는 원인이 되니, ///<summery> ///</summery>  밖에서 변수 선언 등의 작업을 합니다.

 

Form 생성자가 호출되면 OnFormLoad 이벤트가 발생합니다.

OnFormLoad이벤트 핸들러는 폼이 로드될 때 한번만 호출 됩니다.

사용자가 생성한 컨트롤을 생성/등록할 때 OnFormLoad 이벤트 핸들러에서 하면 됩니다.

 다음은 폼 다이얼로그가 활성화 될 때 발생되는 OnFormActivated()이벤트 핸들러가 호출 됩니다.

OnFormActivated()이벤트 후, 폼 다이얼로그가 처음으로 보여졌을 때 OnShown()이벤트가 발생합니다.

여기서 만약 폼 다이얼로그가 비활성화 되면 OnFormDeactivate이벤트가 발생하고, 다시 활성화 되면 OnFormActivated이벤트가 발생합니다.

사용자에 의해 폼 응용프로그램이 종료되면 OnFormClosing() 이벤트 OnFormClosed()이벤트가 차례대로 발생하고 프로그램이 종료하게 됩니다.

 

4.    Message Filter

Win32 API/MFC에서는 윈도우의 특정 메시지를 가져올려면 해당 윈도우를 서브 클래싱 하거나 DefMessageProc멤버 함수 같은 메시지 프로시져를 재정의 함으로써 특정 메시지에 대한 동작을 작성할 수 있었습니다.

 

Windows Forms Application에서도 이와 비슷하게 특정 메시지를 전처리하기 위한 방법으로 몇 가지 방법이 있습니다.

WndProc함수를 재정의하는 방법과 메시지 필터 인터메이스 클래스를 사용하는 방법이 있습니다.

메시지 필터 인터페이스는 Application클래스의 멤버 함수인 AddMessageFilter함수로 추가 하고 RemoveMessageFilter함수로 제거 할수 있습니다.

IMessageFilter클래스의 PreFilterMessage 순가상함수를 재정의를 합니다.

PreFilterMessage함수가 true를 리턴하면 해당 메시지가 다른 메시지 필터로 처리가 되게하고 false를 리턴하면 다른 메시지필터 가 처리할 수 있도록 합니다.

PreFilterMessage함수는 링크 될 때 UnmanagedCode 권함을 필요하기 때문에 , 아래 예제 에서 처럼 속성을 줍니다.

아래 예제메세지 필터 인터페이스 클래스를 사용하는 예제 입니다.

ref class TestMessageFilter: public IMessageFilter

{
public:

[SecurityPermission(SecurityAction::LinkDemand, Flags =
SecurityPermissionFlag::UnmanagedCode)]
virtual bool PreFilterMessage( Message % m )
{

if ( m.Msg ==0x100 ) //WM_KEYDOWN
{

Int32 key = m.WParam.ToInt32();

KeysConverter tc; //Converter object that converting Integer keyvalue to string.

tc.ConvertToString(key);
return true;

}

else
return
false;

}

 

 

TestMessageFilter^ MsgFilter; //클래스 멤버 변수로 선언합니다.

sgFilter = gcnew TestMessageFilter();

Application::AddMessageFilter(MsgFilter); //Message Filter 인터페이스를 추가.

 

 

 

5.    Platform Invocation (PInvoke)

C++/CLI에서는 네이티브 API함수들을 호출할수 있는 방법을 Platform Invoke라는 이름으로 제공하고 있습니다.

이 방법은 네이티브 환경에서 dll 함수를 호출하는 방법보다 쉽고 간단하게 할 수 있습니다.

네이티브 환경에서 dll함수를 호출하는 방법과 같이 명시적 호출 방법과 묵시적 호출 방법이 있습니다.

 

묵시적 호출은 사용할 API가 있는 dll파일을 프로젝트 설정에서 추가하고

해당 함수를 extern타입으로 선언하고 사용하는 방법입니다.

//MessageBeep 함수를 묵시적으로 사용할 때 , 해당 함수 선언.

extern "C" int __stdcall MessageBeep(int);

 

명시적 호출 방법은 해당 네이티브 함수를 선언하고 dll을 명시정으로 Attribute으로 설정하여 사용하는 방법입니다.

using namespace System::Runtime::InteropServices;
[DllImport("User32.dll", EntryPoint = "FindWindow",CallingConvention = CallingConvention::Cdecl, CharSet = CharSet::Auto)]
IntPtr FindWindow( System::String^ lpClassName, System::String^ lpWindowName);

 

 

[출처] Windows Forms Application|작성자 조운

반응형
Posted by blueasa
, |

PointToClient는 커서의 위치를 어플리케이션의 위치로 계산해주는 매소드이다.

반대로 PointToScreen매소드는 어플리케이션의 위치를 모니터 스크린의 좌표값으로 계산해준다.


예제) TreeView에서 마우스로 클릭된 노드의 아이템 가져오기


 TreeNode tree = null;

               

        private void treeView1_MouseDown(object sender, MouseEventArgs e)

        {

            if (e.Button == MouseButtons.Right)

            {

                tree = treeView1.GetNodeAt(e.X, e.Y);

                // 좌표가 안나올대 PointToClient를 사용하여 좌표값을 알아올 수 있다

                //tree = treeView1.GetNodeAt(treeView1.PointToClient(Cursor.Position).X, treeView1.PointToClient(Cursor.Position).Y);

            }


        }

출처 : http://devangelma.tistory.com/76

반응형

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

윈폼에서 단축키 개발하기  (0) 2010.07.13
Windows Forms Application  (2) 2010.07.07
단축키 만들기 with C#  (1) 2010.07.07
폼과 폼간의 전송 (부모 자식간의 전송)  (0) 2010.07.07
C# 에서의 Enum  (0) 2010.07.06
Posted by blueasa
, |

키다운 이벤트나, 키업 이벤트등에 키이벤트를 추가하면 된다.

예) 컨트롤+엔터 를 단축키 지정.


private void TextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)

{

      if (e.Modifiers == Keys.Controls)

      {

          if (e.KeyCode == Keys.Enter)

          {

                MessageBox.Show("컨트롤+엔터 눌렀음");

          }

       }

}

반응형
Posted by blueasa
, |

Win App 에서는 폼간의 전송이 빈번하게 발생하지요.

웹에서는 페이지간 또는 팝업등에서 유사한 경우입니다.


먼저 왜 부모와 자식이라는 단어를 쓰는가에 의미를 둬 봅시다.


원래부터 있던 메인을 부모라고 칭하고
그 폼에서 파생되어 나온 작은 폼을 자식이라고 합니다.

자식이 부모보다 키가 작으란 법은 없으니, 부모폼은 버튼 하나만 달랑 있어도

자식폼은 거대한 application이 될 수도 있습니다. ^^;


일단 부모는 폼이 있으면 메인이 되겠지요.

사용자 삽입 이미지

여기서 "자식에게" 버튼을 누르면
위에 있는 textbox에 넣은 글을 보낼 겁니다.

우선 자식을 생성해야겠죠?
폼로드때 자식을 하나만 생성해봅시다.
사용자 삽입 이미지

그리고 button1 이벤트에서 자식에게 메세지를 보낼겁니다.

예제이고, 간단한테스트니 자식폼에 있는 Label에 바로 입력하도록 합시다.

자식으로 객채 생성한 곳에
child.label1.text  이렇게 값을 주고 싶다면

자식폼에 있는 Label 속성을 변경해 줍니다.

private , public 을 변경해 주는 거지요.

사용자 삽입 이미지


자 그러면 바로 접근이 가능해 집니다.


이제 아래와 같이 코딩을 하고 실행해서

부모폼의 버튼을 누르면 자식에게 대화가 전달됩니다. 참 쉽죠?

사용자 삽입 이미지


그런데!

부모는 자식에게 일방적으로 말을 할수 있지만


자식이 부모에게 말을 할려면

"아버님 소자의 얘기좀 들어주시겠습니까?"

라고 허락을 받아야만 합니다.

그리고 부모는

"난 언제나 니 얘기를 들을 준비가 되었다" 라고 말을 해줘야만 대화가 가능합니다.

음, 부모 자식간의 좀 딱딱한가요? 뭐! 옛날엔 그랬쟎습니까 ㅎㅎ


그럼 이 과정을 코딩해 보겠습니다.

자식폼에게는 이벤트를 생성하고

부모는 이벤트를 연결합니다.



자식부터 시작합시다.

"부모님! 저도 말좀할께요!" 라는 이벤트를 만듭니다.
사용자 삽입 이미지


버튼을 누르면 이벤트가 발생되는 구조이지요. 내용은 텍스트박스꺼를 보냅니다.



그럼 부모는

니가 말하면 받아주마라는 이벤트 연결을 해줍니다.



사용자 삽입 이미지


자 이제 실행해서 자식이 말을 하면 부모는 이벤트를 전달받아 내용을 표시해 주겠지요!

사용자 삽입 이미지


잘 이해가 되셨는지요?

데브피아의 어떤분이 문의를 하셔서 예제 소스로 만들어 드리기는 좀 그렇고 해서

강좌형식으로 적어봤습니다.

깊이 들어갈려면

델리게이트, 이벤트 등등도 설명이 되어야 하지만 일단은 이걸로 공부하면서

부모와 자식간의 관계를 이해해 보시기 바랍니다.


[다이어리]

- Written by Angelma ( Microsoft C# MVP )


출처 : http://devangelma.tistory.com/229
반응형
Posted by blueasa
, |

C# 에서의 Enum

Programming/C# / 2010. 7. 6. 22:20

기껏해봐야 C++하다 JAVA혹은 C#하는 경우가 고작이지만
새로운 언어로 코딩하려다 보면 이런 기초적인 문법에서 막힐 때가 있다.
역으로 C++로 버닝하다 간만에 C를 하는데 BOOL을 선언하고 "왜 안되지?"하는 고민할때도 있고.
 
enum역시 쓸때마다 "C#에서는 뭔가 틀린 점이 있지 않았나?" 하고 매번 의구심을 갖지만 매번 까먹는다.
또 까먹을까 싶어서 이렇게 정리해둔다.
 
C#에서의 enum은 이전의 C, C++과 다를 바가 없다.
enum 키워드를 사용하여 괄호{} 안에 상수를 열거하는 것.
이때 열거된 상수들은 정수 계열 형식을 갖는다.
아무런 값을 초기화시키지 않았을 경우,
기본적으로 첫 번째 열거자의 값은 0, 그 이후로 열거자 값은 순서대로 1씩 증가한다.
 msdn의 예를 들면
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
 이때, Sat = 0, Sun = 1 ..... Fri = 6 을 값으로 갖는다는 말.
그런데 열거자의 값을 설정할 수도 있다. 위의 예를 변형하여 설명하면
enum Days {Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri};
이렇게하면 Sat의 값은 1이 되고 그 숫자 이후로 각 열거자들의 값이 설정된다.
즉, Sun = 2, Mon = 3, ... , Fri = 7 을 값으로 갖는다.
enum으로 선언한 상수들은 정수 계열의 형식을 갖지만 실제로 정수 계열의 형식으로 변환하기 위해서는
명시적 캐스트가 있어야 한다.
int x = (int)Days.Sun;
enum으로 선언한 상수들의 형식을 지정해 줄 수도 있다.
enum Days : float {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
위와 같이 선언하면 Days의 상수들은 전부 float형의 값을 가지게 된다.

[출처] C# 에서의 Enum|작성자 Triumph

반응형
Posted by blueasa
, |