본문 바로가기

.NET/WinForm

(9)
[WinForm] Drag & Drop으로 컨트롤과 컨트롤 간에 개체 옮기기 WinForm에서 Drag & Drop으로 파일 끌어다 놓기에 대한 포스팅을 한 적이 있다. [.NET Framework/WinForm] - [WinForm] Drag & Drop으로 파일 가져오기 [WinForm] Drag & Drop으로 파일 가져오기 파일을 마우스로 끌어서 WinForm의 RichTextBox 컨트롤에 가져다 놓으면 파일을 읽어서 내용을 RichTextBox에 출력해주는 프로그램을 만들어본다. 기본적으로 WinForm의 컨트롤은 Drag&Drop에 대한 처리가 구 cs-solution.tistory.com 이번에는 파일 뿐만 아니라 원하는 형식을 지정해서 값을 옮겨다 놓는 방법에 대해 소개하려고 한다. 먼저 WinForm에서 컨트롤과 컨트롤 간의 Drag & Drop은 ItemDra..
[WinForm] Invoke() delegate 생성 없이 한 문장으로 간단하게 사용하기 참고하면 좋은 C# Solution의 다른 글 [C#] delegate와 delegate 체인 delegate(델리게이트)는 C++의 함수 포인터와 비슷한 기능을 하는 C#의 기능으로, '대리자'라는 의미처럼 메서드를 대신 호출해주는 기능을 한다. 메서드를 대신 호출해주는 기능이 왜 필요할까? 사 cs-solution.tistory.com [WinForm] 크로스 스레드(Cross Thread) 문제 해결 WinForm에서 Thread를 사용해 폼의 컨트롤을 갱신하려고 시도하면 크로스 스레드 예외가 발생한다. 이는 컨트롤을 생성해 관리하는 스레드는 메인 스레드인데, 사용자가 생성한 외부 스레드에서 메 cs-solution.tistory.com Thread에서 Form에 있는 Control의 값을 변경하려..
[WinForm] Drag & Drop으로 파일 가져오기 파일을 마우스로 끌어서 WinForm의 RichTextBox 컨트롤에 가져다 놓으면 파일을 읽어서 내용을 RichTextBox에 출력해주는 프로그램을 만들어본다. 기본적으로 WinForm의 컨트롤은 Drag&Drop에 대한 처리가 구현되지 않았기 때문에 아래와 같이 파일을 가져다 올리면 🚫와 같은 모양으로 마우스 커서가 바뀌고, 파일을 놓아도 아무 일도 발생하지 않는다. Drag&Drop 이벤트를 구현하기 위해 몇 가지 단계를 거친다. 1. Drag&Drop을 처리할 컨트롤에서 AllowDrop 속성을 true로 설정해준다. AllowDrop 속성은 컨트롤에서 끌어서 놓기 작업을 수행할 수 있는지의 여부를 나타내는 속성이다. 만약 AllowDrop 속성이 속성 창에서 보이지 않는다면, 코드상에서 직접 A..
[WinForm] 마우스 휠로 이미지 확대/축소 마우스 휠을 올리고 내리는 동작은 MouseEventArgs의 Delta 속성의 값을 경신한다. 마우스 휠을 아래로 스크롤하는 경우 Delta는 음수 값을 가지고, 위로 스크롤하는 경우 Delta는 양수 값을 가진다. 또한 대부분의 이미지 프로그램에서, 위로 스크롤은 확대, 아래로 스크롤은 축소로 동작한다. 컨트롤의 마우스 휠 이벤트는 기본적으로 속성 창에는 표시되지 않기 때문에 디자이너를 통해서 자동으로 생성할 수는 없고 코드를 통해 직접 생성하여 등록할 수 있다. private void MouseWheelEvent(object sender, MouseEventArgs e) { var pictureBox = sender as PictureBox; if(e.Delta > 0) { box.Size = ne..
[WinForm] 텍스트박스 입력 무시/숫자만 입력 가능하도록 하기 텍스트박스는 일반적으로 포커스가 컨트롤에 있고 키보드 입력이 발생하면 일단 문자가 삽입된다. 텍스트박스에 입력을 불가능하게 하거나, 특정 문자만 입력을 허용하도록 하는 방법을 소개한다. 우선, 이러한 동작을 가능토록 하려면 KeyPress 이벤트를 사용해야 한다. KeyPress 이벤트는 KeyPressEventArgs 매개변수를 갖는데, 이 매개변수의 Handled 속성을 사용하여 입력 값을 제어할 수 있다. Key Event의 발생 순서는 KeyDown -> KeyPress -> 컨트롤 처리 -> KeyUp 순서로 진행되는데, 만약 KeyPress 이벤트에서 Handled를 true로 변경한다면 컨트롤 처리 부분은 진행되지 않는다. 여기서 컨트롤 처리는 컨트롤에 입력된 문자를 삽입하는 과정을 포함하고..
[WinForm] 크로스 스레드(Cross Thread) 문제 해결 WinForm에서 Thread를 사용해 폼의 컨트롤을 갱신하려고 시도하면 크로스 스레드 예외가 발생한다. 이는 컨트롤을 생성해 관리하는 스레드는 메인 스레드인데, 사용자가 생성한 외부 스레드에서 메인 스레드의 자원을 수정하려고 시도했기 때문에 발생하는 예외이다. 가장 쉬운 해결 방법은 스레드 대신 Timer를 사용하는 것이다. 타이머는 메인 스레드 내에서 돌아가는 비동기 실행기이기 때문에 크로스 스레드 예외가 발생하지 않는다. 그러나 이 방법은 비동기 처리 방법을 타이머 하나로 제한하므로 완벽한 해결 방법이라고 볼 수 없다. 단지 스레드보다 관리하기도 쉽고 크로스 스레드 예외를 발생시키지 않는 한 가지 해결 방법일 뿐이다. 크로스 스레드의 정석적인 해결 방법은 Invoke() 메서드를 사용하는 것이다. ..
[WinForm] RichTextBox의 글꼴이 자동으로 변경될 때 RichTextBox에서 한글과 영어를 번갈아 입력하다 보면 처음 설정한 글꼴과 다른 글꼴로 멋대로 변경되는 것을 볼 수 있다. RichTextBox의 LanguageOption 속성에 의해 글꼴의 배율이 조정되면서 글꼴이 변경되는 것으로 추정된다. RichTextBox.LanguageOption의 기본값은 RichTextBoxLanguageOptions.AutoFontSizeAdjust이며, 이 옵션으로 인해 한글 글꼴이 영어 글꼴보다 약간 크므로 글꼴의 크기를 일관적으로 보여주기 위해 영어 글꼴을 Arial로 변경하는 것 같다. 따라서 아래와 같이 폼의 생성자 등에서 RichTextBox를 사용하기 전에 LanguagaOption을 변경하고 사용하자. public partial class Form1 ..
[WinForm] 컨트롤이 깜빡거리는 현상 해결 (DoubleBuffered 속성) 컨트롤이 많은 처리를 하거나, 컨트롤에 표시되는 데이터가 짧은 시간 안에 여러 번 갱신되어야 할 때 컨트롤이 깜빡거리는 현상을 볼 수 있다. (특히 ListView나 PictureBox 등) 이러한 현상을 해결하기 Control 클래스에는 위해 컨트롤의 이중 버퍼링을 활성화하여 깜빡임을 최소화하는 DoubleBuffered 속성이 존재하는데, 이 속성은 protected로 선언되어 있기 때문에 Control 클래스를 상속받아 생성되는 컨트롤에서 DoubleBuffered 속성에 접근하기 위한 별도의 방법을 public으로 제공하지 않는다면 속성 창을 통해서, 또는 참조 변수를 통해 접근할 수 없다. 그러나 Reflection 기능을 사용해서 이 속성을 켜줄 수 있다. 아래 코드를 폼의 생성자 등 적절한 ..
[WinForm] Form이 열려있는지 확인하는 방법 모달리스 대화상자를 사용하다 보면 부모 윈도우에서 자식 윈도우가 열려있는지 확인해야 할 상황이 생길 수 있다. 아래와 같은 방법으로 확인할 수 있다. public partial Form1 : Form { public bool IsOpen { get { var openForms = Application.OpenForms; foreach(Form f in openForms) if(f == this) return true; return false; } } } 위와 같이 자식 윈도우에 IsOpen 속성을 생성하면 폼 외부에서 참조를 사용해 창이 열린 상태인지 확인할 수 있다.