Bài giảng "Lập trình Windows - Chương 4: Xử lý đồ họa và văn bản" cung cấp cho người học các kiến thức: Cơ chế đồ họa trên Windows – Device Context, lớp CDC và một số lệnh đơn giản; thông điệp WM_PAINT và cửa sổ ảo, xử lý văn bản, ánh xạ khung nhìn. Mời các bạn cùng tham khảo nội dung chi tiết.
Chương Xử lý đồ họa & văn Cơ chế đồ họa Windows – Device Context Lớp CDC số lệnh đơn giản Các đối tượng khác: CPen, CBrush, CRgn,… Thông điệp WM_PAINT cửa sổ ảo Xử lý văn Ánh xạ khung nhìn 4.1 Giới thiệu ngữ cảnh thiết bị Ngữ cảnh thiết bị (Device Context - DC) cấu trúc GDI lưu thông tin cho việc hiển thị văn hình ảnh thiết bị tương thích Nó chứa đựng đối tượng đồ họa nét vẽ, mẫu tô, chế độ đồ họa, Kết Vẽ DC Mỗi đối tượng DC có số hiệu định danh gọi HDC (Handle Device Context) Windows sử dụng số hiệu để xử lý đồ họa HDC kiểu liệu lưu số hiệu ngữ cảnh thiết bị Mỗi cửa sổ có nhiều đối tượng DC khác thời điểm xử lý khác 4.2 Lớp CDC, CClientDC Thư viện MFC cung cấp lớp để xử lý đồ họa CDC (Class Device Context) Lớp bao gói đối tượng HDC hàm API phục vụ đồ họa Chứa lệnh vẽ Lớp CDC GDI Chứa tham số đồ họa DC Xác định DC cửa sổ (dùng bên lớp cửa sổ) CDC * CWnd :: GetDC(); 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ừ xuống Một số lệnh 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 ); 4.3 Một số đối tượng lớp đồ họa Thư viện MFC cung cấp số lớp hỗ trợ đồ họa gồm CPen : cung cấp màu vẽ, gồm thành viê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 thành viên sau: CBrush ( màu ); CBrush ( kiểu, màu ); CRgn : cung cấp vùng giới hạn vẽ, gồm thành viên sau: CreateRectRgn( x1,y1, x2,y2 ); CreateElipticRgn( x1,y1, x2,y2 ); Hộp thoại chọn màu: CColorDialog thư viện gồm hàm sau: CColorDialog( COLORREF màu); int CColorDialog :: DoModal(); { IDOK, IDCANCEL } COLORREF CColorDialog :: GetColor(); Các đối tượng đặt vào DC lệnh CWnd :: SelectObject() 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 4.4 Thơng điệp WM_PAINT Mọi liệu cửa sổ bị có thay đổi cửa sổ Thơng điệp WM_PAINT phát sinh có yêu cầu cập nhật lại nội dung cửa sổ, do: Tác động người dùng thay đổi kích thước, kích hoạt, Gọi hàm CWnd :: Invalidate() CWnd :: UpdateWindow() Để liệu tồn cửa sổ cần phải thực lệnh vẽ hàm xử lý thông điệp Tác động USER Phát sinh thông điệp Lớp cửa sổ - CS WM_PAINT void OnPaint() { } Hiển thị nội dung 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 vẽ Mẫu hàm xử lý thông điệp WM_PAINT sau: afx_msg void OnPaint() { CPaintDC dc( this ); viết lệnh xử lý đồ họa } Lớp CPaintDC kế thừa từ lớp CDC Hàm OnMouseMove( ) Lớp CS có ? Hàm OnLButtonDown( ) Hàm OnLButtonUp( ) Mảng chứa tọa độ điểm vẽ Hàm OnPaint( ) 4.5 Cửa sổ ảo (virtual window) Hiện nội dung cửa sổ phải thực hàm OnPaint() thông điệp WM_PAINT, dù thay đổi nhỏ phải lại toàn nội dung, chiếm nhiều thời gian máy Windows cung cấp chế cửa sổ ảo cho phép lưu toàn nội dung cửa sổ thật thành ảnh, sau chép lên hình cần thiết Minh họa sau: Vẽ lên cửa sổ thật lưu vào cửa sổ ảo Bộ nhớ RAM Lưu ảnh Hiện lại nội dung 4.5 Cửa sổ ảo (virtual window) Các bước tạo cửa sổ ảo: B1) Khai báo 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 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 trình vẽ thực cửa sổ ảo qua memDC, sau chép ảnh từ cửa sổ ảo lên cửa sổ thật hình (thường hàm OnPaint) lệnh sau: DC-thật BitBlt( x,y, width,height, memDC, Xsrc, Ysrc, chế-độ ); 4.6 Xử lý văn Lớp CDC cung cấp số lệnh xử lý văn gồm: SetTextColor( COLORREF màu-chữ); 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 to all) lfFaceName(tên phông chữ); 10 4.6 Xử lý văn Để xử lý với phông chữ sử dụng lớp CFont, chứa cấu trúc chữ, kiểu chữ để hiển thị cửa sổ, gồm hàm sau: CFont :: CreateFont( ) CFont :: CreateFontIndirect( LOGFONT *lf ); Hộp thoại phơng chữ bao gói lớp CFontDialog gồm: CFontDialog :: CFontDialog( LPLOGFONT lf=NULL ); int CFontDialog :: DoModal(); { IDOK, IDCANCEL } CFontDialog :: GetCurrentFont( LPLOGFONT lf ); Con trỏ văn (caret) xử lý lệnh sau: CWnd :: ShowCaret(); CWnd :: HideCaret(); CWnd :: SetCaretPos( POINT p ); CPoint CWnd :: GetCaretPos(); CWnd :: CreateCaret( CBitmap *bmp ); Đối tượng ảnh bitmap 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ẽ cửa sổ đơn vị lơgíc, thiết bị tính theo đơn vị vật lý (point), thiết lập ánh xạ hai đơn vị lệnh sau: int CDC :: SetMapMode( mode ); 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 MM_TEXT) tọa độ vẽ giống tọa độ đề các, gốc góc trái (chiều Y tăng từ 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 độ cửa sổ: CDC :: SetViewportExt( cx, cy ); CDC :: SetViewportOrg( x,y ); (tọa độ, kích thước đơn vị vật lý - device point) Hàm chuyển đổi đơn vị lơgíc 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 độ 13 ... Thư viện MFC cung cấp lớp để xử lý đồ họa CDC (Class Device Context) Lớp bao gói đối tượng HDC hàm API phục vụ đồ họa Chứa lệnh vẽ Lớp CDC GDI Chứa tham số đồ họa DC Xác định DC cửa sổ (dùng... CreateCompatibleDC( DC-cửa-sổ-thật ); memBM CreateCompatibleBitmap( DC-thật, width, height ); memDC SelectObject( &memBM ); B3) Tạo cửa sổ ảo memBR CreateSolidBrush( màu-nền-cửa-s? ?-? ??o ); memDC SelectObject(... HDC (Handle Device Context) Windows sử dụng số hiệu để xử lý đồ họa HDC kiểu liệu lưu số hiệu ngữ cảnh thiết bị Mỗi cửa sổ có nhiều đối tượng DC khác thời điểm xử lý khác 4.2 Lớp CDC, CClientDC