Windows Forms FAQ - Windows Forms
출처 : http://www.microsoft.com/korea/msdn/smartclient/community/wffaq/default.aspx
Stuart Celarier, Fern Creek, www.ferncrk.com (영문)
.NET/XML 컨설턴트, 교육 과정 개발자, 트레이너
의견이나 수정할 내용이 있으시면 faq@ferncrk.com으로 전자 메일을 보내주십시오.
이 문서를 작성하는 데 큰 도움이 되었던 syncfusion.com (영문)의 Windows Forms FAQ 저자인 George Shepherd (영문)에게 깊은 감사를 드립니다.
수정일: 2005년 1월 24일 6:12 PM 태평양 표준시
Windows Forms FAQ Pages
Windows Forms | 컨트롤 및 구성 요소(일반) | 컨트롤 및 구성 요소(특정) | 데이터 | .NET Framework | 도구 | Windows Forms 2.0
이 페이지의 내용
모든 대답을 표시하려면 선택하십시오.
Windows Forms FAQ의 구성 방법
이 FAQ의 항목은 일련의 페이지로 구성되어 있습니다. 여러 페이지로 구성된 이러한 항목의 구성 방법과 항목 간의 관계는 다음과 같습니다.
Windows Forms
Windows Forms에서는 .NET Framework 1.0 및 1.1에서의 Windows Forms 응용 프로그램, System.Windows.Forms.Form 클래스, 공용 대화 상자, 일반적인 몇 가지 읽기 권장 사항을 다룹니다.
주요 관계. 폼은 컨트롤이고 컨트롤은 구성 요소입니다. 폼에 적용되지만 폼에 한정되지는 않는 정보는 컨트롤 및 구성 요소(일반)을 참조하십시오.
관련 섹션. Visual Studio와 기타 도구 및 유틸리티를 사용하여 Windows Forms를 개발 및 디버깅하는 방법은 도구를 참조하십시오.
Windows Forms 응용 프로그램과 관련된 System.Windows.Forms 네임스페이스 외부의 정보는 .NET Framework를 참조하십시오.
Visual Studio 2005 및 .NET Framework 2.0을 사용하는 Windows Forms에 대한 자세한 내용은 Windows Forms 2.0을 참조하십시오.
컨트롤 및 구성 요소(일반)
컨트롤 및 구성 요소(일반)에서는 클래스의 모양 및 동작(behavior)과 디자인 타임 문제를 비롯하여 System.Windows.Forms.Control 및 System.ComponentModel.Componen 클래스를 다룹니다. Internet Explorer에서 컨트롤을 호스팅하는 것에 대한 섹션이 포함되어 있습니다.
주요 관계. 컨트롤은 구성 요소이고 폼은 컨트롤입니다.
관련 섹션. 특정 컨트롤 및 구성 요소(예: 컨트롤 및 구성 요소에서 파생된 클래스)는 컨트롤 및 구성 요소(특정)를 참조하십시오.
모든 컨트롤에 적용되는 데이터 소스 및 데이터 바인딩은 데이터를 참조하십시오.
특정 컨트롤에 적용되는 데이터 소스 및 데이터 바인딩은 컨트롤 및 구성 요소(특정)를 참조하십시오.컨트롤 및 구성 요소(특정)
컨트롤 및 구성 요소(특정)에서는 System.Windows.Forms.Control 및 System.ComponentModel.Component에서 파생된 클래스를 다룹니다.
주요 관계. 컨트롤은 구성 요소이고 메뉴는 구성 요소이며 ContextMenu는 메뉴입니다. 도구 설명은 구성 요소이지만 대부분의 도구 설명 질문은 특정 컨트롤과 관련됩니다.
예외. 폼은 컨트롤이지만 폼에 대한 자세한 내용은 Windows Forms를 참조하십시오. CommonDialog는 구성 요소이지만 CommonDialog에 대한 자세한 내용은 Windows Forms을 참조하십시오.
관련 섹션. 모든 컨트롤과 구성 요소에 적용되는 정보는 컨트롤 및 구성 요소(일반)를 참조하십시오.
모든 컨트롤에 적용되는 데이터 소스 및 데이터 바인딩은 데이터를 참조하십시오.
데이터
데이터에서는 모든 컨트롤에 적용되는 데이터베이스, 데이터 소스, DataSet 클래스 및 데이터 바인딩을 다룹니다.
관련 섹션. 컨트롤 및 구성 요소컨트롤 및 구성 요소(특정)를 참조하십시오.
.NET Framework
.NET Framework에서는 CLR(Common Language Runtim) 기능, System.Windows.Forms 네임스페이스 외부의 FCL(Framework Class Library), Windows Form 응용 프로그램에 제한되지 않고 모든 .NET Framework 응용 프로그램에 적용되는 문제 등을 다룹니다.
관련 섹션. System.Windows.Forms 네임스페이스 및 Windows Forms 응용 프로그램에 대한 자세한 내용은 Windows Forms, 컨트롤 및 구성 요소(일반) 및 컨트롤 및 구성 요소(특정) 를 참조하십시오.
System.Data 네임스페이스 및 데이터 바인딩에 대한 자세한 내용은 데이터를 참조하십시오.
Visual Studio와 기타 도구 및 유틸리티를 사용하여 .NET Framework에서 소프트웨어를 개발 및 디버깅하는 방법은 도구를 참조하십시오.
Windows Forms 2.0 응용 프로그램과 관련된 .NET Framework 2.0에 대한 자세한 내용은 Windows Forms 2.0을 참조하십시오.
도구
도구에서는 Windows Forms 응용 프로그램 및 기타 .NET Framework 응용 프로그램을 일반적으로 개발 및 디버깅하는 데 사용되는 Visual Studio 및 다른 도구와 유틸리티를 다룹니다.
관련 섹션. 디자이너에서 작동하는 컨트롤을 개발하고 디자인 타임에 컨트롤 작업을 수행하는 방법은 컨트롤 및 구성 요소(일반)에서 디자인 타임 섹션을 참조하십시오.
디자이너에서의 데이터 바인딩에 대한 자세한 내용은 데이터를 참조하십시오.
Windows Forms 2.0
Windows Forms 2.0에서는 Visual Studio 2005를 사용하는 .NET Framework 2.0의 Windows Forms와 관련된 문제를 다룹니다.
관련 섹션. .NET Framework 2.0에서 계속 사용할 수 있는 .NET Framework
1.1의 Windows Forms에 대한 자세한 내용은 Windows Forms, 컨트롤 및 구성 요소(일반), 컨트롤 및 구성 요소(특정), 데이터, 및 도구를 참조하십시오.Windows Forms (System.Windows.Forms.Form)
일반
-
Windows Forms에 대한 간략하고 정확한 소개를 어디에서 확인할 수 있습니까?
2001년 2월 MSDN Magazine에서 Jeff Prosise의 Windows Forms: GUI 응용 프로그램을 작성하기 위한 현대적인 프로그래밍 모델을 참조하십시오. 또한 MSDN Library에서 Shawn Burke의 Microsoft .NET Framework를 사용하여 Windows 기반 응용 프로그램 만들기 (영문)를 참조하십시오.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
폼의 AcceptButton 속성을 설정합니다. 디자이너를 통해 또는 다음과 같이 코드를 통해 이 속성을 설정할 수 있습니다.
form1.AcceptButton = button1;
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
공용 속성을 폼에 추가합니다. 그러면 폼의 인스턴스를 만드는 모든 개체에서 이러한 속성을 액세스할 수 있습니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
VB6과 다르게 여러 폼을 작업하는 방법은 무엇입니까?
MSDN Library에서 Duncan Mackenzie의 Visual Basic .NET에서 여러 폼 작업: .NET으로 업그레이드 (영문)를 참조하십시오.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
안타깝게도 아주 간편하게 폼을 인쇄할 수 있는 방법은 없습니다. 아래의 단계에 따라 폼을 인쇄할 수 있습니다.
1.응용 프로그램에 인쇄 기능을 추가합니다.
이렇게 하려면 PrintDocument 구성 요소를 응용 프로그램에 추가해야 합니다. 도구 상자에서 PrintDocument를 폼으로 끌어 놓습니다. 그런 다음 문서를 인쇄할 수 있도록 PrintDialog를 만들고 코드를 추가해야 합니다.
private void buttonPrint_Click( object sender, EventArgs e ) { PrintDialog printDialog1 = new PrintDialog(); printDialog1.Document = printDocument1; DialogResult result = printDialog1.ShowDialog(); if ( result == DialogResult.OK ) printDocument1.Print(); }
인쇄 프레임워크에 대한 자세한 내용은 MSDN Library에서 Windows Forms 인쇄 지원 (영문)(Visual Studio)을 참조하십시오.
2. 인쇄 시에 폼을 그립니다.
이 단계는 약간 복잡합니다. printDocument1의 PrintPage를 처리하고 폼을 프린터 장치에 그려야 합니다. 이 경우에 폼을 이미지에 복사한 다음 프린터 장치에서 그릴 수 있습니다.
using System.Drawing.Printing; private void printDocument1_PrintPage( object sender, PrintPageEventArgs e) { Graphics graphic = CreateGraphics(); Image memImage = new Bitmap( Size.Width, Size.Height, graphic ); Graphics memGraphic = Graphics.FromImage( memImage ); IntPtr dc1 = graphic.GetHdc(); IntPtr dc2 = memGraphic.GetHdc(); BitBlt( dc2, 0, 0, ClientRectangle.Width, ClientRectangle.Height, dc1, 0, 0, 13369376 ); graphic.ReleaseHdc( dc1 ); memGraphic.ReleaseHdc( dc2 ); e.Graphics.DrawImage( memImage, 0, 0 ); }
위에 내용은 C# Corner (영문)에서 제공되는 Michael Gold의 .NET에서 폼 화면 캡처 - GDI+에서 GDI 사용 (영문) 기사를 참조했습니다.
3.API 함수를 선언합니다.
2단계에서는 BitBlt 함수가 사용되었습니다. 이 함수는 관리되지 않는 함수입니다. DllImport (영문) 특성을 사용하여 이 함수를 코드로 가져와야 합니다. 이것이 3단계이기는 하지만 언제든지 이 단계를 수행할 수 있습니다.
using System.Runtime.InteropServices; [ DllImport( "gdi32.dll" ) ] private static extern bool BitBlt( IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, System.Int32 dwRop );
Lion Shi, Microsoft, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
PrintPreview를 최대화된 창으로 표시하고 확대/축소를 제어하는 방법은 무엇입니까?
PrintPreviewDialog 클래스의 WindowState 속성을 사용하여 PrintPreview를 최대화할 수 있습니다. 확대/축소를 처리하기 위해 PrintPreviewDialo에는 PrintPreviewControl 속성이 있습니다. PrintPreviewControl에는 PrintPreview의 확대/축소 비율을 설정할 수 있는 Zoom 속성이 있습니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
gdi32.dll에서 BitBlt 함수를 P/Invoke하여 이 문제를 처리할 수 있습니다.
using System; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; using System.Windows.Forms; class CustomForm : Form { [ DllImport( "gdi32.dll" ) ] private static extern bool BitBlt( IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, Int32 dwRop ); private const Int32 SRCCOPY = 0xCC0020; public void SaveImage( string filename ) { using ( Graphics g1 = CreateGraphics() ) { Image image = new Bitmap( ClientRectangle.Width, ClientRectangle.Height, g1 ); using ( Graphics g2 = Graphics.FromImage( image ) ) { IntPtr dc1 = g1.GetHdc(); IntPtr dc2 = g2.GetHdc(); BitBlt( dc2, 0, 0, ClientRectangle.Width, ClientRectangle.Height, dc1, 0, 0, SRCCOPY ); g2.ReleaseHdc( dc2 ); g1.ReleaseHdc( dc1 ); } image.Save( filename, ImageFormat.Bmp ); } } }
Simon Murrell, and Lion Shi, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
특정 폼의 TextBox를 다른 폼에서 액세스하는 방법은 무엇입니까?
한 가지 방법은 TextBox를 공용 속성 또는 공용 필드로 만드는 것입니다. 그런 다음 해당 부모(parent) 폼의 인스턴스를 통해 TextBox에 액세스할 수 있습니다. 따라서 TextBox1이 FormA의 공용 멤버이고 myFormA가 FormA의 인스턴스인 경우 다음과 같은 코드를 myFormA이 알려진 아무 곳에서나 사용할 수 있습니다.
string strValue = myFormA.TextBox1.Text;
이 기술을 사용하는 방법은 이 VB 프로젝트에서 확인할 수 있습니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
일반적으로 폼을 표시하려는 경우에는 Visible 속성을 true로 설정합니다. 이렇게 하면 폼이 표시되고 포커스도 설정됩니다. 그러나 경우에 따라서는 사용자가 클릭할 때까지 포커스가 설정되지 않기를 바랄 수 있습니다. 이렇게 하려면 다음 유틸리티 코드를 사용합니다.
폼을 활성화하지 않고 표시하려는 경우:
UtilFuncs.SetVisibleNoActivate( myForm, true ); // true to show.
폼을 숨기려는 경우:
UtilFuncs.SetVisibleNoActivate( myForm, false ); // false to hide.
public class UtilFuncs { [ DllImport( "user32.dll" ) ] extern public static bool SetWindowPos( IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags ); public const int HWND_TOPMOST = -1; // 0xffff public const int SWP_NOSIZE = 1; // 0x0001 public const int SWP_NOMOVE = 2; // 0x0002 public const int SWP_NOACTIVATE = 16; // 0x0010 public const int SWP_SHOWWINDOW = 64; // 0x0040 public static void ShowWindowTopMost( IntPtr handle ) { SetWindowPos( handle, (IntPtr) HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_SHOWWINDOW ); } public static void SetVisibleNoActivate( Control control, bool visible ) { if ( visible ) ShowWindowTopMost( control.Handle ); control.Visible = visible; } }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
Windows Forms 응용 프로그램의 임의 위치에서 발생하는 예외를 파악하는 방법은 무엇입니까?
System.Windows.Forms 네임스페이스에서 Application.ThreadException (영문) 이벤트를 처리할 수 있습니다.
using System.Threading; [STAThread] public static void Main() { Application.ThreadException += new ThreadExceptionEventHandler( UnhandledExceptionCatcher ); Application.Run( new Form1() ); } private static void UnhandledExceptionCatcher(object sender, ThreadExceptionEventArgs e) { Console.WriteLine( "Caught an unhandled exception" ); }
더 자세한 VB 및 C# 샘플을 보려면 .NET Framework 클래스 라이브러리의 Application.ThreadException (영문)을 참조하십시오.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
폼의 시스템 메뉴에 항목을 추가하는 방법은 무엇입니까?
이렇게 하려면 iterop를 사용하여 GetSystemMenu 및 AppendMenu Win32 API에 액세스할 수 있습니다. 또한 폼의 WndProc 메서드를 오버라이드(override)하여 메뉴 메시지에 대해 파악하여 동작(behavior)을 수행하도록 해야 합니다. Microsoft 뉴스 그룹에 있는 Lion Shi의 게시물에서 이 방법을 볼 수 있습니다. 몇 가지 샘플 프로젝트를 확인하십시오.
George Shepherd, Syncfusion 및 Lion Shi, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
프로그래밍 방식으로 비트맵에서 폼의 아이콘을 설정하는 방법은 무엇입니까?
아래 코드에 나온 방법을 사용할 수 있습니다.
Form form1 = new Form(); Bitmap bmp = imageList1.Images[index] as Bitmap; form1.Icon = Icon.FromHandle(bmp.GetHicon());
이에 대한 예를 보려면 첨부된 샘플을 참조하십시오.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
System.Windows.Forms.Application.CompanyName에 의해 반환되는 회사 이름을 설정하는 방법은 무엇입니까?
이것은 어셈블리 특성입니다. Visual Studio 개발 환경에서는 이 특성을 AssemblyInfo.cs(또는 .vb) 파일에 설정합니다. 이 파일을 열 경우 회사 및 버전 번호를 비롯하여 설정할 수 있는 어셈블리 특성의 블록이 표시됩니다.
[assembly: AssemblyCompany( "Syncfusion, Inc." )]
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
장시간 작업 도중에 상태 대화 상자를 백그라운드로 표시하고 사용자가 이를 취소할 수 있게 하는 방법은 무엇입니까?
이렇게 하려면 배경 스레드의 실행이 시작되었을 때 새 스레드를 시작하고 상태 대화 상자에 대한 Application.Run을 실행합니다. 변경 내용을 백분율로 표시하려면 BeginInvoke를 사용하여 폼이 만들어진 스레드에서 특정 대리자를 비동기식으로 실행합니다.
상태 대화 상자를 별개의 스레드로 표시하는 BackgroundThreadStatusDialog 클래스의 전체 구현을 보려면 ProgressThread progressthread.zip 샘플을 다운로드하십시오.
코드에서 BackgroundThreadStatusDialog를 사용하려면 루프 안에서 진행률을 업데이트하고 IsCanceled 상태를 확인하여 사용자가 취소 단추를 눌렀는지 감지해야 합니다.
private void button1_Click(object sender, System.EventArgs e) { BackgroundThreadStatusDialog statusDialog = new BackgroundThreadStatusDialog(); try { for (int n = 0; n < 1000; n++) { statusDialog.Percent = n/10; int ticks = System.Environment.TickCount; while (System.Environment.TickCount - ticks < 10) ; if (statusDialog.IsCanceled) return; } statusDialog.Close(); MessageBox.Show(statusDialog.IsCanceled ? "Canceled" : "Success"); } finally { statusDialog.Close(); } }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
폼의 컨트롤이 읽기 전용인지 아닌지를 쉽게 관리하는 방법은 무엇입니까?
한 가지 방법은 모든 컨트롤을 단일 GroupBox에 포함시킨 다음 GroupBox.Enabled 속성을 사용하여 컨트롤이 편집 가능 여부를 관리하는 것입니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
사용자가 모달 대화 상자에서 다른 창을 클릭했는지 감지하는 방법은 무엇입니까?
Form.Deactivate 이벤트를 사용합니다.
Deactivate += new EventHandle( OnDeactivate ); // ... private void OnDeactivate( object s, EventArgs e ) { Close(); }
Shawn Burke, Microsoft, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
폼이나 컨트롤을 위한 HWND를 얻는 방법은 무엇입니까?
HWND를 반환하는 Control.Handle 속성을 참조하십시오. 이 핸들을 일부 Win32 API에 Windows Forms 컨트롤로 전달할 경우 이 HWND를 현수 참조 상태로 놔두는 핸들을 다시 만들 수 있도록 고유한 핸들 관리를 수행해야 한다는 것에 주의하십시오.
Shawn Burke, Microsoft, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
폼이 작업 표시줄에 표시되지 않게 하는 방법은 무엇입니까?
폼이 Windows 작업 표시줄에 표시되지 않게 하려면 폼의 ShowInTaskbar 속성을 False로 설정해야 합니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
바탕 화면 좌표를 사용하여 폼의 위치를 설정하거나 제어하려면 SetDeskTopLocation 속성을 사용합니다. 자식(child) 폼의 TopMost를 False로 설정하고 해당 Owner 속성을 기본 폼으로 설정하여 이 작업을 수행할 수 있습니다.
this.SetDesktopLocation( 1, 1 );
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
항상 모든 응용 프로그램의 창 위에 표시되는 모달이 아닌 최상위 폼을 만드는 방법은 무엇입니까?
Visual Studio의 찾기 대화 상자를 예로 들 수 있습니다.
기본 폼을 해당 폼의 " Owner"로 만듭니다. 자세한 내용은 클래스 참조의 Form.Owner를 참조하십시오.findReplaceDialog.Owner = this; // where 'this' is the main form findReplaceDialog.TopLevel = false;
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
내 응용 프로그램에 대해서만 'TopMost'이고 다른 응용 프로그램의 경우에는 'TopMost'가 아닌 폼을 만드는 방법은 무엇입니까?
이렇게 하려면 자식(child) 폼의 TopMost를 False로 설정하고 해당 Owner 속성을 기본 폼으로 설정합니다.
Form1 f = new Form1(); f.TopMost = false; f.Owner = this; f.Show();
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
여러 컨트롤에서 공용 이벤트 처리기를 공유하는 방법은 무엇입니까?
VB6에서는 여러 컨트롤에서 공용 처리기 핸들 이벤트를 갖기 위해 컨트롤 배열을 사용했습니다. Windows Forms에서는 어떻게 해야 합니까?
단일 메서드에 의해 처리되는 여러 다른 컨트롤에서 이벤트를 지정할 수 있습니다. 처리기를 정의할 경우 Handles 인수에서 여러 이벤트를 나열하여 처리될 해당 이벤트를 나열할 수 있습니다. 다음 문은 서로 다른 textbox 세 개의 TextChanged 이벤트를 처리합니다.
Private Sub TextsChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles TextBox1.TextChanged, TextBox2.TextChanged, TextBox3.TextChanged
TextsChanged 처리기에서 이벤트를 발생시킨 특정 컨트롤을 식별해야 할 수 있습니다. 이 sender 매개 변수는 컨트롤을 보유합니다. 다음과 같은 코드와 함께 사용할 수 있습니다.
Dim eventTextBox as TextBox = sender
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
폼 및 컨트롤 만들기
-
Form 클래스의 이름에서 Form 클래스의 인스턴스를 만드는 방법은 무엇입니까?
System.Reflection.Assembly.CreateInstance 메서드를 사용하여 폼 이름에서 폼을 만들 수 있습니다. 아래에는 코드 조각이 나와 있습니다. 텍스트 상자의 이름은 네임스페이스를 포함하는 전체 이름이어야 합니다. 따라서 네임스페이스 MyCompanyName에 Form2라는 클래스가 있을 경우 텍스트 상자는 MyCompanyName.Form2를 포함합니다. 또한 이 코드 조각에서는 현재 실행되는 어셈블리에 클래스가 정의된다고 가정합니다. 그렇지 않을 경우에는 정적 메서드 GetExecutingAssembly를 호출하는 대신에 클래스를 포함하는 어셈블리의 인스턴스를 만들어야 합니다. 이 게시판에서 언급한 것처럼 이러한 방식으로 리플렉션(reflection)을 사용하는 것은 성능에 영향을 줄 수 있습니다.
실제 샘플을 다운로드할 수 있습니다(VB.NET, C#).
try { Assembly assembly = Assembly.GetExecutingAssembly(); // if class is located in another DLL or EXE, // then use Assembly.LoadFrom("myDLL.DLL"); Form form = (Form) assembly.CreateInstance( textBox1.Text ); form.Show(); } catch ( Exception ex ) { MessageBox.Show( "Error creating: " + textBox1.Text ); }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
시작될 때 표시되지 않는 폼을 만드는 방법은 무엇입니까?
Form.Visible을 false로 설정해도 기본 폼이 시작될 때 숨겨지지 않습니다. 기본 폼을 시작할 때 표시하지 않으려면 어떻게 해야 합니까?
이 문제는 .NET 문서의 기사에 설명되어 있습니다. "처음부터 표시되지 않도록 폼 설정"을 검색해보십시오. 해결 방법은 기본 폼과 다른 모듈에서 응용 프로그램을 시작하는 것입니다. 이렇게 하면 응용 프로그램과 기본 폼은 별개의 수명을 가집니다. 참조된 기사에서는 샘플 코드가 제공됩니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
모덜리스 대화 상자의 인스턴스가 한 번에 하나만 작성되거나 열리도록 하는 방법은 무엇입니까?
한 가지 방법은 열려 있는 모덜리스 대화 상자의 목록을 유지 관리하고 새 대화 상자를 열기 전에 이 목록을 검사하여 이미 다른 대화 상자가 존재하는지 여부를 확인하는 것입니다.
이러한 모든 모덜리스 대화 상자를 동일한 '기본' 폼에서 열 경우 해당 기본 폼의 OwnedForms 속성을 사용하여 열려 있는 대화 상자의 목록을 유지 관리할 수 있습니다. 아래에는 이 작업을 수행하는 방법을 보여 주는 코드 조각이 나와 있습니다. 대화 상자 폼은 소유권을 해제할 수 있어야 한다는 점에 유의하십시오. 아래에서는 이를 위해 Owner 필드를 대화 상자 폼에 추가합니다.
새 대화 상자를 열거나 이미 열려 있는 대화 상자를 표시하는 샘플 코드:
private void button1_Click( object sender, EventArgs e ) { foreach ( Form f in this.OwnedForms ) { if ( f is Form2 ) { f.Show(); f.Focus(); return; } } //need a new one Form2 f2 = new Form2(); AddOwnedForm( f2 ); f2.Owner = this; f2.Show(); }
Form2 코드:
public class Form2 : System.Windows.Forms.Form { private System.Windows.Forms.Label label1; public Form Owner; // ... private void Form2_Closing( object sender, CancelEventArgs e ) { Owner.RemoveOwnedForm( this ); } }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
런타임에 컨트롤을 Windows Form에 추가하는 방법은 무엇입니까?
런타임에 컨트롤을 추가하려면 다음 세 개의 단계를 수행합니다.
컨트롤을 만듭니다.
컨트롤 속성을 설정합니다.
컨트롤을 폼의 Controls 컬렉션에 추가합니다.
일반적으로 디자인 타임에 컨트롤을 추가할 때 디자이너에 의해 생성된 코드를 보면 추가해야 할 코드가 무엇인지 정확하게 알 수 있습니다. 대개 런타임에 동일한 코드를 사용할 수 있습니다.
다음 코드 조각에서는 런타임에 TextBox를 만듭니다.
[C#]
TextBox tb = new TextBox(); // step 1 tb.Location = new Point( 10, 10 ); // step 2 tb.Size = new Size( 100, 20 ); tb.Text = "I was created at runtime"; this.Controls.Add( tb ); // step 3
[Visual Basic]
Dim tb as TextBox = New TextBox() ' step 1 tb.Location = New Point(10, 10) ' step 2 tb.Size = New Size(100, 20) tb.Text = "I was created at runtime" Me.Controls.Add(tb) ' step 3
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목에는 현재 .NET Framework 1.1 릴리스가 적용됩니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
어셈블리 또는 DLL에서 컨트롤을 동적으로 로드하는 방법은 무엇입니까?
System.Reflection을 사용하여 컨트롤을 동적으로 로드할 수 있습니다. 다음 샘플은 SpecControls.dll에서 SpecControls.ColorControl을 로드합니다.
[C#]
using System.Reflection; Assembly assembly = Assembly.LoadFrom( "SpecControls.dll" ); Type t = assembly.GetType( "SpecControls.ColorControl" ); // create an instance and add it to the parent's controls Control c = (Control) Activator.CreateInstance( t ); parent.Controls.Add( c );
[Visual Basic]
Imports System.Reflection Dim assembly1 As Assembly = Assembly.LoadFrom("SpecControls.DLL") Dim t As Type = assembly1.GetType("SpecControls.ColorControl") ' create an instance and add it to the parent's controls Dim c As Control = CType(Activator.CreateInstance(t), Control) parent.Controls.Add(c)
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목에는 현재 .NET Framework 1.1 릴리스가 적용됩니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
프로그래밍 방식으로 컨트롤을 폼에 추가하고 컨트롤이 표시되도록 하는 방법은 무엇입니까?
런타임에 컨트롤을 폼에 추가했는데 표시되지 않습니다. 무엇이 잘못되었습니까?
디자인 타임 도중에 추가된 컨트롤에 대해 VS에서 Windows Forms 프로젝트에 추가하는 InitializeComponent 메서드와 비슷한 코드를 구현 및 실행했는지 확인합니다. 이미 알고 있겠지만, 컨트롤을 만들어 크기와 위치를 지정하고 컨트롤을 표시한 다음에 컨트롤을 폼의 Controls 컬렉션에 추가하기 위해 Forms 생성자에서 InitializeComponent()가 호출됩니다. 따라서 런타임의 코드는 이러한 작업을 똑같이 수행해야 합니다. 특히 새 컨트롤을 폼의 Controls 컬렉션에 추가하는 this.Controls.AddRange 호출을 반드시 포함해야 합니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
폼 닫기 및 응용 프로그램 종료
-
Windows Form 응용 프로그램을 강제로 종료하는 방법은 무엇입니까?
기본 폼은 System.Windows.Forms.Form 형식의 개체입니다. 기본 폼의 Close 메서드를 사용하여 응용 프로그램을 종료할 수 있습니다. 폼의 생성자에서 종료하려는 경우에는 이 방법이 효과가 없습니다. 해결 방법은 부울 플래그를 설정하는 것입니다. 나중에 폼의 Load 메서드에서 이 플래그를 검사하여 필요한 경우 Close를 호출할 수 있습니다.
또 다른 방법은 Application.Exit() 메서드를 사용하는 것입니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
시스템 메뉴에서 폼을 닫았는지 아니면 Form.Close를 호출하여 닫았는지 확인하는 방법은 무엇입니까?
한 가지 방법은 폼의 WndProc 메서드를 오버라이드(override)하고 WM_SYSCOMMAND 및 SC_CLOSE를 확인하는 것입니다. WM_CLOSE가 두 경우에 모두 표시되기 때문에 오버라이드(override)하면서 WM_CLOSE를 확인하는 것으로는 충분하지 않습니다. 이에 대한 샘플을 다운로드할 수 있습니다(C#, VB).
public const int SC_CLOSE = 0xF060; public const int WM_SYSCOMMAND = 0x0112; //_closeClick is a bool member of the form initially set false... // It can be tested in the Closing event to see how the closing came about. protected override void WndProc(ref System.Windows.Forms.Message m) { if ( m.Msg == WM_SYSCOMMAND && (int) m.WParam == SC_CLOSE ) this._closeClick = true; base.WndProc( ref m ); }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
닫기 단추를 사용자가 클릭했을 때 폼이 닫히지 않게 하는 방법은 무엇입니까?
폼의 Closing 이벤트를 처리합니다.
private void Form1_Closing( object sender, CancelEventArgs e ) { if ( NotOkToClose() ) e.Cancel = true; //don't close }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.<
-
폼의 제목 표시줄에서 닫기 단추를 제거하는 방법은 무엇입니까?
Form.ControlBox 속성을 false로 설정합니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
폼을 사용자가 닫을 때 확인 대화 상자를 표시하는 방법은 무엇입니까?
아래 나온 것처럼 MessageBox 표시할 수 있는 폼의 Closing 이벤트를 수신할 수 있습니다.
using System.ComponentModel; private void Form1_Closing( object sender, CancelEventArgs e ) { string text = "Do you want to close the application?"; string caption = "Close Application"; if ( MessageBox.Show( text, caption, MessageBoxButtons.YesNo ) == DialogResult.No ) e.Cancel = true; }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
모양
-
테두리나 제목 표시줄이 없는 시작 화면 스타일의 폼을 만드는 방법은 무엇입니까?
다음 코드를 사용하는 실제 프로젝트를 다운로드 할 수 있습니다.
public void CreateMyBorderlessWindow() { FormBorderStyle = FormBorderStyle.None; MaximizeBox = false; MinimizeBox = false; StartPosition = FormStartPosition.CenterScreen; ControlBox = false; }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
크기 조정 테두리가 있고 제목 표시줄은 없는 폼을 만드는 방법은 무엇입니까?
폼의 Text 및 ControlBox 속성을 설정합니다.
form1.Text = string.Empty; form1.ControlBox = false;
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
불투명도 속성을 사용하면 폼과 해당 컨트롤의 투명도 수준을 지정할 수 있습니다. Opacity 및 TransparencyKey 속성 간의 차이점은 .NET 설명서에서 Form.Opacity를 참조하십시오.
불투명도는 Windows 2000 이상에서만 작동합니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
MSDN Library에서 Visual Studio 팀의 Seth Grossman이 제공한 Visual Studio .NET의 도형 Windows Forms 및 컨트롤 (영문) 기사를 참조하십시오.
사각형이 아닌 창을 만드는 방법에는 두 가지가 있습니다.
첫 번째 방법은 폼이 상속하는 Control.Region (영문) 속성을 변경하는 것입니다.
[C#]
GraphicsPath gp = new GraphicsPath(); gp.AddEllipse( 0, 0, 100, 100 ); gp.AddRectangle( 50, 50, 100, 100); this.Region = new Region( gp );
[Visual Basic]
Dim gp As New GraphicsPath() gp.AddEllipse(0, 0, 100, 100) gp.AddRectangle(50, 50, 100, 100) Me.Region = New [Region](gp)
두 번째 방법은 Form.TransparencyKey (영문) 속성을 사용하는 것입니다. 이 속성을 사용하면 TransparencyKey의 색과 일치하는 모든 픽셀에 색이 칠해지지 않습니다. 따라서 여러 색으로 된 스킨 비트맵을 만들어 TransparencyKey를 Color.Red로 설정하면 RGB(255,0,0)인 모든 픽셀이 투명하게 나타납니다.
Shawn Burke, Microsoft, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
Form.FormBorderStyle 속성을 사용하여 폼의 테두리를 제어할 수 있습니다.
public void InitCustomForm() { // Adds a label to the form. Label label1 = new Label(); label1.Location = new System.Drawing.Point( 80, 80 ); label1.Name = "label1"; label1.Size = new System.Drawing.Size( 132, 80 ); label1.Text = "Start Position Information"; Controls.Add( label1 ); // Changes the border to Fixed3D. FormBorderStyle = FormBorderStyle.Fixed3D; // Displays the border information. label1.Text = "The border is " + FormBorderStyle; }
.NET Framework SDK 설명서에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
Windows Forms에 대한 사용자 지정 스타일을 제공하여 CSS가 HTML에 제공하는 것과 비슷한 기능을 제공하는 방법은 무엇입니까?
코드에서 사용된 다음 단계에 따릅니다.
1. 사용자가 스타일 기본 설정을 선택할 수 있도록 폼을 설정합니다. 이 작업이 응용 프로그램에 중요하지 않은 경우에는 2단계로 이동하고 3단계를 건너뜁니다.
2. Preference 클래스를 설정합니다.
Imports System.Drawing Public Class StylePreferences Private Shared m_FrmBackColor As Color = Color.Tan Private Shared m_FrmTextColor As Color = Color.Black Private Shared m_FontFace As Font = New Font("Verdana", 10) Private Shared m_ButtonBackColor As Color = Color.Azure ' Additional fields... Property FrmBackColor() As Color Get Return m_FrmBackColor End Get Set(ByVal Value As Color) m_FrmBackColor = Value End Set End Property Property FrmTextColor() As Color ' ... End Property Property FontFace() As Font ' ... End Property Property ButtonBackColor() As Color ' ... End Property ' Additional properties... End Class
3. 사용자가 기본 설정을 제어할 수 있도록 Preference 폼을 만들고 폼에서 Preference 클래스의 인스턴스에 값을 할당합니다.
Private Sub SetStyle() Dim style As StylePreferences = New StylePreferences style.FrmBackColor = Me.BackColor style.FrmTextColor = Me.ForeColor style.FontFace = Me.Font style.ButtonBackColor = Button1.BackColor ' Initialize addtional properties... End Sub
4. 폼이 로드될 때마다 Preference 클래스에서 값을 할당합니다.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As EventArgs) _ Handles MyBase.Load Dim style As StylePreferences = New StylePreferences Me.BackColor = style.FrmBackColor Me.ForeColor = style.FrmTextColor Me.Font = style.FontFace Button1.BackColor = style.ButtonBackColor Button2.BackColor = style.ButtonBackColor ' Initialize addtional properties... End Sub
폼 수준 속성을 먼저 할당할 경우 모든 컨트롤에서 모든 속성을 할당할 필요가 없습니다. 이 샘플에서 Font의 경우처럼 이는 폼의 모든 컨트롤에 적용됩니다.
Elizabeth Gee, 2005년 1월 11일 #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
Windows Forms에서 그리기 및 칠하기를 수행하는 최상의 실행 방법은 무엇입니까?
WindowsForms.net (영문)에서 Fred Balsiger의 Microsoft .NET Framework를 위한 Windows Forms를 사용하는 그리기 기술 (영문)를 참조하십시오. Windows Forms 그리기를 가장 효율적으로 수행하는 방법이 이 기사에 나와 있습니다. Fred는 적절한 컨트롤과 컨트롤 스타일을 사용할 뿐만 아니라 OnPaint 및 OnPaintBackground 메서드에서 그리기 코드를 통합하여 .NET Framework의 기능을 활용하는 방법을 비롯한 여러 힌트를 제공합니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
VB6의 선 명령 기능을 대체하는 선을 그리는 방법은 무엇입니까?
다음 코드를 사용합니다.
Dim g as Graphics g = frmMain.CreateGraphics() g.DrawLine(Pens.Black, new Point(0,0), _ new Point(frmMain.ClientRectangle.Width), frmMain.ClientRectangle.Height) g.Dispose()
이 코드는 응용 프로그램을 볼 수 있는 경우에 한하여 응용 프로그램의 왼쪽 상단에서 오른쪽 하단 모서리까지 선을 그립니다. 이 코드가 Paint 이벤트에 없거나 무엇인가가 응용 프로그램 가리거나 다시 그리기가 수행될 경우 이 선은 다시 그려지지 않습니다.
Shawn Burke, Microsoft, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
모든 컨트롤이 초기화될 때까지 폼 그리기를 일시 중단하는 방법은 무엇입니까?
아직까지 이 작업을 수행하는 방법이 프레임워크에서 기본 제공되지는 않지만 WM_SETREDRAW를 사용할 수는 있습니다. WM_SETREDRAW를 재귀적으로 호출할 수 없지만 아래 코드를 사용하여 폼에 속성을 추가하면 이 문제를 해결할 수 있습니다. VB 샘플도 제공됩니다.
[ DllImport( "user32" ) ] private static extern bool SendMessage( IntPtr hWnd, int msg, int wParam, int lParam ); private const int WM_SETREDRAW = 0xB; int paintFrozen; private bool FreezePainting { get { return paintFrozen > 0; } set { if ( value && IsHandleCreated && Visible ) if ( 0 == paintFrozen++ ) SendMessage( Handle, WM_SETREDRAW, 0, 0 ); if ( !value ) { if ( paintFrozen == 0 ) return; if ( 0 == --paintFrozen ) { SendMessage( Handle, WM_SETREDRAW, 1, 0 ); Invalidate( true ); } } } }
Shawn Burke, Microsoft, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
응용 프로그램에서 XP 스타일을 지원하기 위해 EnableVisualStyles 메서드를 사용하는 방법은 무엇입니까?
Microsoft에 따르면, Main 메서드에서 Application.EnableVisualStyles 메서드(System.Windows.Forms 네임스페이스의)를 호출하면 약간의 ImageList 손상이 발생하는 버그가 존재합니다. 이 문제를 해결하는 방법은 다음과 같습니다.
public virtual void Main() { Application.EnableVisualStyles(); // Calling DoEvents after the above method call seems to fix this issue Application.DoEvents(); Application.Run( new Form1() ); }
George Shepherd, Syncfusion, and Martin Robins, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
.NET Framework 1.1을 사용하는 Windows Forms에서 XP 테마를 사용하는 방법은 무엇입니까?
.NET FrameWork 1.1을 사용하는 경우 .manifest 파일이 필요하지 않습니다. 이제 컨트롤을 만들기 전에 호출해야 하는 응용 프로그램의 EnableVisualStyles() 메서드를 사용할 수 있습니다. 또한 컨트롤의 FlatStyle 속성이 기본값 Standard 대신에 System/b>로 변경되었는지 확인해야 합니다.
static void Main() { Application.EnableVisualStyles(); Application.Run(new Form1()); }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
.NET Framework 1.0을 사용하는 Windows Forms에서 XP 테마를 사용하는 방법은 무엇입니까?
다음 단계에 따라 Windows 응용 프로그램에 Windows XP 비주얼 스타일을 사용합니다.
1. 새 Windows 응용 프로그램을 만들고 몇 개의 컨트롤을 기본 폼에 추가합니다.
2. FlatStyle 속성을 가진 폼에 추가하는 모든 컨트롤에 대해 FlatStyle 속성을 System으로 설정합니다.
3. 응용 프로그램을 컴파일합니다.
4. 응용 프로그램 디렉터리에서 매니페스트 파일을 작성합니다. 참고: 이 매니페스트 파일은 실행 파일과 동일한 디렉터리에 있어야 합니다. 메모장을 열고 아래 코드를 이 파일에 추가합니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
레이아웃
-
폼의 컨트롤 사이에 구분선을 만들려면 어떤 컨트롤을 사용해야 합니까?
Label 컨트롤을 사용하면서 BorderStyle을 Fixed3D 설정하고 Height를 2로 설정합니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목에는 현재 .NET Framework 1.1 릴리스가 적용됩니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
폼의 크기 조정이 완료된 후에 크기 조정 컨트롤이 변경되도록 하는 방법은 무엇입니까?
여러 컨트롤이 포함된 폼이 있습니다. 폼의 크기를 조정하면 컨트롤의 크기도 함께 조정됩니다. 크기 조정이 완료된 후에 컨트롤의 위치가 변경되도록 할 수 있습니까?
이렇게 하려면 유휴 상태에서 그리기를 수행합니다. 즉, 크기 조정 시에 그리기를 무효화했다가 크기 조정이 완료되었을 때 전체 그리기를 수행합니다. 다음 코드를 폼에 추가합니다.
bool idleHooked = false; protected override void OnResize(EventArgs e) { if (!idleHooked) { Application.Idle += new EventHandler(OnIdle); } } private void OnIdle(object s, EventArgs e) { Invalidate(); PerformLayout(); if (idleHooked) { Application.Idle -= new EventHandler(OnIdle); } }
George Shepherd, Syncfusion 및 Shawn Burke, Microsoft, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우이곳으로 보고해 주십시오.
-
사용자 지정 레이아웃 엔진을 만드는 방법은 무엇입니까?
Chris Anderson의 Windows Forms를 위한 사용자 지정 레이아웃 엔진 제공 (영문) 기사에서는 사용자 지정 엔진을 구현하는 방법과 샘플 코드를 확인할 수 있습니다(여기 (영문)에서도 이 기사가 제공됨).
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
ShowDialog()를 통해 호출될 경우에 올바르게 표시되도록 폼의 초기 위치를 프로그래밍 방식으로 설정하는 방법은 무엇입니까?
위치, 크기 및 이동
-
폼을 프로그래밍 방식으로 최대화 또는 최소화하는 방법은 무엇입니까?
System.Windows.Forms.Form.WindowState 속성을 FormWindowState.Maximized 또는 FormWindowState.Minimized로 설정합니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
작업 표시줄을 비롯한 전체 화면을 폼으로 덮는 방법은 무엇입니까?
다음 코드 조각에서는 Windows 작업 표시줄을 비롯한 전체 화면을 폼으로 덮는 방법을 보여 줍니다.
// Prevent form from being resized. FormBorderStyle = FormBorderStyle.FixedSingle; // Get the screen bounds Rectangle formrect = Screen.GetBounds( this ); // Set the form's location and size Location = formrect.Location; Size = formrect.Size;
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
폼을 처음 열었을 때 화면의 오른쪽 하단에서 시스템 트레이 위에 폼을 표시하는 방법은 무엇입니까?
StartPosition을 Manual로 설정한 후에 폼의 생성자에서 다음 코드를 사용합니다.
SetBounds( Screen.GetWorkingArea( this ).Width - Width, Screen.GetWorkingArea( this ).Height - Height, Width, Height );
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
사용자가 폼을 이동할 수 없게 하는 방법은 무엇입니까?
Windows Forms FAQ 포럼에 게시된 다음 코드 조각에서는 사용자가 런타임에 폼을 이동할 수 없게 하는 방법을 보여 줍니다.
protected override void WndProc( ref Message m ) { const int WM_NCLBUTTONDOWN = 161; const int WM_SYSCOMMAND = 274; const int HTCAPTION = 2; const int SC_MOVE = 61456; if ( (m.Msg == WM_SYSCOMMAND) && (m.WParam.ToInt32() == SC_MOVE) ) return; if ( (m.Msg == WM_NCLBUTTONDOWN) && (m.WParam.ToInt32() == HTCAPTION) ) return; base.WndProc( ref m ); }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
MaximumSize 및 MinimumSize 속성을 설정하여 폼의 크기를 제한할 수 있습니다. 이렇게 하면 크기를 조정할 수 있는 폼의 최대 및 최소 크기를 제어하는 데 도움이 됩니다. 또한 폼의 WindowState 속성을 사용하여 폼 크기를 조정하는 방법을 제어할 수 있습니다.
// Minimum width = 300, Minimum height= 300 this.MinimumSize = new Size(300, 300); //Maximum width = 800, Maximum height= unlimited this.MaximumSize = new Size(800, int.MaxValue);
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
사용자가 폼의 크기를 조정할 수 없게 하는 방법은 무엇입니까?
FormBorderStyle 을 FixedDialog로 설정하고 MaximizeBox를 false로 설정하여 폼의 크기를 사용자가 조정할 수 없게 할 수 있습니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
디자인 타임과 런타임 사이에 화면 해상도가 변경될 경우 폼의 크기를 자동으로 조정하는 방법은 무엇입니까?
런타임 도중의 현재 글꼴 크기가 디자인 타임의 글꼴 크기와 다를 경우 프레임워크에서 폼 크기를 자동으로 조정합니다. 해상도가 변경될 때는 크기가 자동으로 조정되지 않지만 크기 조정을 자동으로 수행하도록 간단하게 설정할 수 있습니다. 사용자 지정 폼을 파생시키고 현재 화면 해상도를 반환하는 "ScreenResolutionBase" 속성을 제공할 수 있습니다(Screen.PrimarScreen.Bounds에서 이를 제공함). 이 값은 디자인 타임 도중에 코드에서 직렬화됩니다. 그런 다음 런타임 도중에 폼의 OnLoad에서 현재 화면 해상도를 확인하고 폼의 크기를 적절하게 조정할 수 있습니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
폼의 StartPosition 속성을 CenterScreen으로 설정합니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
테두리 없는 폼을 이동하는 것을 지원하는 방법은 무엇입니까?
다음 코드 조각에서는 테두리 없는 폼을 이동하는 방법을 보여 줍니다.
private const int WM_NCLBUTTONDOWN = 0xA1; private const int HTCAPTION = 0x2; [ DllImport( "user32.dll" ) ] public static extern bool ReleaseCapture(); [ DllImport( "user32.dll" ) ] public static extern int SendMessage( IntPtr hWnd, int Msg, int wParam, int lParam ); private void Form1_MouseDown( object sender, MouseEventArgs e ) { if ( e.Button == MouseButtons.Left ) { ReleaseCapture(); SendMessage( Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0 ); } }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
영역 드래그 효과가 있는 테두리 없는 폼의 크기를 조정하는 방법은 무엇입니까?
C# Corner (영문)에서 이러한 크기 조정 기술을 구현하는 Simon Bond의 폼의 영역 드래그 효과 (영문) 샘플을 참조하십시오. 또한 "영역 드래그 효과" 디버깅 (영문) 기사를 읽어보십시오. 이 기사에서 Zhanbo Sun은 원래 코드에서 발견된 문제를 처리하는 수정 사항을 제안하고 있습니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
커서
-
button1.Cursor = new Cursor( @"C:\winnt\cursors\hnodrop.cur" );
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
Cursor 클래스를 커서(.cur) 파일로 변환하는 방법은 무엇입니까?
protected void WriteCursorToFile( Cursor cursor, string fileName ) { TypeConverter converter = TypeDescriptor.GetConverter( typeof( Cursor ) ); byte[] blob = converter.ConvertTo( cursor, typeof( byte[] ) ) as byte[]; if ( blob == null ) { MessageBox.Show( "Unable to convert Cursor to byte[]" ); return; } FileStream fileStream = new FileStream( fileName, FileMode.Create ); fileStream.Write( blob, 0, blob.Length ); fileStream.Flush(); fileStream.Close(); }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
리소스 매니페스트에서 커서를 로드 및 표시하는 방법은 무엇입니까?
System.IO.Stream stream = null; try { string curName = "WindowsApplication1.Cursor1.cur"; stream = GetType().Assembly.GetManifestResourceStream(curName); this.Cursor = new Cursor( stream ); } catch ( Exception ex ) { MessageBox.Show(ex.Message.ToString()); } finally { if ( stream != null ) stream.Close(); }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
현재 커서를 대기 커서로 설정하는 경우는 언제이며 대기 커서가 원했던 것보다 빨리 되돌려지는 이유는 무엇입니까?
Cursor.Current = Cursors.WaitCursor를 사용하여 대기 커서를 설정했습니다. 원하는 것보다 빨리 이 커서가 사리지는 이유는 무엇입니까?
이 Current 속성을 설정하면 커서가 변경되고 마우스 이벤트 처리가 중지됩니다. 커서를 다시 Cursors.Default로 설정하면 마우스 이벤트 처리가 다시 시작되고 각 컨트롤에 대해 적절한 커서가 표시됩니다. 커서를 다시 기본값으로 재설정하기 전에 DoEvents가 호출될 경우에도 마우스 이벤트 처리가 시작되지만 설정된 특정 커서가 사라집니다. 따라서 WaitCursor가 사라질 경우에는 DoEvents를 호출했기 때문일 수 있습니다.
다음 코드에서는 WaitCursor를 설정합니다.
Cursor oldCursor = Cursor.Current; Cursor.Current = Cursors.WaitCursor; try { // Do your processing that takes time, e.g., wait for 2 seconds DateTime dt = DateTime.Now.AddSeconds(2); while ( dt > DateTime.Now ) {} } finally { Cursor.Current = oldCursor; }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
키보드
-
키 입력을 응용 프로그램으로 보내는 방법은 무엇입니까?
VB6의 SendKeys 명령을 대체하는 것은 무엇입니까?
System.Windows.Forms 네임스페이스에서 있는 SendKeys (영문) 클래스의 Send (영문) 메서드를 사용합니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
응용 프로그램 전체에서 키보드 메시지를 처리하는 방법은 무엇입니까?
기본 폼에서 IMessageFilter 인터페이스를 구현할 수 있습니다. 이렇게 하려면 PreFilterMessage에 대한 오버라이드(override)를 추가하고 파악해야 할 특정 메시지를 찾습니다. 아래의 코드 조각은 keydown 시에
키를 파악합니다. 샘플 프로젝트를 다운로드할 수 있습니다(C#, VB). 이 샘플에는 여러 컨트롤을 가진 두 개의 폼이 존재합니다. 입력 포커스가 있는 폼 또는 컨트롤에 상관없이 키가 PreFilterMessage 오버라이드(override)에서 파악된다는 것을 알 수 있습니다. [C#]
public class MyMainForm : System.Windows.Forms.Form, IMessageFilter { const int WM_KEYDOWN = 0x100; const int WM_KEYUP = 0x101; public bool PreFilterMessage(ref Message m) { Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode; if(m.Msg == WM_KEYDOWN&& keyCode == Keys.Escape) { Console.WriteLine("Ignoring Escape..."); return true; } return false; } .... private void MyMainForm_Load(object sender, System.EventArgs e) { Application.AddMessageFilter(this); } }
[Visual Basic]
Public Class MyMainForm Inherits System.Windows.Forms.Form Implements IMessageFilter Private WM_KEYDOWN As Integer = &H100 Private WM_KEYUP As Integer = &H101 Public Function PreFilterMessage(ByRef m As Message) As Boolean Dim keyCode As Keys = CType(CInt(m.WParam), Keys) And Keys.KeyCode If m.Msg = WM_KEYDOWN And keyCode = Keys.Escape Then Console.WriteLine("Ignoring Escape...") Return True End If Return False End Function 'PreFilterMessage .... Private Sub MyMainForm_Load(sender As Object, e As System.EventArgs) Application.AddMessageFilter(Me) End Sub 'MyMainForm_Load End Class 'MyMainForm
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
포커스를 가진 컨트롤에 상관없이 폼 수준에서 특정 키를 처리하는 방법은 무엇입니까?
Form.KeyPreview 속성이 true로 설정되면 심지어 포커스의 해당 이벤트를 가진 컨트롤보다 앞서서 폼의 KeyPress, KeyDown 및 KeyUp이벤트가 발생합니다. 폼의 이벤트 처리기에서 처리한 후에 이러한 메시지를 컨트롤로 전달하거나(기본적으로 수행되는 동작(behavior)) e.Handled 속성을 true로 설정하여(이벤트 인수에서) 포커스를 가진 컨트롤로 메시지가 전달되지 않도록 할 수 있습니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
MDI: 다중 문서 인터페이스
-
.NET Framework를 사용하여 MDI 응용 프로그램을 만드는 방법은 무엇입니까?
Visual Studion .NET과 함께 제공되는 퀵 스타트 샘플 중 하나에서 그 방법을 확인할 수 있습니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
MDI 클라이언트 컨테이너의 배경을 변경하는 방법은 무엇입니까?
기본 동작(behavior)은 제어판의 컨트롤 색을 클라이언트 컨테이너에서 사용하는 것입니다. MDI 클라이언트 컨테이너에서 폼의 BackColor 및 Image를 사용하게 만들어 이 동작(behavior)을 변경할 수 있습니다. 이렇게 하려면 InitializeComponents()를 호출한 후에 아래 코드를 추가합니다. 또한 이 코드가 안에 포함되어 있는 작업 MDI 클라이언트 프로젝트를 다운로드할 수 있습니다.
//set back color foreach ( Control c in Controls ) { if ( c is MdiClient ) { c.BackColor = BackColor; c.BackgroundImage = BackgroundImage; } }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
자식(child) 폼을 최대화하지 않고 전체 MDI 클라이언트를 자식(child) 폼으로 채우는 방법은 무엇입니까?
다음 코드에서는 이 작업을 수행하는 방법을 보여 줍니다. mdi 부모(parent) 폼의 모든 도킹된 컨트롤(메뉴 포함)이 고려되었습니다.
[C#]
private void FillActiveChildFormToClient() { Rectangle mdiClientArea = Rectangle.Empty; foreach ( Control c in Controls ) if (c is MdiClient ) mdiClientArea = c.ClientRectangle; ActiveMdiChild.Bounds = mdiClientArea; }
[Visual Basic]
Private Sub FillActiveChildFormToClient() Dim mdiClientArea As Rectangle = Rectangle.Empty Dim c As Control For Each c In Controls If TypeOf c Is MdiClient Then mdiClientArea = c.ClientRectangle End If Next ActiveMdiChild.Bounds = mdiClientArea End Sub
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
MDI 응용 프로그램에서 자식(child) 폼이 활성화될 경우 Activated 이벤트가 일관되게 발생하지 않는 이유는 무엇입니까?
.NET Framework 1.0에서 자식(child) 폼은 Form.Activated 이벤트를 가져오지 않습니다(부모(parent) MDI만). 활성화되는 MDI 자식(child)을 파악하려면 해당 자식(child) 폼의 Enter/Leave 이벤트를 수신하거나 부모(parent) 폼에서 Form.MdiChildActivate 이벤트를 수신합니다.
.NET Framework 1.1에서는 자식(child) 폼이 Activated 이벤트를 가져옵니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오
-
MinimumSize 및 MaximumSize 속성이 작동하지 않을 경우에 MDI 자식(child) 폼의 크기를 제한하는 방법은 무엇입니까?
이러한 속성이 작동(behavior)하지 않는 것은 버그이며 이후의 .NET 릴리스에서 수정될 것입니다.
Layout 이벤트 처리기를 추가하여 자식(child) 폼의 크기를 제어할 수 있습니다. 아래 코드 조각에서는 해당 속성에서 설정된 최소 크기를 적용합니다. 다음 링크에 설명된 것처럼 폼의 WndProc 메서드를 오버라이드(override)하여 이를 처리할 수도 있습니다.
FIX: 창이 MDI 자식(child)인 경우 MinimumSize 및 MaximumSize 속성을 따르지 않음 (기사 ID: 327824)
[C#]
private void Document_Layout( object sender, LayoutEventArgs e ) { if ( Bounds.Width < MinimumSize.Width ) Size = new Size( MinimumSize.Width, Size.Height ); if ( Bounds.Height < MinimumSize.Height ) Size = new Size( Size.Width, MinimumSize.Height ); }
[Visual Basic]
Private Sub Document_Layout(ByVal sender As System.Object, _ ByVal e As LayoutEventArgs) Handles MyBase.Layout If (Bounds.Width < MinimumSize.Width) Then Size = New Size(MinimumSize.Width, Size.Height) End If If (Bounds.Height < MinimumSize.Height) Then Size = New Size(Size.Width, MinimumSize.Height) End If End Sub
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
자식(child) 폼의 인스턴스가 여러 개 만들어지지 않게 하는 방법은 무엇입니가?
다음과 같은 두 가지 방법이 있습니다.
1. 부모(parent) MDI 폼 내에서 다음 코드를 사용합니다.
// ChildForm is type being created or shown ChildForm childForm = null; foreach ( Form f in MdiChildren ) if ( f is ChildForm ) { childForm = (ChildForm) f; break; } if( childForm == null ) { childForm = new ChildForm(); childForm.MdiParent = this; } childForm.Show(); childForm.Focus();
2. 두 번째 방법은 자식(child) 폼에서 단독 패턴을 구현하는 것입니다.
MDI 자식(child) 폼에 다음 코드를 포함합니다(frmChildForm은 제어하려는 MDI 자식(child) 폼).
// Used for singleton pattern static ChildForm childForm; public static ChildForm GetInstance { if ( childForm == null ) childForm = new ChildForm(); return childForm; }
부모(parent) MDI 폼에서 다음 코드를 사용하여 자식(child) MDI 폼을 호출합니다.
ChildForm form = GetInstance(); form.MdiParent = this; form.Show(); form.BringToFront();
코드가 처음 호출되면 정적 GetInstance 메서드가 자식(child) 폼의 인스턴스를 만들어 반환합니다. 이 코드가 호출될 때마다 GetInstance 메서드는 정적 필드인 childForm에 저장된 자식(child) 폼의 기존 인스턴스를 반환합니다. 자식(child) 폼 인스턴스가 소멸될 경우 GetInstance를 다음 번에 호출하면 새 인스턴스가 만들어지고 수명이 다할 때까지 사용됩니다.
또한 MDI 자식(child) 폼에 대한 생성자나 오버로드된 생성자가 필요한 경우 단지 필요한 매개 변수를 GetInstance 함수에 추가하고 클래스 생성자에 전달하면 됩니다.
George Shepherd, Syncfusion 및 John Conwell, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
MDIContainer 폼에서 MDI 자식(child) 폼이 추가되거나 제거될 경우 사용자 지정 처리를 수행하는 방법은 무엇입니까?
MDIContainer 폼에는 MDIClient 자식(child) 창이 있으며 MDI 자식(child) 폼이 이 MDIClient 창의 부모(parent)로 지정됩니다. 자식(child) 폼이 추가되거나 제거될 때마다 MDIClient의 ControlAdded/ControlRemoved 이벤트가 발생합니다. 이러한 이벤트를 구독하고 처리기 내에서 필수 처리 코드를 추가할 수 있습니다.
MDIContainer 폼 안에서 MDIClient의 ControlAdded/ControlRemoved 이벤트를 구독합니다.
foreach( Control ctrl in Controls ) if ( ctrl.GetType() == typeof( MdiClient ) ) { ctrl.ControlAdded += new ControlEventHandler( MDIClient_ControlAdded ); ctrl.ControlRemoved += new ControlEventHandler( MDIClient_ControlRemoved ); break; } protected void MDIClient_ControlAdded( object sender, ControlEventArgs e ) { Form childform = e.Control as Form; Trace.WriteLine( String.Concat( childform.Text, " - MDI child form was added." ) ); } protected void MDIClient_ControlRemoved( object sender, ControlEventArgs e ) { Trace.WriteLine( String.Concat( e.Control.Text, " - MDI child form was removed." ) ); }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
MDI 컨테이너에서 사용자 지정 그리기(예: 로고)를 수행하는 방법은 무엇입니까?
MDI 컨테이너 폼의 Paint 이벤트를 수신해서는 안 되며 대신에 mdi 컨테이너 폼의 자식(child)인 MDIClient 컨트롤의 Paint 이벤트를 수신하십시오. MDI 클라이언트 영역에 그리기 (영문)기사에서는 자세한 예제를 제공합니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
공용 대화 상자(System.Windows.Forms.CommonDialog)
-
OpenFileDialog를 사용하는 방법은 무엇입니까?
using System.Text; using System.IO; private string ChooseTextFile( string initialDirectory ) { OpenFileDialog dlg = new OpenFileDialog(); dlg.Title = "Open text file"; dlg.InitialDirectory = initialDirectory; dlg.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; return ( dlg.ShowDialog() == DialogResult.OK ) ? dlg.FileName : null; }
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
FolderBrowser 인스턴스가 처음 열렸을 때 이 인스턴스의 경로를 지정하는 방법은 무엇입니까?
I.NET Framework 1.1에는 이 작업을 수행할 수 있는 SelectedPath 속성이 있습니다.
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
아래에서는 FolderNameEditor 및 FolderBrowser 클래스를 사용하여 솔루션을 구현하는 기술을 보여 줍니다. iterop를 사용하여 솔루션을 얻을 수도 있습니다.
이 솔루션에 사용되는 FolderNameEditor 및 FolderBrowser 클래스는 설명서에 보면 "이 형식은 .NET Framework 인프라를 지원하며 코드에서 직접 사용하도록 되어 있지는 않습니다."라고 설명되어 있습니다.
// add a reference to System.Design.DLL using System.Windows.Forms.Design; public class DirectoryBrowser : FolderNameEditor { private string description = "Choose Directory"; private string returnPath = string.Empty; FolderBrowser browser = new FolderBrowser(); public string Description { get { return description; } set { description = value; } } public string ReturnPath { get { return returnPath; } } public DialogResult ShowDialog() { browser.Description = description; browser.StartLocation = FolderBrowserFolder.MyComputer; DialogResult result = browser.ShowDialog(); returnPath = ( result == DialogResult.OK ) ? browser.DirectoryPath : string.Empty; return result; } }
Ryan Farley, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
FontDialog 클래스를 사용하여 컨트롤의 글꼴을 설정하는 방법은 무엇입니까?
이 방법은 간단합니다. 클래스의 인스턴스를 만들어 해당 ShowDialog 메서드를 호출하면 됩니다.
FontDialog fontDialog1 = new FontDialog(); if ( fontDialog1.ShowDialog() != DialogResult.Cancel ) textBox1.Font = fontDialog1.Font ;
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
-
ColorDialog를 사용하여 색을 선택하는 방법은 무엇입니까?
이 방법은 간단합니다. 클래스의 인스턴스를 만들어 해당 ShowDialog 메서드를 호출하면 됩니다.
ColorDialog colorDialog1 = new ColorDialog(); if ( colorDialog1.ShowDialog() != DialogResult.Cancel ) textBox1.ForeColor = colorDialog1.Color;
George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #
이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
리소스
-
Windows Forms 프로그래밍과 관련 주제에 대한 읽을 만한 책들에는 어떤 것들이 있습니까?
Windows Forms Programming in C# (영문)
Chris Sells, 2004, Addison-Wesley. ISBN: 0321116208.
Windows Forms Programming in Visual Basic .NET (영문)
Chris Sells and Justin Ghetland, 2004, Addison-Wesley. ISBN: 0321125193.
초보자뿐만 아니라 경험 많은 프로그래머가 Windows Forms에 대해 배울 수 있는 매우 휼륭한 책입니다. 겉표지가 아주 산뜻하며 각 장은 대략 50페이지로 구성되어 있는데 필요한 모든 정보가 담겨 있을 뿐만 아니라 독자의 관심을 지속적으로 끌 수 있는 매력을 지니고 있습니다.
Programming Microsoft Windows with C# (영문)
Charles Petzold, 2001, Microsoft Press. ISBN: 0-7356-1370-2.
Programming Microsoft Windows with Microsoft Visual Basic .NET (영문)
Charles Petzold, 2002, Microsoft Press. ISBN: 0-7356-1799-6.
Windows Forms와 GDI+를 모두 다루는 아주 좋은 책입니다. Petzold는 이 책에서 알기 쉽게 내용을 전달하고 있습니다.
Mastering Visual Studio .NET (영문)
Ian Griffiths, Jon Flanders & Chris Sells, 2003, O'Reilly. ISBN: 0-596-00360-9.
이 책의 모든 페이지는 Visual Studio .NET 2003을 최대한 활용하기 위한 유용한 정보로 가득합니다. 경험 많은 개발자와 교육자가 저술한 이 책은 초보자뿐만 아니라 숙달된 개발자에게 매우 중요한 자료가 될 것입니다.
C# Design Patterns: A Tutorial (영문)
James W. Cooper, 2003, Addison-Wesley. ISBN: 0201844532.
이 책에서는 C#/Windows Forms를 통해 패턴에 대해 배울 수 있습니다. UI와 관련되어 있으며 Windows Forms를 사용하는 여러 개의 샘플이 제공됩니다.
GDI+ Programming: Creating Custom Controls using C# (영문)
Eric White, Chris Garrett, 2002, Wrox Press. ISBN: 1861006314
이 책의 제목을 보고 오해할 수 있지만 이 책은 GDI+를 소개하는 멋진 내용을 담고 있습니다. GDI+ 외에도 컨트롤 작성자에게 유용한 컨트롤 디자이너에 대한 정보가 포함되어 있습니다.
George Shepherd의 Windows Forms FAQ 및 Stuart Celarier, Fern Creek에서 발췌한 내용, #
이 FAQ 항목에는 현재 .NET Framework 1.1 릴리스가 적용됩니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.
'Programming > C#' 카테고리의 다른 글
C# 에서의 Enum (0) | 2010.07.06 |
---|---|
C#에서의 '마우스 클릭(mousedown) 상태'에서 '마우스 이벤트' 일어나지 않는 문제 (0) | 2010.07.06 |
C# 싱글톤 (0) | 2010.07.02 |
Singleton (0) | 2010.07.02 |
창크기 조절 막기 (0) | 2010.07.02 |