Device context HDC Pen HPEN: sử dụng để vẽ đường thẳng, đường cong, đường tròn, hcn, ellipse,... Font HFONT: sử dụng cho chữ Palette HPALETTE: xử dụng để quản lý bảng màu của thi
Trang 1Đại Học Sư Phạm Tp Hồ Chí Minh
Thư viện đồ họa GDI
(Graphics Device Interface)
Lập trình đồ họa với thư viện GDI
Trang 3Device Context - DC
DC là một đối tượng của Windows lưu trữ thông tin chi tiết về phần cứng.
GDI cho phép sử dụng tọa độ logic và hệ thống màu RGB.
Device context (HDC)
Pen (HPEN): sử dụng để vẽ đường thẳng, đường cong, đường tròn, hcn, ellipse,
Brush (HBRUSH): dùng để tô hình tròn, HCN, Ellipse, polygon,
Font (HFONT): sử dụng cho chữ
Palette (HPALETTE): xử dụng để quản lý bảng màu của thiết bị
Bitmap (HBITMAP): sử dụng để quản lý hình ảnh
Region ( HRGN): quản lý các vùng đối tượng không chính tắc
Trang 4Quan hệ giữa GDI, handle và Class MFC
DC (HDC) : CDC, CClientDC, CWindowDC,…
Pen (HPEN): CPen
Brush (HBRUSH): CBrush
Font (HFONT): CFont
Palette (HPALETTE): CPalette
Bitmap (HBITMAP): Cbitmap
Region ( HRGN): CRegion
Trang 5Optaining DC
Gọi hàm CWnd::GetDC()
Khai báo biến CClientDC dc(this), CClientDC được sử dụng để vẽ
các đối tượng trong vùng Client của cửa sổ
Khai báo biến CWindowDC dc(this), CWindowDC được sử dụng để
vẽ các đối tượng trên toàn cửa sổ (client và none-client)
Trong MFC, sử dụng CView::OnDraw() để vẽ các đối tượng,
OnDraw sẽ tự động call khi cửa sổ cần Update
Nếu chúng ta biết thông tin, chúng ta có thể tạo biến DC riêng
Trang 6Sử dụng DC với các đối tượng GDI
Tạo DC để vẽ các đối tượng
Tạo đối tượng GDI tương ứng (Pen, Brush,…)
Gán đối tượng GDI cho DC
Vẽ đối tượng
Gán đối tượng DC cũ (trước khi chọn đối tượng trong DC)
Hủy các đối tượng GDI đã tạo trong bước 2
Các bước thực hiện
Trang 7A XOR B XOR B = A XOR (B XOR B) = A XOR 0 = A
A là màu gốc, B là màu mới
Bảng mô tả mode trong vẽ
R2_xxxx:
R2_XORPEN: P ^ O
R2_NOTXORPEN: ~ (P ^ O)
R2_COPYPEN: ~ O, màu của Pen
R2_NOTCOPYPEN: ~ P ngược với màu của P
Trong đó P màu vẽ, O là màu gốc, B màu đen, W màu trắng
NOT : ~, AND &, OR |, XOR ^.
Trang 8Pen - Bút vẽ
BOOL CPen::CreatePen(int nPenStyle, int nWidth, COLORREF color)
nPenStyle: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_
DASHDOTDOT, PS_NULL,…
nWidth: độ dày của nét, nếu style <> PS_SOLID thì độ dày không thể vượt quá 1
color: màu của nét vẽ, sử dụng Macro RGB()
Trang 9- Click chuột trái lên vùng Client chọn điểm bắt đầu P1 Æ MouseDown
- Giữ chuột và di chuyển đến điểm cuối P2
- Bỏ click chuột Æ MouseUp
- Vẽ đường thẳng từ vị trí P1 đến P2
Trang 11Xử lý sự kiện OnDraw
- Hàm Invalidate() được gọi
- Ứng dụng nhận được thông điệp WM_PAINT yêu cầu vẽ lại màn hình
- Khi gọi hàm Invalidate() hay ứng dụng nhận thông điệp WM_PAINT , toàn bộ nội
dung trong màn hình ứng dụng sẽ bị xóa Vì vậy cần phải vẽ lại toàn bộ các đối
tượng trên màn hình
- Trong hàm OnDraw : chúng ta sẽ thực hiện vẽ lại toàn bộ các đối tượng trên màn
hình
Trang 13Brush - Chổi tô
BOOL CBrush::CreateSolidBrush(COLORREF color)
Tạo chổi tô “đặc” với màu là Color
BOOL CBrush::CreateHatchBrush(int style, COLORREF color)
Tạo chổi tô có kiểu “style” với màu là Color
BOOL CBrush::CreatePatternBrush(Cbitmap *bmp)
Tạo chổi tô có kiểu “bitmap”
Trang 14- Click chuột trái lên vùng Client chọn điểm bắt đầu P1 Æ MouseDown
- Giữ chuột và di chuyển đến điểm cuối P2
- Bỏ click chuột Æ MouseUp
- Vẽ hình chữ nhật từ điểm P1 (left,top) đến P2 (right, bottom)
Trang 16C ác đối tượng GDI khác
Trang 17(r.right,r.bottom)
Trang 19RoundRect (tt)
Trang 22PIE (tt)
Trang 23Polygon
Trang 26Polygon (tt)
Trang 28Polygon (tt)
Trang 29pts[0] = CPoint(300,20); pts[1] = CPoint(400,100); pts[2] = CPoint(550,100);
pts[3] = CPoint(550,300); pts[4] = CPoint(50,300); pts[5] = CPoint(50,100);
Trang 30Polygon (tt)
Trang 31BOOL CDC::PolyBezier(LPPOINT lpPoints,int nCount);
Cần ít nhất 4 điểm để vẽ đường cong
Trang 32pts[0] = CPoint(300,20); pts[1] = CPoint(400,100); pts[2] = CPoint(550,100);
pts[3] = CPoint(550,300); pts[4] = CPoint(50,300); pts[5] = CPoint(50,100);
Trang 33Curve
Trang 35Curve
Trang 38FloodFill (tt)
Trang 39Pattern Brush
BOOL CBrush.CreatePatternBrush(CBitmap *bitmap);
Trang 40Pattern Brush
Trang 42XỬ LÝ FONT
Trang 43TẠO ĐỐI TƯỢNG FONT
Cú pháp
BOOL CFont::CreateFont
(
int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename
);
BOOL CFont::CreateFontIndirect(const LOGFONT *lpLogFont);
Trang 46LẤY FONT HIỆN HÀNH TRONG DC
Trang 47CHỌN FONT TỪ HỘP THOẠI CFontDialog
Trang 48CHỌN FONT TỪ HỘP THOẠI CFontDialog
Trang 49KHỞI TẠO HỘP THOẠI CFontDialog
}}
Trang 50LẤY KẾT QUẢ TỪ HỘP THOẠI CFontDialog
szStr+="\nFace Name: ";
szStr+=dlg.GetFaceName();
if(dlg.IsItalic() == TRUE)szStr+="\nFont is italic";
if(dlg.IsUnderline() == TRUE)szStr+="\nFont is underlined";
if(dlg.IsStrikeOut() == TRUE)szStr+="\nFont is strike out";
if(dlg.IsBold())szStr+="\nFont is bolded";
AfxMessageBox(szStr);
}
}
Trang 51SETFONT CHO EDIT TEXT TỪ KẾT QUẢ CFontDialog
delete pFont;return;
}CEdit *myEdit;
Trang 52SET MÀU CHỮ - OnCtlColor
HBRUSH CSetFontTextBoxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
//m_clrColor = RGB(0,0,255);
if(nCtlColor == CTLCOLOR_EDIT)
{
if(pWnd->GetDlgCtrlID() == IDC_EDIT1){
pDC->SetBkColor(RGB(255,0,0));
pDC->SetTextColor(m_clrColor);
}}
// TODO: Return a different brush if the default is not desired
return hbr;
}
Trang 53SET MÀU CHỮ - OnCtlColor
CTLCOLOR_BTN Button control
CTLCOLOR_DLG Dialog box
CTLCOLOR_EDIT Edit control
CTLCOLOR_LISTBOX List-box control
CTLCOLOR_MSGBOX Message box
CTLCOLOR_SCROLLBAR Scroll-bar control
CTLCOLOR_STATIC Static control
Trang 54HIỂN THỊ VĂN BẢN VỚI CFONT
void CGDIView::OnDraw(CDC* pDC)
{
CFont *ptrFt; CFont *ptrFtOld; CRect rect; LOGFONT logFont;
CGDIDoc* pDoc=GetDocument(); ASSERT_VALID(pDoc);
ptrFt=pDoc->GetCurrentFont();
ASSERT(ptrFt != NULL);
if(ptrFt->GetSafeHandle() != NULL){
pDC->TextOut(rect.Width()/4, rect.Height()/4, logFont.lfFaceName);
if(ptrFt->GetSafeHandle() != NULL)pDC->SelectObject(ptrFtOld);
}