1. Trang chủ >
  2. Công Nghệ Thông Tin >
  3. Kỹ thuật lập trình >

17 Thay đổi quyền đã cấp cho mã ASP.NET

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (4.45 MB, 563 trang )


229

Chương 7: ASP.NET và Web Form



Hình 7.15 File machine.config



Bạn có thể thiết lập các đặc tính userName và password cho một người dùng bất kỳ, hoặc bạn

có thể đưa vào sử dụng tiến trình ASPNET cục bộ (thiết lập userName là machine và password

là AutoGenerate) hoặc tài khoản hệ thống cục bộ (thiết lập userName là SYSTEM và password là

AutoGenerate). Vì tài khoản hệ thống cục bộ có có đầy đủ quyền trên máy tính nên đừng bao

giờ sử dụng tài khoản này ngoại trừ mục đích thử nghiệm. Các thiết lập về tài khoản

ASP.NET là toàn cục và tất cả các ứng dụng Web sẽ chia sẻ tài khoản mà bạn chỉ định.

Bạn cũng có thể thay đổi tài khoản dùng để thực thi các ứng dụng hoặc đoạn mã nào đó bằng

kỹ thuật giả nhận. Ví dụ, để cấu hình một ứng dụng Web chạy dưới một tài khoản người dùng

khác, bạn cần thêm thẻ vào file Web.config như sau:















Bạn cũng có thể chỉ thị ứng dụng Web sử dụng identity đã được IIS xác thực, đó sẽ là tài

khoản nặc danh IUSR_[ServerName] nếu bạn không sử dụng Windows authentication (đã

được thảo luận trong mục 7.8). Bạn chỉ cần thêm thẻ mà không phải thêm bất cứ

thông tin xác thực nào:





Nhớ rằng, đối với kiểu giả nhận này, tài khoản người dùng sẽ yêu cầu truy xuất đọc/ghi đến

thư mục Temporary ASP.NET Files (nơi lưu trữ các file ASP.NET đã được biên dịch—được

định vị tại \[WindowsDirectory]\Microsoft.NET\Framework\ [version]\Temporary ASP.NET

Files).

Cuối cùng, bạn cũng có thể sử dụng kỹ thuật giả nhận bằng mã lệnh (vấn đề này sẽ được mô

tả chi tiết trong mục 13.15). Tuy vậy, ví dụ dưới đây sẽ làm việc cùng với Windows

authentication. Nếu IIS đã xác thực người dùng (được mô tả trong mục 7.8), identity đó sẽ

được thừa nhận khi sử dụng phương thức WindowsIdentity.Impersonate. Để sử dụng đoạn

mã này, bạn phải nhập không gian tên System.Security.Principal.

if (User.GetType() == typeof(WindowsPrincipal)) {



230

Chương 7: ASP.NET và Web Form

WindowsIdentity id = (WindowsIdentity)User.Identity;

WindowsImpersonationContext impersonate = id.Impersonate();

// (Thực hiện các tác vụ với ID này.)

// Trả lại ID.

impersonate.Undo();

} else {



}



// Người dùng không được xác thực.

// Ném lỗi hoặc thực hiện các bước khác.



231



Chương 8: ĐỒ HỌA, ĐA PHƯƠNG TIỆN, VÀ IN ẤN



8



232



233

Chương 8: Đồ họa, đa phương tiện, và in ấn



Đ



ồ họa, video, audio, và in ấn là những dấu hiệu tiêu chuẩn của một client đa năng

truyền thống trên hệ điều hành Microsoft Windows. Khi tiến đến đa phương tiện,

Microsoft .NET Framework hỗ trợ cho vài đặc tính này, trong khi bỏ qua các đặc

tính khác. Ví dụ, bạn sẽ tìm thấy một tập phức tạp các công cụ dùng để thực hiện việc vẽ

trong không gian hai chiều và việc in dựa-trên-sự-kiện với GDI+ và các kiểu thuộc không

gian tên System.Drawing. Các lớp này hỗ trợ các hàm Graphics Device Interface (GDI)

nguyên sinh trong Windows API; khiến cho việc vẽ các hình dạng phức tạp, làm việc với tọa

độ và phép biến hình, và xử lý ảnh dễ dàng hơn. Mặt khác, nếu bạn muốn chơi một file audio,

hiển thị một file video, hoặc lấy thông tin về các tác vụ in hiện thời, bạn sẽ cần phải vượt ra

ngoài .NET Framework.

Các đề mục trong chương này trình bày cách sử dụng các đặc tính nội tại .NET và các thư

viện Win32 nguyên sinh thông qua P/Invoke hoặc COM Interop. Một vài kỹ thuật sẽ được đề

cập:







Tìm và sử dụng các font đã được cài đặt (mục 8.1), vẽ hình cuộn được (mục

8.5) và thumbnail (mục 8.8), cũng như thực hiện chụp màn hình bằng Win32 API (mục

8.6).







Làm việc với các điều kiểm tùy biến owner-drawn (mục 8.3 và 8.4) và xử lý

các đối tượng đồ họa trên màn hình (mục 8.2 và 8.7).







Chơi các file audio và video (bao gồm WAV, MP3, và MPEG) bằng thư viện

Quartz có trong Windows Media Player (mục 8.9, 8.10, và 8.11).







In các văn bản đơn giản và phức tạp (mục 8.13 và 8.14), in text với wrapping

(mục 8.15), tạo print preview (mục 8.16), và lấy thông tin về máy in (mục 8.12) và

hàng đợi in bằng WMI (mục 8.17).



1



Tìm tất cả các font đã được cài đặt









Bạn cần lấy danh sách tất cả các font đã được cài đặt trên máy tính hiện hành.

Tạo đối tượng System.Drawing.Text.InstalledFontCollection, tập hợp này chứa

các đối tượng FontFamily mô tả tất cả các font đã được cài đặt.



Lớp InstalledFontCollection cho phép bạn lấy thông tin về các font đã được cài đặt. Đoạn

mã dưới đây duyệt qua tập hợp font vừa được tạo; mỗi khi tìm thấy một font, nó sẽ tạo một

Label mới để hiển thị tên font với diện mạo cho trước (kích thước 14 point). Label được thêm

vào một Panel cuộn được, cho phép người dùng cuộn qua danh sách các font hiện có.

using

using

using

using



System;

System.Windows.Forms;

System.Drawing;

System.Drawing.Text;



public class ListFonts : System.Windows.Forms.Form {

private System.Windows.Forms.Panel pnlFonts;

// (Bỏ qua phần mã designer.)



234

Chương 8: Đồ họa, đa phương tiện, và in ấn

private void ListFonts_Load(object sender, System.EventArgs e) {

// Tạo tập hợp font.

InstalledFontCollection fontFamilies =

new InstalledFontCollection();

// Duyệt qua tất cả các font.

int offset = 10;

foreach (FontFamily family in fontFamilies.Families) {

try {

// Tạo một Label để hiển thị text (viết ở font này).

Label fontLabel = new Label();

fontLabel.Text = family.Name;

fontLabel.Font = new Font(family, 14);

fontLabel.Left = 10;

fontLabel.Width = pnlFonts.Width;

fontLabel.Top = offset;

// Thêm Label vào Panel cuộn được.

pnlFonts.Controls.Add(fontLabel);

offset += 30;

}catch {



}

}



//

//

//

//



Lỗi sẽ xảy ra nếu font được chọn không

hỗ trợ normal style (mặc định được sử dụng khi

tạo đối tượng Font). Vấn đề này có thể

được bỏ qua mà không sao cả.



}



}



Hình 8.1 Danh sách các font đã được cài đặt



2





Thực hiện “hit testing” với shape

Bạn cần nhận biết người dùng có nhắp vào trong một shape hay không.



235

Chương 8: Đồ họa, đa phương tiện, và in ấn







Kiểm tra điểm mà người dùng đã nhắp vào bằng các phương thức như

Rectangle.Contains và Region.IsVisible (thuộc không gian tên System.Drawing),

hoặc GraphicsPath.IsVisible (thuộc không gian tên System.Drawing.Drawing2D),

tùy vào kiểu của shape.



Thông thường, nếu sử dụng GDI+ để vẽ shape trên form, có thể bạn sẽ cần xác định xem khi

nào người dùng nhắp vào trong một shape cho trước. .NET Framework cung cấp ba phương

thức có thể thực hiện công việc này:

• Phương thức Rectangle.Contains—nhận vào một điểm và trả về true nếu điểm này

nằm bên trong hình chữ nhật cho trước. Trong nhiều trường hợp, bạn có thể lấy được

hình chữ nhật đối với một kiểu shape khác. Ví dụ, bạn có thể sử dụng Image.GetBounds

để lấy hình chữ nhật mô tả đường biên của shape. Cấu trúc Rectangle là thành viên của

không gian tên System.Drawing.

• Phương thức GraphicsPath.IsVisible—nhận vào một điểm và trả về true nếu điểm

này nằm bên trong một vùng được định nghĩa bởi GraphicsPath khép kín. Vì một

GraphicsPath có thể chứa nhiều line, shape, và figure nên cách này rất hữu ích nếu bạn

muốn kiểm tra một điểm có nằm bên trong một vùng không phải hình chữ nhật hay

không. Lớp GraphicsPath là một thành viên của không gian tên

System.Drawing.Drawing2D.

• Phương thức Region.IsVisible—nhận vào một điểm và trả về true nếu điểm này

nằm bên trong một vùng được định nghĩa bởi Region. Cũng giống như GraphicsPath,

Region có thể mô tả một shape không phải hình chữ nhật. Region là một thành viên của

không gian tên System.Drawing.

Ví dụ sau đây sẽ tạo một Rectangle và một GraphicsPath. Theo mặc định, hai shape này có

nền màu xanh nhạt. Tuy nhiên, phương thức thụ lý sự kiện Form.MouseMove sẽ kiểm tra xem

con trỏ chuột có nằm trong một trong hai shape này hay không, và cập nhật màu nền thành

hồng tươi nếu con trỏ ở đó.

using

using

using

using



System;

System.Windows.Forms;

System.Drawing;

System.Drawing.Drawing2D;



public class HitTesting : System.Windows.Forms.Form {

// (Bỏ qua phần mã designer.)

// Định nghĩa các shape sẽ được sử dụng.

private GraphicsPath path;

private Rectangle rectangle;

// Định nghĩa các cờ để theo vết con trỏ chuột.

private bool inPath = false;

private bool inRectangle = false;

// Định nghĩa các bút vẽ.

Brush highlightBrush = Brushes.HotPink;

Brush defaultBrush = Brushes.LightBlue;

private void HitTesting_Load(object sender, System.EventArgs e) {



236

Chương 8: Đồ họa, đa phương tiện, và in ấn

// Tạo các shape.

path = new GraphicsPath();

path.AddEllipse(10, 10, 100, 60);

path.AddCurve(new Point[] {new Point(50, 50),

new Point(10,33), new Point(80,43)});

path.AddLine(50, 120, 250, 80);

path.AddLine(120, 40, 110, 50);

path.CloseFigure();

rectangle = new Rectangle(100, 170, 220, 120);

}

private void HitTesting_Paint(object sender,

System.Windows.Forms.PaintEventArgs e) {

Graphics g = e.Graphics;

// Vẽ shape dựa trên phần chọn hiện tại.

if (inPath) {

g.FillPath(highlightBrush, path);

g.FillRectangle(defaultBrush, rectangle);

}else if (inRectangle) {

g.FillRectangle(highlightBrush, rectangle);

g.FillPath(defaultBrush, path);

}else {

g.FillPath(defaultBrush, path);

g.FillRectangle(defaultBrush, rectangle);



}



}

g.DrawPath(Pens.Black, path);

g.DrawRectangle(Pens.Black, rectangle);



private void HitTesting_MouseMove(object sender,

System.Windows.Forms.MouseEventArgs e) {

Graphics g = this.CreateGraphics();

// Thực hiện "hit testing" với hình chữ nhật.

if (rectangle.Contains(e.X, e.Y)) {

if (!inRectangle) {

inRectangle = true;

// Đổi màu nền hình chữ nhật.

g.FillRectangle(highlightBrush, rectangle);

g.DrawRectangle(Pens.Black, rectangle);

}

}else if (inRectangle) {

inRectangle = false;

// Phục hồi hình chữ nhật.



237

Chương 8: Đồ họa, đa phương tiện, và in ấn



}



g.FillRectangle(defaultBrush, rectangle);

g.DrawRectangle(Pens.Black, rectangle);



// Thực hiện "hit testing" với path.

if (path.IsVisible(e.X, e.Y)) {

if (!inPath) {

inPath = true;



}



// Đổi màu nền path.

g.FillPath(highlightBrush, path);

g.DrawPath(Pens.Black, path);



}else if (inPath) {

inPath = false;

// Phục hồi path.

g.FillPath(defaultBrush, path);

g.DrawPath(Pens.Black, path);

}

}



g.Dispose();



}



Hình 8.2 Thực hiện “hit testing” với đối tượng Rectangle và GraphicsPath



Chú ý rằng hoạt động này diễn ra trực tiếp bên trong phương thức thụ lý sự kiện MouseMove.

Việc vẽ chỉ được thực hiện nếu phần chọn hiện tại thay đổi. Đối với một đoạn mã đơn giản,

bạn có thể làm mất hiệu lực toàn bộ form mỗi khi con trỏ chuột di chuyển vào trong hoặc ra

khỏi một vùng và thụ lý tất cả việc vẽ trong phương thức thụ lý sự kiện Form.Paint, nhưng

điều này dẫn đến việc phải vẽ nhiều hơn và tạo nên hiện tượng rung hình (flicker) khi toàn bộ

form được vẽ lại.



238

Chương 8: Đồ họa, đa phương tiện, và in ấn



3



Tạo form có hình dạng tùy biến









Bạn cần tạo một form hoặc điều kiểm không phải hình chữ nhật.

Tạo một đối tượng System.Drawing.Region có hình dạng như bạn muốn, và gán nó

vào thuộc tính Form.Region hoặc Control.Region.



Để tạo một form hoặc điều kiểm không phải hình chữ nhật, trước hết bạn cần định nghĩa hình

dạng mình muốn. Cách tiếp cận dễ nhất là sử dụng đối tượng

System.Drawing.Drawing2D.GraphicsPath, nó có thể điều tiết bất kỳ sự kết hợp nào của các

hình ellipse, chữ nhật, và cung khép kín. Bạn có thể thêm các shape vào một đối tượng

GraphicsPath bằng các phương thức như AddEllipse, AddRectangle, và AddClosedCurve. Một

khi đã hoàn tất việc định nghĩa hình dạng như mong muốn, bạn có thể tạo một đối tượng

Region từ GraphicsPath này—chỉ cần trình ra GraphicsPath trong phương thức khởi dựng của

lớp Region. Cuối cùng, bạn có thể gán Region vào thuộc tính Form.Region hoặc

Control.Region.

Ví dụ dưới đây trình bày cách tạo một form có hình dáng bất thường (xem hình 8.3) bằng hai

cung tròn (hai cung này được chuyển thành một figure khép kín bằng phương thức

GraphicsPath.CloseAllFigures).



Hình 8.3 Form không phải hình chữ nhật

using

using

using

using



System;

System.Windows.Forms;

System.Drawing;

System.Drawing.Drawing2D;



public class IrregularForm : System.Windows.Forms.Form {

private System.Windows.Forms.Button cmdClose;

private System.Windows.Forms.Label label1;

// (Bỏ qua phần mã designer.)

private void IrregularForm_Load(object sender, System.EventArgs e) {

GraphicsPath path = new GraphicsPath();

Point[] pointsA = new Point[] {new Point(0, 0),

new Point(40, 60), new Point(this.Width - 100, 10)};



239

Chương 8: Đồ họa, đa phương tiện, và in ấn

path.AddCurve(pointsA);

Point[] pointsB = new Point[]

{new Point(this.Width - 40, this.Height - 60),

new Point(this.Width, this.Height),

new Point(10, this.Height)};

path.AddCurve(pointsB);



}



path.CloseAllFigures();

this.Region = new Region(path);



private void cmdClose_Click(object sender, System.EventArgs e) {

this.Close();

}



}



Đối với ví dụ tạo điều kiểm không phải hình chữ nhật, bạn hãy tham khảo mục 8.4.



4



Tạo điều kiểm có hình dạng tùy biến







Bạn cần tạo một shape mà người dùng có thể thao tác với nó trên form như kéo

rê, thay đổi kích thước....







Tạo một điều kiểm tùy biến, và chép đè painting logic để vẽ shape. Gán shape của

bạn vào thuộc tính Control.Region. Kế đó, bạn có thể sử dụng Region này để thực

hiện “hit testing”.



Nếu muốn tạo một giao diện người dùng phức tạp kết hợp nhiều phần tử được vẽ tùy biến,

bạn cần có phương cách để theo vết các phần tử này và cho phép người dùng tương tác với

chúng. Cách tiếp cận dễ nhất trong .NET là tạo một điều kiểm chuyên biệt bằng cách dẫn xuất

một lớp từ System.Windows.Forms.Control. Kế đó, bạn có thể tùy biến phương cách mà điều

kiểm này được vẽ dựa theo tập các sự kiện cơ bản của nó.

Điều kiểm được trình bày dưới đây mô tả một hình ellipse đơn giản trên form. Tất cả các điều

kiểm đều được liên hợp với một vùng chữ nhật trên form, do đó điều kiểm EllipseShape sẽ

tạo một ellipse lắp đầy các đường biên này (được cấp thông qua thuộc tính

Control.ClientRectangle). Một khi shape đã được tạo, thuộc tính Control.Region được thiết

lập dựa theo biên trên ellipse. Điều này bảo đảm các sự kiện như MouseMove, MouseDown,

Click... sẽ xảy ra chỉ khi chuột ở trên ellipse, chứ không phải toàn bộ hình chữ nhật.

Dưới đây là phần mã đầy đủ của lớp EllipseShape:

using

using

using

using



System;

System.Windows.Forms;

System.Drawing;

System.Drawing.Drawing2D;



public class EllipseShape : System.Windows.Forms.Control {

private GraphicsPath path = null;

private void RefreshPath() {

// Tạo GraphicsPath cho shape và áp dụng nó vào



Xem Thêm
Tải bản đầy đủ (.doc) (563 trang)

×