Bài giảng Lập trình Windows: Chương 4 - Xử lý đồ họa & văn bản
lượt xem 4
download
Nội dung chính của chương 4 Xử lý đồ họa & văn bản của bài giảng lập trình Windows trình bày về 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.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Lập trình Windows: Chương 4 - Xử lý đồ họa & văn bản
- 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 1
- 4.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,... Kết quả Vẽ DC 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. 2
- 4.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 Chứa các Lớp CDC Chứa các tham lệnh vẽ số đồ họa GDI DC 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 ); 3
- 4.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(). 4
- 4.3. Một số đối tượng lớp đồ họa... SelectObject(...) Tô màu đỏ DC cửa sổ Vẽ màu xanh Giới hạn nhìn thấy 5
- 4.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. Tác động Phát sinh Lớp cửa sổ - CS của USER thông điệp WM_PAINT void OnPaint() { ... } Hiển thị nội dung 6
- 4.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. Hàm OnMouseMove(...) Hàm OnLButtonDown(...) Lớp CS có ? Hàm OnLButtonUp(...) Mảng chứa tọa độ Hàm OnPaint(...) các điểm đã vẽ 7
- 4.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: Vẽ lên cửa sổ thật và lưu vào cửa sổ ảo Bộ nhớ RAM Lưu ảnh Hiện lại nội dung 8
- 4.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ế-độ ); 9
- 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ữ); 10
- 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 ); 11
- 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). +Y MoveTo(0,0) +X Độ dài 50 mili LineTo(4000,-3000) -Y 12
- 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 ); Điểm vẽ lôgíc Độ cao vật lý theo chế độ ánh xạ Gốc tọa độ mới 13
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Lập trình Window: Chương 6 - Phan Trọng Tiến
35 p | 167 | 20
-
Bài giảng Lập trình Windows - Chương 3: Lập trình giao diện
196 p | 102 | 18
-
Bài giảng Lập trình Window: Chương 8 - Phan Trọng Tiến
45 p | 101 | 17
-
Bài giảng Lập trình Window: Chương 5 - Phan Trọng Tiến
42 p | 107 | 11
-
Bài giảng Lập trình Windows: Chương 4 - Lập trình đồ họa với thư viện GDI (Graphics Device Interface)
47 p | 123 | 9
-
Bài giảng Lập trình Window: Chương 4 - Phan Trọng Tiến
26 p | 95 | 8
-
Bài giảng Lập trình Windows - Chương 3: Lập trình C++ trên Windows (2016)
16 p | 74 | 8
-
Bài giảng Lập trình Windows - Chương 2: Lập trình với cửa sổ bằng API (2016)
10 p | 85 | 8
-
Bài giảng Lập trình Windows - Chương 1: Tổng quan lập trình Windows (2016)
6 p | 151 | 8
-
Bài giảng Lập trình Windows: Chương 2 - Giới thiệu về MFC, Visual C++ 6.0
61 p | 114 | 8
-
Bài giảng Lập trình Windows: Chương 1 - Một số khái niệm cơ bản
56 p | 126 | 6
-
Bài giảng Lập trình Windows - Chương 8: Lập trình đa luồng (2016)
9 p | 84 | 6
-
Bài giảng Lập trình Windows - Chương 4: Xử lý đồ họa và văn bản (2016)
13 p | 74 | 5
-
Bài giảng Lập trình Windows - Chương 5: Lập trình tài nguyên (2016)
16 p | 73 | 5
-
Bài giảng Lập trình Windows - Chương 6: Lập trình File & Print (2016)
7 p | 75 | 5
-
Bài giảng Lập trình Windows - Chương 9: Lập trình thư viện động (2016)
9 p | 77 | 5
-
Bài giảng Lập trình Windows - Chương 10: Lập trình Hook (2016)
6 p | 61 | 4
-
Bài giảng Lập trình Windows: Chương 3 - Dialog Box - Common Dialog - Property Sheet
25 p | 76 | 3
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn