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

pdf13 trang | Chia sẻ: lylyngoc | Lượt xem: 1585 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu 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ạ