6.1 DC VAØ BITMAP:
Vấn đề trang trí thiết bị đồ họa được tiến hành thông qua đối tượng DC quản lý thiết bị, trên cơ sở khai thác chức năng các công cụ GDI liên quan. Kết quả trang trí trên DC được quản lý bởi đối tượng Bitmap mà DC đang sử dụng. Bitmap là công cụ làm nền không thể thiếu cho các DC.
Việc khởi tạo nội dung cho đối tượng bitmap trong ứng dụng có thể được thực hiện bằng cách lấy ảnh bitmap từ resource (LoadBitmap) hay tạo mới nội dung cho bitmap dựa trên một DC xác định (CreateCompatibleBitmap).
Thông thường, ứng dụng đồ họa phải chuẩn bị sẵn các ảnh cần thiết trong resource của ứng dụng. Ở phần xử lý, các resource này được tải vào bộ nhớ làm nội dung cho các đối tượng bitmap. Từ các đối tượng bitmap này, ảnh sẽ được vẽ lên các thiết bị hiển thị đồ họa thông qua đối tượng DC tương ứng. 6.2 ỨNG DỤNG VỚI CỬA SỔ CHÍNH HIỂN THỊ ẢNH:
Trong phần này ta thực hiện ứng dụng có chức năng hiển thị một ảnh xác định trong vùng client của cửa sổ chính. Các bước tiến hành dự án như sau:
Tạo dự án VD07 tương tự dự án VD06.
Tạo một ảnh bitmap trong resource với số hiệu là IDB_MYPICT: Nội dung ảnh này có thể được tạo mới hoàn toàn hoặc lấy từ nội dung của một tập tin bitmap (.bmp) đã có. Chọn một trong hai cách sau:
• Cách 1 – ảnh bitmap được tạo mới: Tương tự tạo mới icon (2.8).
• Cách 2 – ảnh bitmap được lấy từ nội dung tập tin bitmap (.bmp): - Chọn trang ResourceView trong màn hình Workspace. - Right-click trên Project Resource:
- Chọn Insert:
Ứng dụng công cụ GDI 61
- Chọn Bitmap, Import. Sau đó chọn tập tin chứa ảnh bitmap thông qua hộp hội thoại File-Folder.
- Ấn định các thông số của bitmap (số hiệu là IDB_MYPICT).
Bổ sung đối tượng thuộc tính m_myPict kiểu CBitmap cho CEmpWnd: - Chọn trang ClassView trong màn hình Workspace của dự án. - Right-click trên tiêu đề của lớp CEmpWnd:
- Chọn Add Member Variable… :
- Nhập các thông tin về kiểu, tên và loại của thuộc tính. Chọn OK.
Dùng hành vi OnCreate của CEmpWnd để lấy ảnh bitmap từ resource làm nội dung của m_myPict. Xử lý được cài đặt như sau:
62 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.comint CEmpWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) int CEmpWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) {
if (CWnd::OnCreate(lpCreateStruct) == -1) return -1;
// Khởi động bitmap từ bitmap resource IDB_MYPICT mypict.LoadBitmap( IDB_MYPICT );
return 0; }
Dùng hành vi OnPaint của CEmpWnd, vẽ ảnh bitmap trong m_myPict thông qua hành vi DrawState của đối tượng CPaintDC dc.
void CEmpWnd::OnPaint() {
CPaintDC dc(this); RECT rect;
GetClientRect( &rect ); // Kích thước vùng client // draw on client
dc.DrawState ( CPoint(0,0), /* Góc trái trên của ảnh */
CSize (rect.right-rect.left, rect.bottom-rect.top), &m_myPict, DST_BITMAP);
}
Hành vi OnDestroy của CEmpWnd giải phóng đối tượng m_myPict. void CEmpWnd::OnDestroy()
{
CWnd::OnDestroy(); m_myPict.DeleteObject(); }
Lưu ý: Để xử lý trang trí đồ họa trong vùng client của cửa sổ giao diện không gây ra hiện tượng "chớp", ta có thể sử dụng một số giải pháp sau:
- Không sử dụng đối tượng brush cho cửa sổ liên quan: Dùng giá trị NULL cho tham số này trong hành vi khởi tạo thông số của đối tượng cửa sổ. - Dùng tham số FALSE cho yêu cầu cập nhật vùng client của cửa sổ (5.4.2) - Dùng một DC trong bộ nhớ làm công cụ trang trí trung gian. Thực hiện các
nội dung trang trí cần thiết lên DC này. Sau khi hoàn tất các tác vụ trang trí cần thiết thì chuyển nội dung DC công cụ lên DC của màn hình.
6.3 SAO CHÉP ẢNH TỪ DC VAØO DC, PHÓNG TO & THU NHỎ ẢNH:
Ứng dụng công cụ GDI 63
Đối tượng DC cho phép sao chép lại nội dung trang trí đồ họa trên thiết bị hiển thị đồ họa được quản lý bởi một đối tượng DC khác lên thiết bị hiển thị đồ họa được quản lý bởi chính nó thông qua một số hành vi sau:
- BitBlt : Sao chép và giữ nguyên tỷ lệ trong nội dung ảnh. - StretchBlt : Sao chép và thay đổi tỷ lệ trong nội dung ảnh. Trong phần này ta xây dựng ứng dụng có các đặc điểm sau:
- Cửa sổ chính của ứng dụng có thể thay đổi kích thước.
- Nội dung ảnh hiển thị trong vùng client của cửa sổ tự động thay đổi kích thước một cách phù hợp khi kích thước cửa sổ thay đổi.
Việc thực hiện cần lưu ý các bước sau:
- Cửa sổ chính của ứng dụng có thuộc tính WS_THICKFRAME.
- Dùng một DC ảo để lồng ảnh bitmap thông qua đối tượng CBitmap. Vẽ ảnh bitmap từ DC này lên DC hiển thị.
Các bước thực hiện như sau:
Tạo dự án VD08 tương tự dự án VD07.
Hành vi OnPaint của CEmpWnd sử dụng DC trong bộ nhớ để lồng ảnh bitmap, từ đó vẽ lên vùng client của cửa sổ. Xử lý cài đặt như sau: void CEmpWnd::OnPaint()
{ CPaintDC dc(this); RECT rt; CDC memDC; CBitmap *oldBmp; BITMAP bmpInfo;
GetClientRect(&rect); // Kích thước vùng client mypict.GetBitmap(&bmpInfo); // Lấy thông tin của ảnh bitmap memDC.CreateCompatibleDC(&dc);
// Lồng bitmap m_myPict vào memDC và lưu lại bitmap cũ của nó. oldBmp = memDC.SelectObject(&m_myPict);
// Chép ảnh từ memDC lên DC quản lý vùng client của cửa sổ: dc dc.StretchBlt( 0, 0, rt.right-rt.left, rt.bottom-rt.top, &memDC,
0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
SRCCOPY);
// Phục hồi ảnh bitmap cũ của memDC
memDC.SelectObject(oldBmp); memDC.DeleteDC(); } // Xem VD08