Winform 화면에 보이는 컨트롤(Form or Panel 등)을 Print 하기
과거에 개인적으로 로컬로만 정리했던 내용들 중에 괜찮은 내용들을 블로그에 옮기고 있는데, 그중에 하나 winform project에서 현재 보고 있는 Form 혹은 Form 내부의 Panel의 내용을 출력하고 싶을 때 좋은 내용을 블로그에도 정리해보려고 한다.
프로젝트 구성
Visual Studio 2022를 사용해서 작업했으며, Winform (.Net Framework) 템플릿으로 프로젝트를 생성해서 만들었다.
이전 포스팅에서 사용했던 프로젝트 파일을 그대로 사용해서 Panel 컨트롤이랑 Button만 추가해서 Panel 내용을 Print 하는 것을 정리하려고 한다.
2024.12.16 - [C#/Winform (.Net Framework)] - C# SqlDependency 활용 SQL Server 실시간 모니터링하기
C# SqlDependency 활용 SQL Server 실시간 모니터링하기
C# SqlDependency 활용 SQL Server 실시간 모니터링하기과거에 개인적으로 정리했던 내 나름대로는 일명 노하우라고 하는 문서로 정리했던 것들을 다 다시 살펴보면서 블로그에 포스팅할 자료들을
it-hun-bar-2.tistory.com

DataGridView만 있던 MainForm에서 Panel 컨트롤을 추가하고 Panel 안에 DataGridView를 배치하였다. 그리고 Panel 외부에 Button 컨트롤을 배치하여 Print 할 때 버튼이 보이지 않게 하기 위해 일부러 영역을 분리했다.


진행에 앞서 각 컨트롤들의 이름을 식별하기 쉽게 panContent(--> Panel 컨트롤), btnPrint(--> Button 컨트롤)로 각각 변경했다.
PrintDialog와 PrintDocument
.Net Framework에서 객체를 Print 하기 위해서는 PrintDialog와 PrintDocument 클래스를 활용해서 진행할 수 있다.
PrintDialog는 Windows에서 Print 할 때 확인할 수 있는 다이어로그 창 그 자체를 의미하고, 실질적으로 출력이 되어야 하는 요소는 PrintDocument 객체를 생성해서 작업해 준 후 PrintDialog로 넘겨주거나 PrintDocument 객체가 갖고 있는 print() 메서드 호출을 통해 출력이 가능하다.
MS에서 만든 공식 문서를 통해서도 Print 작업을 수행하는 방법도 알 수 있다. 해당 자료는 여기에 있다.
PrintDialog 구성 요소 개요 - Windows Forms .NET
.NET의 Windows Forms에서 PrintDialog 표시 및 인쇄 작업과 같은 인쇄 관련 설정에 대해 알아봅니다.
learn.microsoft.com
해결 방법
Panel 화면을 출력하는 것을 PrintDocument를 사용해서 해결했다. PrintDialog는 우선 사용하지 않고, PrintDocument 만을 사용해서 처리했다. 코드 먼저 보자.
/// <summary>
/// 사용자가 Print 버튼을 클릭
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPrint_Click(object sender, EventArgs e)
{
// 출력을 위한 PrintDocument 객체 생성
PrintDocument doc = new PrintDocument();
// 출력 제목 설정
doc.DocumentName = "PrintDocument 테스트 출력";
// 실질적으로 문서가 출력될 때 어떤 것을 출력할 것인지
// 처리하는 이벤트를 추가
doc.PrintPage += this.PrintPageEventHandler;
// 출력 명령 보내기
doc.Print();
}
private void PrintPageEventHandler(object sender, PrintPageEventArgs e)
{
int panelWidth = this.panContent.Width;
int panelHeight = this.panContent.Height;
// 출력할 화면을 Bitmap으로 그리기 위해 Bitmap 객체 생성
Bitmap bmp = new Bitmap(panelWidth, panelHeight);
// Panel에 보여지고 있는 화면을 생성한 Bitmap 객체에 그리기
this.panContent.DrawToBitmap(bmp, new Rectangle(0, 0, panelWidth, panelHeight));
// PrintDocument 객체(빈문서)에
// Graphics를 사용해서 panel Bitmap 객체를 그림.
e.Graphics.DrawImage(bmp, 0, 0, panelWidth, panelHeight);
}
각 코드마다 주석을 달아서 코드가 하는 역할이 무엇인지 설명을 했다.
이를 직접 실행해 보면 어떻게 되는지 살펴보자.

현재 내 PC에는 연결된 프린터가 없어서 자동으로 PDF로 저장되고 있는데, 결과는 어찌 됐든 수행이 되는 것을 볼 수 있다.
실제 생성된 PDF는 다음과 같이 나오게 된다.

위치와 이런 것들은 조금씩 세부적으로 지정하면 되는 것이라 위 코드를 활용해서 작업을 하면 다른 것들도 충분히 가능할 것이다. 기회가 되면 나중에는 여러 페이지를 한 번에 제어하는 것을 올려보도록 하겠다..
'C# > Winform (.Net Framework)' 카테고리의 다른 글
| C# - Winform Chart Control 정리 (1) | 2024.12.30 |
|---|---|
| C# - Winform 바탕화면 File을 Form(or Control)에 Drag하여 추가하기 (2) | 2024.12.20 |
| C# SqlDependency 활용 SQL Server 실시간 모니터링하기 (2) | 2024.12.16 |
| C# - SQL Server 연동하기 (Chapter.2 - DataAdapter 활용) (2) | 2024.12.02 |
| C# - SQL Server 연동하기 (Chapter.1 - DataSet, DataTable 활용) (1) | 2024.11.29 |