|
RichTextBox 란? |
RichTextBox Control 은 폰트, 색상, 단락 등의 서식이 있는 텍스트를 출력,수정,검색이 가능 이미지 파일 등도 출력 및 편집 가능 서식을 가지는 데이터를 RTF파일 형태로 읽고 쓰기가 가능 |
RichTextBox or TextBox? |
RichtextBox 및 Textbox 에서는 사용자가 텍스트를 편집하는 것이 모두 허용되지만 서식이 있는 텍스트, 이미지, 표 또는 기타 풍부한 콘텐츠를 편집해야 할 경우에는 RichTextBox가 더 적합합니다. Ex)서식 , 이미지 등이 필요한 문서, 기사, 블로그를 편집할 때는 RichTextBox를 사용하는 것이 더 좋고 TextBox 에는 RichTextBox보다 적은 시스템 리소스가 필요하므로 일반텍스트만 편집해야 하는 경우 (Ex)폼에서 사용)에 적합하다. TextBox 에서는 ToggleBold와 같은 서식 관련 명령이 지원되지 않지만,MoveToLineEnd와 같은 대부분의 기본 명령은 두 컨트롤 모두 지원된다. |
RichTextBox Control DLL만들기 |
RichTextBox Control은 자체에서 인쇄 기능을 지원하지 않기 때문에 인쇄 기능을 포함하는 dll을 제작해서 사용해야 한다. 프로젝트에서 RichTextBixPrintCtrl로 클래스 라이브러리을 만들어 준다. 참조 추가 대화 상자에서 System.Drawing.dll 과 System.WindowsForms.dll 을 추가 해준다. 아래 코드를 작성 후 빌드를 해 DLL 파일을 만들어 준다. |
namespace RichTextBoxPrintCtrl { public class RichTextBoxPrintCtrl : RichTextBox { //Convert the unit used by the .NET framework (1/100 inch) //and the unit used by Win32 API calls (twips 1/1440 inch) private const double anInch = 14.4; [StructLayout(LayoutKind.Sequential)] private struct RECT { public int Left; public int Top; public int Right; public int Bottom; } [StructLayout(LayoutKind.Sequential)] private struct CHARRANGE { public int cpMin; //First character of range (0 for start of doc) public int cpMax; //Last character of range (-1 for end of doc) } [StructLayout(LayoutKind.Sequential)] private struct FORMATRANGE { public IntPtr hdc; //Actual DC to draw on public IntPtr hdcTarget; //Target DC for determining text formatting public RECT rc; //Region of the DC to draw to (in twips) public RECT rcPage; //Region of the whole DC (page size) (in twips) public CHARRANGE chrg; //Range of text to draw (see earlier declaration) } private const int WM_USER = 0x0400; private const int EM_FORMATRANGE = WM_USER + 57; [DllImport("USER32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
// Render the contents of the RichTextBox for printing // Return the last character printed + 1 (printing start from this point for next page) public int Print(int charFrom, int charTo, PrintPageEventArgs e) { //Calculate the area to render and print RECT rectToPrint; rectToPrint.Top = (int)(e.MarginBounds.Top * anInch); rectToPrint.Bottom = (int)(e.MarginBounds.Bottom * anInch); rectToPrint.Left = (int)(e.MarginBounds.Left * anInch); rectToPrint.Right = (int)(e.MarginBounds.Right * anInch);
//Calculate the size of the page RECT rectPage; rectPage.Top = (int)(e.PageBounds.Top * anInch); rectPage.Bottom = (int)(e.PageBounds.Bottom * anInch); rectPage.Left = (int)(e.PageBounds.Left * anInch); rectPage.Right = (int)(e.PageBounds.Right * anInch);
IntPtr hdc = e.Graphics.GetHdc();
FORMATRANGE fmtRange; fmtRange.chrg.cpMax = charTo; //Indicate character from to character to fmtRange.chrg.cpMin = charFrom; fmtRange.hdc = hdc; //Use the same DC for measuring and rendering fmtRange.hdcTarget = hdc; //Point at printer hDC fmtRange.rc = rectToPrint; //Indicate the area on page to print fmtRange.rcPage = rectPage; //Indicate size of page
IntPtr res = IntPtr.Zero;
IntPtr wparam = IntPtr.Zero; wparam = new IntPtr(1);
//Get the pointer to the FORMATRANGE structure in memory IntPtr lparam = IntPtr.Zero; lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange)); Marshal.StructureToPtr(fmtRange, lparam, false);
//Send the rendered data for printing res = SendMessage(Handle, EM_FORMATRANGE, wparam, lparam);
//Free the block of memory allocated Marshal.FreeCoTaskMem(lparam);
//Release the device context handle obtained by a previous call e.Graphics.ReleaseHdc(hdc);
//Return last + 1 character printer return res.ToInt32(); } } }
|
RichTextBox Control 사용 |
||||
- 도구 상자에서 항목선택 기능을 이용해서 RichTextBoxPrintCtrl.dll 을 도구상자에 추가해준다. - 추가된 RichTextBoxPrintCtrl 을 윈도우 폼에 끌어와 아래와 같이 영역을 지정해준다.
RichTextBox 메뉴 구성 -RichTextBox Control 의 여러 기능들을 구현할 메뉴 목록들을 MenuStrip 을 이용해 아래와 같이 만들어 준다.
-도구상자에서 대화상자부분에 있는 ColorDialog, FolderBrowserDialog, SaveFileDialog, OpenFileDialog, FontDialog 을 추가해 준다.
이제는 메뉴에 기능을 구현시키기 위해서 메뉴버튼에서 더블 클릭을 해서 함수를 만든다.
새로만들기 기능 RichTextBox 안의 내용이 모두 지워진다
폰트 속성 -폰트 속성 창이 뜨면서 폰트를 변경 할 수 잇다.
색상 속성
색 변경 창이 뜨면서 색상을 변경 해줄 수 잇다.
디폴트 확장자를 rtf 로 초기화 해서 파일 저장 기능을 구현한다.
창이 뜨면서 파일이름을 정해주고 저장을 누르면 RichTest.rtf로 파일이 저장된다.
저장한 파일을 다시 불러와서 화면에 출력 해 주는 것을 확인 할 수 있다.
Cut, Copy, Paste, Undo, Redo Undo 는 되살리기 기능 Redo는 반복 기능 Cut 은 텍스트를 잘라낸다 Copy는 원본텍스트는 그대로 두고 클립보드에 복사를 한다. Paste 는 클립보드에 저장되어 있는 텍스트를 붙여주는 기능
|