Thông tin tài liệu:
Một trong các đặc tính nổi bật nhất của Windows là giao diện giao tiếp với người dùng. Nhờ đặc tính này, nhiều dạng dữ liệu thông tin khác nhau được máy tính hỗ trợ khi xuất ra màn hình, máy in, … Trong đó xuất văn bản ra vùng làm việc của các ứng dụng Win32 là hình thức phổ biến nhất trong giao diện đồ họa. Ở các bài viết trước, các thao tác xuất thông tin chỉ được thực hiện thông qua các cửa sổ thông báo, hộp thoại và các phần tử điều khiển. Chương...
Nội dung trích xuất từ tài liệu:
Xuất chữ ra vùng client của ứng dụngIczelion’s Tutorial Win32 ASM Tutorial 4 : Painting with Text Xuất chữ ra vùng client của ứng dụng Một trong các đặc tính nổi bật nhất của Windows là giao diện giao tiếp với ngườidùng. Nhờ đặc tính này, nhiều dạng dữ liệu thông tin khác nhau được máy tính hỗ trợ khixuất ra màn hình, máy in, … Trong đó xuất văn bản ra vùng làm việc của các ứng dụngWin32 là hình thức phổ biến nhất trong giao diện đồ họa. Ở các bài viết trước, các thao tác xuất thông tin chỉ được thực hiện thông qua cáccửa sổ thông báo, hộp thoại và các phần tử điều khiển. Chương này sẽ trình bày cách thểhiện nội dung văn bản trên vùng làm việc của cửa sổ thông qua các hàm Win32 API. Trong bài viết này, chúng ta học cách làm thế nào để xuất chữ ra vùng client củaứng dụng, tìm hiểu sâu hơn về việc xử lý thông điệp WM_PAINT, các khái niệm về thiếtbị ngữ cảnh (device context) và các thông tin metrics.Tìm hiểu về Device Context Văn bản là một trong những đối tượng đồ họa của hệ thống. Mỗi ký tự là tập hợpcủa nhiều điểm ảnh (pixels) được xếp thành những mẫu riêng biệt. Đó là lý do tại saongười ta dùng thuật ngữ là vẽ painting chứ không phải là writing. Thông thường, bạn“vẽ” chữ trong vùng client của ứng dụng (thực tế, bạn cũng có thể vẽ bên ngoài vùngclient, nhưng đó là vấn đề khác). Việc xuất chữ ra màn hình trong Windows hoàn toànkhác trong Dos. Trong Dos, ở chế độ văn bản màn hình có kích thước 80 x 25 (80 cột x25 dòng) và chỉ sử dụng bởi một ứng dụng. Nhưng trong Windows thì khác, màn hìnhđược chia sẽ cho những ứng khác nhau. Một vài bắt buộc phải tuân thủ để tránh tình trạngmàn hình của ứng dụng này chồng lên màn hình của ứng dụng khác .Vì thế, HĐH sẽ giớihạn vùng painting của mỗi cửa sổ là vùng client của chính nó.Vùng client của cửa sổ là phần của cửa sổ ứng dụng trừ thanh tiêu đề (title), đường viền (border), thanhmenu (menu bar), thanh công cụ (tool bar), thanh trạng thái (status bar) và thanh cuộn (scrollbar). Hìnhảnh của vùng client được thể hiện như sau:Người dịch: Benina (REA TEAM) Trang 1Tổng hợp và hiệu chỉnh: NhatPhuongLe (VNCERT TEAM)Iczelion’s Tutorial Win32 ASM Tutorial 4 : Painting with TextKích thước vùng client của cửa sổ window không là hằng số. Người dùng có thể thay đổikích thước này bất kỳ khi nào họ muốn. Vì vậy, bạn cần phải xác định kích thước củavùng client một cách linh động.Khi một chương trình cần vẽ lên trên vùng client, bạn phải “xin phép”, xem HĐH có chấpthuận cho bạn có quyền lên vùng client của ứng dụng hay không. HĐH sẽ xác định kíchthước của vùng client của ứng dụng, font chữ, màu chữ và các thuộc tính khác của giaodiện thiết bị đồ họa (GDI – Graphics Device Interface), và gởi về handle của thiết bị ngữcảnh (handle to device context) cho ứng dụng của bạn. Bạn có thể dùng device contextnhư một giấy thông hành để vẽ trên vùng client.Vậy device context là gì?. Nó thực sự chỉ là một cấu trúc dữ liệu được duy trì bên trongWindows bởi GDI . Một DC được kết hợp với một thiết bị hiển thị đặc thù như là mànhình hay máy in. Đối với màn hình, một DC thường kết hợp với một cửa sổ riêng biệt trênmàn hình.Một số giá trị trong DC là các thuộc tính đồ họa như colors, font… Bạn có thể thay đổinhững giá trị mặc định này bằng cách gọi các hàm GDI khác nhau. Các hàm GDI chophép bạn nhận các giá trị hiện hành của các thuộc tính này. Dĩ nhiên, còn có các hàm GDIkhác cho phép bạn thực sự vẽ vùng client của cửa sổ. Có thể xem DC như là môi trườngđược thiết lập mặc định được HĐH chuẩn bị sẳn cho bạn. Bạn có thể thay đổi thiết lậpmặc định nếu bạn muốn.Khi một chương trình cần vẽ, đầu tiên nó cần nhận một handle của một DC. Thôngthường, có 3 cách để nhận handle của DC: Sử dụng hàm BeginPaint và EndPaint để xử lý thông điệp WM_PAINTBạn sử dụng phương pháp này khi xử lý các thông điệp WM_PAINT. Hai hàm được yêucầu: BeginPaint và EndPaint. Hai hàm này yêu cầu handle cửa sổ, đưa vào thủ tụcwindow như một đối số và địa chỉ của biến cấu trúc này là ps và định nghĩa nó trong thủtục window như sau: PAINTSTRUCT ps;Cấu trúc PAINTSTRUCT được định nghĩa như sau:typedef struct tagPAINTSTRUCT { // ps HDC hdc; //handle c•a DC BOOL fErase; //Cho bi•t background có b• xóa hay không RECT rcPaint; //Cho bi•t t•a •• HCN tô v• l•i BOOL fRestore; //dành riêng cho Windows s• d•ng BOOL fIncUpdate; //dành riêng cho Windows s• d•ng BYTE rgbReserved[32]; //dành riêng cho Windows s• d•ng} PAINTSTRUCT;Trong khi xử lý một thông điệp WM_PAINT, đầu tiên thủ tục Window gọi BegianPaint.Hàm BeginPaint thường làm nền của vùng không hợp lệ bị xóa để chuẩn bị vẽ. Hàm cũngđiền vào các trường trong cấu trúc ps. Giá trị trả về từ BeginPaint là handle của DC. Nóthường lưu trong một biến có tên là hdc. Bạn địn ...