Bài 3.1: Vẽ ra màn hình
Trong bài trước, qua việc tạo HelloWorld applet, ta đã học sơ qua cấu trúc của chương trình BREW. Lần này, cùng với việc giải thích cụ thể về API vẽ màn hình, sẽ đi sâu vào lý giải interface và applet structure.
Applet vẽ hỉnh chứ nhật
Lần trước, khi khởi động applet, trên màn hình máy mobile hiển thị dòng chữ “Hello World”. Lần này trước tiên, cũng là để ôn lại lần trước, sẽ tiến hành tạo Square applet vẽ ra hình chữ nhật màu đỏ trên nền màn hình màu tím.
Tòan bộ source code có thể download tại ĐÂY
Implementation của hàm AEEClsCreateInstance() và Shape_HandleEvent() giống như HelloWorld applet lần trước, không thay đổi. Lần này, ta đặt mục tiêu hiểu toàn bộ xử lý vẽ màn hình bên trong hàm Square_OnAppStart().
Applet structure: AEEApplet
Trong bài trước, ta chưa giải thích gì về nội dung của applet structure AEEApplet, lần này ta sẽ tìm hiểu cụ thể. Tuy nhiên, trong [BREW API reference] không hề đả động gì tới AEEApplet. Trong [BREW SDK user guide] cũng chỉ có đả động một chút.
Trong trường hợp như thế này, thì trực tiếp tìm hiểu nội dung header file của BREW SDK là cách hữu hiệu nhất. AEEApplet được định nghĩa tại inc\AEEAppGen.h trong folder đã install BREW SDK, ta hãy mở ra và xem nội dung nó.
* Tại VC++ 6, click vào phần #include “AEEAppGen.h”ở phía đầu source code, từ menu hiển thị chọn [ドキュメント "AEEAppGen.h" を開く] (mở document “AEEAppGen.h”) sẽ nhanh chóng mở được file.
Khi tìm hiểu AEEAppGen.h, ta sẽ thấy có những khai báo như sau.
struct _AEEApplet
{
DECLARE_VTBL(IApplet)
AEECLSID clsID; // applet's class ID
uint32 m_nRefs; // reference count của applet
IShell * m_pIShell; // IShell object
IModule * m_pIModule; // IModule object
IDisplay * m_pIDisplay; // IDisplay object
AEEHANDLER pAppHandleEvent; // applet's event handler function
PFNFREEAPPDATA pFreeAppData; // hàm được gọi khi giải phóng applet
};
typedef struct _AEEApplet AEEApplet;
Tại đây ta không cần hiểu tòan bộ. Nhận thấy, trong applet structure, ngoài class ID và event hanlder, còn có một số biến số khác.
Có lẽ, khi gọi hàm AEEApplet_New() tại bên trong hàm AEEClsCreateInstance(), những member variable này được initialize.
* Implementation của hàm AEEApplet_New() được định nghĩa tại AEEAppGen.c. Không cần phải tìm hiểu, ai có thời gian thì có thể xem.
Các kiểu dữ liệu có “I” tại đầu như là IShell,IModule,IDisplay là các structure được gọi là “interface”. Trong lập trình BREW, việc hiểu về các interface này là cơ bản vấn đề.
object và interface function
BREW API được cung cấp với hình thức các “interface function” tác động tới “object”. Đây là một khái niệm khó. “object” là gì ? “interface function” là gì?
Không có gì khó cả. Trước khi nói về object và interface function trong BREW, ta nói về general architecture của library của ngôn ngữ C.
Ví dụ, hãy xem library cho linked list viết bằng C. Library này cung cấp structure biểu diện linked list và các hàm để điều khiển structure này.
Tại BREW, structure như thế này được gọi là “object”. Và, những hàm số điều khiển data structure được gọi là “interface function”.
Việc thiết kế chương trình theo data structure và những hàm số điều khiển nó, được gọi là “lập trình thiên đối tượng”. Ai đã từng học C++ hay Java chắc đã biết rôi. BREW API là API được thiết kế thiên đối tượng bằng ngôn ngữ C.

Object
Tại BREW, tập hợp của data structure và interface function được gọi là “interface”.

Interface"Object" của BREW còn được gọi là "interface object", hay "instance" hay "interface instance", tất cả đều có nghĩa như nhau.
“Object” tại BREW gần tương đượng với “object” tại Java hay C++, và “interface” của BREW gần tương đương với class của Java và C++.
Ta sẽ giải thích ví dụ cụ thể. Tại lập trình BREW có interface luôn sử dụng là “IShell interface”. IShell object chính là data structure biểu diễn môi trường chạy BREW, IShell interface là tập hợp các hàm điểu khiển môi trường chạy BREW.

Ví dụ, để lấy kích thước màn hình của máy mobile đang chạy BREW, được tiến hànnh như sau. ( AEEDeviceInfo là structure chứa các thông tin của máy mobile. Chi tiết tham khảo [BREW API reference])
static void Square_OnAppStart(AEEApplet* app)
{
IShell* shell;
AEEDeviceInfo devinfo;
int width, height;
// get IShell object
shell = app->m_pIShell;
// sử dụng IShell interface function, lấy kích thước màn hình
ISHELL_GetDeviceInfo(shell, &devinfo);
width = devinfo.cxScreen;
height = devinfo.cyScreen;
}
Một ví dụ khác. Để vẽ màn hình trong BREW ta sử dụng “IDisplay interface”. Interface này có các hàm để vẽ đường thẳng, hình chữ nhật, thiết định màu vẽ.
Ví dụ, để hiển thị khung màu đỏ ra màn hình, ta làm như sau.
static void Square_OnAppStart(AEEApplet* app)
{
IDisplay* disp;
AEERect rect;
RGBVAL red = MAKE_RGB(255, 0, 0);
// get IDisplay object
disp = app->m_pIDisplay;
// vẽ khung hình chữ nhật màu đỏ
rect.x = 20;
rect.y = 20;
rect.dx = 40;
rect.dy = 30;
IDISPLAY_DrawRect(disp, &rect, red, 0, IDF_RECT_FRAME);
// hiển thị thực tế việc vẽ ra màn hình bitmap
IDISPLAY_Update(disp);
}
Tại đây MAKE_RGB(red, blue, green) là macro tạo ra giá trị số (kiểu RGBVAL) hiển thị màu hình thành từ 3 màu gốc red blue green.
Ngoài ra, AEERect là structure biểu diễn hình chữ nhật, được khai báo như dưới đây.
typedef struct
{
int16 x, y;
int16 dx, dy;
} AEERect;
Bạn đã hiểu thêm sâu về interface của BREW chưa ? Tuy nói là interface nhưng không có gì khó, chỉ là đặt tên mới cho những việc mà lập trình viên C đã làm từ trước đến giờ.
Tags: Brew








[...] Some keyword in BREW [...]
Gửi nhận xét: