Bài giảng Lập trình Windows - Chương 4: Xử lý đồ họa & văn bản
Cơ chế đồ họa trên Windows – Device Context Lớp CDC và một số lệnh đơn giản Các đối tượng khác: CPen, CBrush, CRgn,… Thông điệp WM_PAINT và cửa sổ ảo Xử lý văn bản Ánh xạ khung nhìn
Bạn đang xem nội dung tài liệu Bài giảng Lập trình Windows - Chương 4: Xử lý đồ họa & văn bản, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
1Chương 4. Xử lý đồ họa & văn bản
Cơ chế đồ họa trên Windows – Device Context
Lớp CDC và một số lệnh đơn giản
Các đối tượng khác: CPen, CBrush, CRgn,
Thông điệp WM_PAINT và cửa sổ ảo
Xử lý văn bản
Ánh xạ khung nhìn
24.1. Giới thiệu ngữ cảnh thiết bị
Ngữ cảnh thiết bị (Device Context - DC) là một cấu trúc GDI lưu thông tin
cho việc hiển thị văn bản và hình ảnh trên thiết bị ra tương thích. Nó chứa
đựng các đối tượng đồ họa như nét vẽ, mẫu tô, chế độ đồ họa,...
Mỗi đối tượng DC có một số hiệu định danh gọi là HDC (Handle Device
Context). Windows sử dụng số hiệu này để xử lý đồ họa.
HDC là một kiểu dữ liệu lưu số hiệu ngữ cảnh thiết bị.
Mỗi cửa sổ có thể có nhiều đối tượng DC khác nhau tại những thời điểm
xử lý khác nhau.
DC
VẽKết quả
34.2. Lớp CDC, CClientDC
Thư viện MFC cung cấp một lớp để xử lý đồ họa là CDC (Class Device Context).
Lớp này bao gói đối tượng HDC và các hàm API phục vụ đồ họa
Xác định DC của một cửa sổ (dùng bên trong lớp cửa sổ)
CDC * CWnd :: GetDC(); hoặc CDC * CWnd :: GetWindowDC();
CClientDC object ( this );
Hệ tọa độ gốc ở góc trái trên, trục X từ trái sang phải, Y từ trên xuống
Một số lệnh cơ bản trên CDC
MoveTo( x,y ); LineTo( x,y ); Ellipse( x1,y1, x2,y2 ); Rectangle( x1,y1, x2,y2 );
SetROP2( R2_NOT / R2_MASKPEN/... ); AngleArc( x,y, r, start, sweep );
Polyline( LPPOINT , count ); FloodFill( x,y, color );
GDI DC
Lớp CDCChứa các
lệnh vẽ
Chứa các tham
số đồ họa
44.3. Một số đối tượng lớp đồ họa
Thư viện MFC cung cấp một số lớp hỗ trợ đồ họa gồm
CPen : cung cấp màu vẽ, gồm các thành viên cơ bản sau:
CPen( kiểu, độ-dày, màu ); kiểu{PS_SOLID, PS_DOT, PS_DASH,...}
CBrush : cung cấp chế độ tô nền, gồm các thành viên cơ bản sau:
CBrush ( màu );
CBrush ( kiểu, màu );
CRgn : cung cấp vùng giới hạn vẽ, gồm các thành viên cơ bản sau:
CreateRectRgn( x1,y1, x2,y2 );
CreateElipticRgn( x1,y1, x2,y2 );
Hộp thoại chọn màu: CColorDialog trong thư viện gồm các
hàm sau:
CColorDialog( COLORREF màu);
int CColorDialog :: DoModal(); { IDOK, IDCANCEL }
COLORREF CColorDialog :: GetColor();
Các đối tượng trên được đặt vào DC bởi lệnh CWnd :: SelectObject().
54.3. Một số đối tượng lớp đồ họa...
DC cửa sổ
SelectObject(...)
Vẽ màu xanh
Tô màu
đỏ
Giới hạn
nhìn thấy
64.4. Thông điệp WM_PAINT
Mọi dữ liệu hiện trên cửa sổ sẽ bị mất nếu có sự thay đổi trên cửa sổ đó.
Thông điệp WM_PAINT được phát sinh khi có yêu cầu cập nhật lại nội
dung trên cửa sổ, do:
Tác động của người dùng như thay đổi kích thước, kích hoạt,...
Gọi hàm CWnd :: Invalidate() hoặc CWnd :: UpdateWindow().
Để dữ liệu luôn tồn tại trên cửa sổ cần phải thực hiện mọi lệnh hiện và vẽ
chỉ trong hàm xử lý thông điệp này.
void OnPaint()
{
...
}
WM_PAINT
Tác động
của USER
Phát sinh
thông điệp
Hiển thị
nội dung
Lớp cửa sổ - CS
74.4. Thông điệp WM_PAINT...
Trong hàm xử lý thông điệp WM_PAINT phải sử dụng đối tượng lớp
CPaintDC thay cho lớp CDC thông thường để thực hiện vẽ.
Mẫu hàm xử lý thông điệp WM_PAINT như sau:
afx_msg void OnPaint()
{
CPaintDC dc( this );
... viết các lệnh xử lý đồ họa ...
}
Lớp CPaintDC được kế thừa từ lớp CDC.
Lớp CS có ?
Hàm OnMouseMove(...)
Hàm OnPaint(...)
Hàm OnLButtonDown(...)
Hàm OnLButtonUp(...)
Mảng chứa tọa độ
các điểm đã vẽ
84.5. Cửa sổ ảo (virtual window)
Hiện nội dung trên cửa sổ phải thực hiện trong hàm OnPaint() của thông
điệp WM_PAINT, dù chỉ một thay đổi rất nhỏ cũng phải hiện lại toàn bộ nội
dung, chiếm khá nhiều thời gian trên máy.
Windows cung cấp một cơ chế cửa sổ ảo cho phép lưu toàn bộ nội dung
cửa sổ thật thành một bức ảnh, sau đó chép lên màn hình khi cần thiết.
Minh họa như sau:
Bộ nhớ RAM
Lưu ảnh
Hiện lại nội dung
Vẽ lên cửa sổ thật
và lưu vào cửa sổ ảo
94.5. Cửa sổ ảo (virtual window)...
Các bước tạo cửa sổ ảo:
B1) Khai báo các biến cho cửa sổ ảo
CDC memDC;
CBitmap memBM;
CBrush memBR;
B2) Tạo DC cửa sổ ảo lưu ảnh bitmap cho cửa sổ thật
memDC . CreateCompatibleDC( DC-cửa-sổ-thật );
memBM . CreateCompatibleBitmap( DC-thật, width, height );
memDC . SelectObject( &memBM );
B3) Tạo nền cửa sổ ảo
memBR . CreateSolidBrush( màu-nền-cửa-sổ-ảo );
memDC . SelectObject( &memBR );
memDC . PatBlt( 0,0, width, height, PATCOPY );
B4) Mọi quá trình vẽ đều thực hiện trên cửa sổ ảo qua memDC, sau đó sẽ chép ảnh
từ cửa sổ ảo lên cửa sổ thật màn hình (thường trong hàm OnPaint) bằng lệnh sau:
DC-thật . BitBlt( x,y, width,height, memDC, Xsrc, Ysrc, chế-độ );
10
4.6. Xử lý văn bản
Lớp CDC cung cấp một số lệnh xử lý văn bản gồm:
SetTextColor( COLORREF màu-chữ); và GetTextColor();
SetBkColor(màu); GetBkColor(); SetBkMode(
TRANSPARENT/OPAQUE);
TextOut( x,y, vb, len );
DrawText( LPCTSTR vb, int len, LPRECT rect, UINT format );
format={DT_LEFT/..., DT_VCENTER, DT_SINGLELINE,
DT_CALCRECT,...}
CSize GetTextExtent( xâu, độ-dài );
Cấu trúc mô tả TEXTMETRIC, kiểu LOGFONT:
lfHeight(cao); lfWidth(rộng);
lfOrientation; lfWeight; lfItalic; lfUnderline; lfStrikeOut; lfEscapement;
lfCharSet; lfOutPrecision; lfClipPrecision; lfQuality; lfPitchAndFamily;
(set 0 to all)
lfFaceName(tên phông chữ);
11
4.6. Xử lý văn bản...
Để xử lý với phông chữ chúng ta sử dụng lớp CFont, chứa cấu trúc chữ,
kiểu chữ để hiển thị trên cửa sổ, gồm các hàm sau:
CFont :: CreateFont( ... )
CFont :: CreateFontIndirect( LOGFONT *lf );
Hộp thoại phông chữ được bao gói bởi lớp CFontDialog gồm:
CFontDialog :: CFontDialog( LPLOGFONT lf=NULL );
int CFontDialog :: DoModal(); { IDOK, IDCANCEL }
CFontDialog :: GetCurrentFont( LPLOGFONT lf );
Con trỏ văn bản (caret) được xử lý bởi các lệnh sau:
CWnd :: ShowCaret(); và CWnd :: HideCaret();
CWnd :: SetCaretPos( POINT p ); và CPoint CWnd :: GetCaretPos();
CWnd :: CreateCaret( CBitmap *bmp );
Đối tượng ảnh bitmap được nạp từ tài nguyên qua lớp CBitmap sau
CBitmap :: LoadBitmap( ID_bitmap );
12
4.7. Chế độ ánh xạ & khung nhìn
Đơn vị vẽ trên cửa sổ là đơn vị lôgíc, thiết bị tính theo đơn vị vật lý (point),
chúng ta có thể thiết lập ánh xạ giữa hai đơn vị này bằng lệnh sau:
int CDC :: SetMapMode( mode ); các chế độ ánh xạ mode gồm
MM_TEXT – chế độ ánh xạ 1lôgíc=1point,
MM_HIENGLISH – 1lôgíc=0.001point,
MM_HIMETRIC – 1lôgíc=0.01mili,
MM_LOENGLISH – 1lôgíc=0.01inc,
MM_LOMETRIC – 1lôgíc=0.1mili,...
Với chế độ ánh xạ người dùng (không là MM_TEXT) thì tọa độ vẽ giống
tọa độ đề các, gốc ở góc trái trên (chiều Y tăng từ dưới lên).
MoveTo(0,0)
LineTo(4000,-3000)Độ dài 50 mili
+X
+Y
-Y
13
4.7. Chế độ ánh xạ & khung nhìn...
Chế độ ánh xạ MM_ISOTROPIC cho phép quy định lại khung nhìn, gốc tọa
độ trên cửa sổ:
CDC :: SetViewportExt( cx, cy );
CDC :: SetViewportOrg( x,y ); (tọa độ, kích thước là đơn vị vật lý - device point)
Hàm chuyển đổi giữa đơn vị lôgíc và vật lý:
CDC :: DPtoLP( LPPOINT , count );
CDC :: LPtoDP( LPPOINT , count );
Gốc tọa độ mới
Điểm vẽ lôgíc
Độ cao vật lý theo
chế độ ánh xạ