1.1 Tr v động mt bc hình
V
V
Bn cn tr v động mt bc hình (chng hn, để to dng kết xut dng biu
đồ hoc đồ th).
#
#
To dng bc hình bng GDI+ và mt đối tượng System.Drawing.Bitmap
trong-b-nh. Kế đó, bn có th ghi nó ra dòng kết xut (output stream), hoc
lưu nó vào đĩa cng ca server và hin th nó vi điu kim web Image.
Bn có th v động các bc hình trong mt ng dng Web bng cách s dng cùng đon
GDI+ đã s dng trong mt ng dng da-trên-Windows. Chđim khác là cách
thc bn tr v bc hình cui cùng như thế nào. V cơ bn, có hai cách tiếp cn mà bn
có th s dng:
Bn có th đưa trc tiếp ni dung nh phân ca bc hình vào thuc tính
OutputStream ca đối tượng HttpResponse. Đây là mt cách tiếp cn hay nếu bn
không mun làm đầy đĩa cng ca server vi các file hình không h được s dng
li. Đây cũng là s la chn tt nht nếu bn cn to động các bc hình được thiết
kế để phù hp vi đầu vào ca người dùng.
Bn có th lưu bc hình vào h thng file ca web-server và s dng th HTML
<img> để hin th nó. Đây là s la chn tt nếu bn cn to mt bc hình s được
s dng li, vì tránh được chi phí ca vic tái to hình liên tc.
Mc này kho sát c hai cách tiếp cn trên. Trước tiên, hãy xét cách to động mt hình
mà không lưu nó ra file. Trong ví d này, mc đích là to mt banner đơn gin (xem hình
7.10).
Hình 7.10 Mt banner được-to-động
The image part with relationsh ip ID rId 5 was not fo und in the file.
Để ý rng ch có phn text ca banner là do người dùng cung cp (thông qua chui truy
vn). Font, màu, và kích thước được viết mã cng (mc dù chúng có th được thiết lp d
dàng da vào các đối s chui truy vn khác hoc da vào file Web.config).
Đon mã dưới đây s trình bày cách tiếp cn này:
using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Drawing.Drawing2D;
public class DynamicGraphic : System.Web.UI.Page {
// (B qua phn mã designer.)
private void Page_Load(object sender, System.EventArgs e) {
// Ly text t chui truy vn.
// Nếu không có text, chn mc định.
string text = "";
if (Request.QueryString["image"] == null) {
Response.Redirect(Request.Url + "?image=" +
Server.UrlEncode("This is a test image"));
}
else {
text = Server.UrlDecode(Request.QueryString["image"]);
}
// To mt hình bitmap trong-b-nh
// (rng 300 pixel và cao 200 pixel).
int width = 300, height = 200;
Bitmap bitmap = new Bitmap(width, height);
// Ly graphics context ca hình bitmap.
Graphics graphics = Graphics.FromImage(bitmap);
// Thiết lp màu nn và cht lượng hình.
// Màu này s tr thành đường vin.
graphics.Clear(Color.OrangeRed);
graphics.SmoothingMode = SmoothingMode.AntiAlias;
// V mt hình ch nht.
graphics.FillRectangle(new SolidBrush(Color.Olive), 5, 5,
width - 10, height - 10);
// Chn font và alignment cho text.
Font fontBanner = new Font("Verdana", 24, FontStyle.Bold);
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
// V text.
graphics.DrawString(text, fontBanner,
new SolidBrush(Color.LightYellow),
new Rectangle(0, 0, width, height), stringFormat);
// Lưu bc hình vào dòng kết xut.
bitmap.Save(Response.OutputStream,
System.Drawing.Imaging.ImageFormat.Gif);
graphics.Dispose();
bitmap.Dispose();
}
}
Khi lưu bc hình vào dòng kết xut, bn s thế ch bt k kết xut nào khác. Vì thế, bn
không th s dng k thut này vi mt trang cũng có cha Web controls hoc ni dung
HTML tĩnh. Theo đó, nếu mun s dng mt trang phi hp các bc hình được-to-động
và các điu kim web, bn cn “bc” bc hình được-to-động trong mt điu kim hoc
ghi bc hình ra đĩa cng trước khi hin th nó.
Nếu mun lưu file vào đĩa cng, bn cn chuyn phn mã to dng bc hình thành mt
phương thc độc lp, mà chúng ta s đặt tên là GenerateBanner. Kế đó, trong phương
thc th lý s kin Page.Load, bn kim tra xem file đã tn ti chưa (s dng phương
thc tĩnh File.Exists). Nếu file chưa tn ti, bn to nó trong b nh bng phương thc
GenerateBanner và lưu nó bng phương thc Bitmap.Save. Nếu file đã tn ti, bn ch
cn np thng bc hình này.
Đon mã dưới đây s trình bày cách tiếp cn này:
using System;
using System.IO;
using System.Web;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Drawing.Drawing2D;
public class DynamicGraphic : System.Web.UI.Page {
protected System.Web.UI.WebControls.Image imageControl;
// (B qua phn mã designer.)
private Bitmap GenerateBanner() {
// To dng bc hình, s dng phn mã trong ví d trên.
}
private void Page_Load(object sender, System.EventArgs e) {
// Thiết lp tên file.
// Gi s chui truy vn cha các ký t hp l cho tên file.
string fileName = Request.QueryString["image"] + ".gif";
Bitmap bitmap = null;
// Kim tra bc hình vi phn text này đã tn ti hay chưa.
if (File.Exists(fileName)) {
// Np bc hình hin có.
try {
bitmap = new Bitmap(fileName);
}catch {
bitmap = GenerateBanner();
}
}
else {
bitmap = GenerateBanner();
// Lưu bc hình.
bitmap.Save(fileName,
System.Drawing.Imaging.ImageFormat.Gif);
}
// Hin th bc hình.
imageControl.ImageUrl = fileName;
}
}
1.2 Np điu kim người dùng bng mã lnh
V
V
Bn cn to dng động giao din người dùng (user interface) cho mt trang t
mt hoc nhiu điu kim người dùng (user control).
#
#
S dng phương thc Page.LoadControl để to đối tượng điu kim t file
.ascx, và ri thêm nó vào tp hp Controls ca mt điu kim container.
Điu kim người dùng là các nhóm điu kim độc lp. Như Web Form, điu kim người
dùng bao gm phn layout định nghĩa các điu kim bên trong (file .ascx) và phn code-
behind cùng vi logic th lý s kin (file .cs). Điu kim người dùng cho phép bn s
dng li các phn t giao din thông thường trên nhiu trang và to dng các giao din
phc tp t các khi nh hơn. Mt đặc đim hu ích ca điu kim người dùng là chúng
có th được np bng mã lnh, điu này cho phép bn to mt giao din cu hình cao do
bn thiết kế động y theo người dùng. Bn ch cn np điu kim, cu hình các thuc tính
ca nó, và ri thêm nó vào mt điu kim container.
Ví d, xét trang web đã to động các bc hình trong mc 7.12. Mt gii pháp theo cách
hướng đối tượng hơn có th hin thc được là to mt điu kim người dùng tùy biến
đóng gói bc hình được-to-động. Điu kim người dùng này cho phép trang thiết lp
text, font, màu... thông qua các thuc tính khác nhau.
using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Drawing.Drawing2D;
public class DynamicGraphicControl : System.Web.UI.UserControl {
// (B qua phn mã designer.)
private string imageText = "";
public string ImageText {