Smart Client (PrintPreviewDialog와 OpenFileDialog의 사용)
스마트 클라이언트란 말 그대로 똑똑한 클라이언트라 할 수 있다.
기존의 ActiveX컨트롤과 비슷한 기능을 하지만 그보다 훨씬 간단히 접근 할 수 있다. 물론 그렇게 만만한 놈은 아니다.
지금부터 스마트 클라이언트를 이용하여 웹브라우저에서 인쇄 및 파일 업로드 기능을 작성해 보도록 하자.
기존의 <input type=file>태그를 통하여 파일업로드를 할 경우 기본 컨트롤의 모양을 보기 좋게 바꾸기는 상당히 어려운 점이 많이 있었다.
하지만 스마트 클라이언트를 이용하면 간단히 이미지를 클릭할때 OpenFileDialog를 띄울 수 있다.
그럼 예제를 시작해 보도록 하자!!
using System; namespace RichWinForm //외부 스크립트에서 public메서드를 호출하기위한 //유저컨트롤과 인터페이스(외부의 스크립트에서 public메서드 호출을 위해)를 상속받는다. //미리보기 다이얼로그 인스턴스 생성 //파일선택 다이얼로그 //미리보기의 문서 인스턴스 생성 } e.Graphics.DrawString(text, printFont, System.Drawing.Brushes.Black, 0, 0); #region IPrintControlCOMIncomming 멤버 //외부 스크립트 이벤트에 의하여 호줄 되는 메서드 //웹폼 버튼 선택 시 파일 경로 출력 //윈폼 버튼 선택 시 파일 경로 출력
using System.Drawing;
using System.Drawing.Printing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
{
//외부 스크립트의 호출을 위한 인터페이스
public interface IPrintControlCOMIncomming
{
void show(string oData);
string showDialog();
}
[ClassInterface(ClassInterfaceType.None)]
public class Print: System.Windows.Forms.UserControl, IPrintControlCOMIncomming
{
private System.Windows.Forms.Button btnFile;
System.Windows.Forms.TextBox textBox1;
System.Windows.Forms.Button button1;
PrintPreviewDialog ppd = new System.Windows.Forms.PrintPreviewDialog();
OpenFileDialog ofd = new OpenFileDialog();
PrintDocument pd = new PrintDocument();
//초기화
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.textBox1 = new System.Windows.Forms.TextBox();
this.btnFile = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.BackColor = System.Drawing.SystemColors.Control;
this.button1.Font = new System.Drawing.Font("돋움", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);
this.button1.Location = new System.Drawing.Point(16, 16);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(104, 23);
this.button1.TabIndex = 0;
this.button1.Text = "인쇄하기(윈폼)";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(16, 56);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(216, 21);
this.textBox1.TabIndex = 1;
this.textBox1.Text = "";
//
// btnFile
//
this.btnFile.BackColor = System.Drawing.SystemColors.Control;
this.btnFile.Font = new System.Drawing.Font("돋움", 12F,
System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);
this.btnFile.Location = new System.Drawing.Point(112, 104);
this.btnFile.Name = "btnFile";
this.btnFile.Size = new System.Drawing.Size(120, 23);
this.btnFile.TabIndex = 3;
this.btnFile.Text = "파일 업로드(윈폼)";
this.btnFile.Click += new System.EventHandler(this.btnFile_Click);
//
// Print
//
this.BackColor = System.Drawing.SystemColors.ControlLight;
this.Controls.Add(this.btnFile);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.button1);
this.Name = "Print";
this.Size = new System.Drawing.Size(248, 176);
this.ResumeLayout(false);
//생성자
public Print()
{
InitializeComponent();
this.pd.PrintPage += new PrintPageEventHandler(this.OnPrintPage);
}
//페이지를 설정하는 이벤트 메서드
private void OnPrintPage(object obj, PrintPageEventArgs e)
{
string text = "앗싸!!! 된다...";
System.Drawing.Font printFont = new System.Drawing.Font("돋움", 12, System.Drawing.FontStyle.Regular);
}
//윈폼 버튼 클릭시
private void button1_Click(object sender, System.EventArgs e)
{
//문서의 이름 설정
pd.DocumentName="tt";
//미리보기 다이얼로그에 문서 지정
ppd.Document = pd;
//다이얼로그 출력
ppd.ShowDialog();
}
public void show(string oData)
{
//외부에서 데이터를 가져와서
//버튼의 이름으로 설정
textBox1.Text = oData;
//문서의 이름 설정
pd.DocumentName="tt";
//미리보기 다이얼로그에 문서 지정
ppd.Document = pd;
//다이얼로그 출력
ppd.ShowDialog();
}
public string showDialog()
{
if(ofd.ShowDialog() == DialogResult.OK)
{
return ofd.FileName;
}
return null;
}
#endregion
private void btnFile_Click(object sender, System.EventArgs e)
{
if(ofd.ShowDialog() == DialogResult.OK)
{
textBox1.Text = ofd.FileName;
}
}
}
}
dll을 호출하는 HTML 코드
기존의 ActiveX와 동일하게 <OBJECT>태그를 통하여 dll을 사용한다.
<%@ Page language="c#" Codebehind="MyForm.aspx.cs" AutoEventWireup="false" Inherits="RichWinForm.WebForm1" %> |