Đại Học Sư Phạm Tp. Hồ Chí Minh
Khoa Toán – Tin Học
LẬP TRÌNH WINDOWS
Thư viện đồ họa GDI
(Graphics Device Interface)
Trần Ngọc Bảo
Email:
Lập trình đồ họa với thư viện GDI
Tran Ngoc Bao 2 Dai hoc Su Pham TP.HCM
NỘI DUNG
Xử lý sự kiện OnDraw
Draw Mode
Giới thiệu
Device Context
Các đối tượngGDI
Quan hệ giữa các đối tượng GDI, handle và Class MFC
Optaining DC
Sử dụng DC với các đối tượng GDI
Tran Ngoc Bao 3 Dai hoc Su Pham TP.HCM
Device Context - DC
Device context
Các đối tượng GDI
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
Cú pháp:
int CDC::SetR2(nDrawStyle)
Toán tử : XOR, AND, OR, NOT
Phép toán XOR
A 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 ^.
Tran Ngoc Bao 8 Dai hoc Su Pham TP.HCM
Pen - Bút vẽ
Tạo 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()
Tran Ngoc Bao 9 Dai hoc Su Pham TP.HCM
Sử dụng bút vẽ để vẽ đường thẳng
Xử lý sự kiện MouseDown
void CGUISampleView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_ptStart = point;
CView::OnLButtonDown(nFlags, point);
}
- 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
Tran Ngoc Bao 12 Dai hoc Su Pham TP.HCM
Xử lý sự kiện OnDraw (tt)
void CGUISampleView::OnDraw(CDC* pDC)
{
CGUISampleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CPen pen, *ptrPenOld;
int nMode;
//Tạo bút vẽ
pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
ptrPenOld = pDC->SelectObject(&pen);
//Set Mode vẽ
nMode = pDC->SetROP2(R2_COPYPEN);
//Vẽ đường thẳng
pDC->MoveTo(m_ptStart);
pDC->dc.LineTo(m_ptEnd);
//Giải phóng bút vẽ
pDC->SetROP2(nMode);//Set lại mode cũ
pDC->SelectObject(ptrPenOld);
}
Tran Ngoc Bao 13 Dai hoc Su Pham TP.HCM
Brush - Chổi tô
Tạo Brush
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
CRect r(m_ptStart.x,m_ptStart.y, m_ptEnd.x,m_ptEnd.y);
pDC->Rectangle(r);
dc.SetROP2(nMode);//Set lai mode
dc.SelectObject(ptrPenOld);
pDC->SelectObject(ptrBrushOld);
brush.Detach();
}
Tran Ngoc Bao 16 Dai hoc Su Pham TP.HCM
Các đối tượng GDI khác
Chọn và di chuyển đối tượng
Bitmap
Các đối tượng khác
RoundRect
Pie
Polygon
Curve
FloodFill
Pattern Brush
Font
Tran Ngoc Bao 17 Dai hoc Su Pham TP.HCM
RoundRect
Cú pháp
BOOL CDC::RoundRect(CRect r,CPoint p);
p.y
p.x
(r.left,r.top)
(r.right,r.bottom)
Tran Ngoc Bao 18 Dai hoc Su Pham TP.HCM
RoundRect (tt)
void CDrawingView::DrawFocusRect(CDC *pDC)
CClientDC dc(this);
CPen pen, *ptrPenOld;
int nMode;
pen.CreatePen(PS_SOLID,3,RGB(255,0,255));
ptrPenOld = dc.SelectObject(&pen);
CBrush brush;
CBrush *ptrBrushOld;
brush.CreateHatchBrush(HS_DIAGCROSS,RGB(255,255,0));
ptrBrushOld = dc.SelectObject(&brush);
nMode = dc.SetROP2(R2_COPYPEN);
dc.Pie(CRect(100,50,500,300),CPoint(10,50),CPoint(200,50));
dc.SetROP2(nMode);//Set lai mode
dc.SelectObject(ptrPenOld);
dc.SelectObject(ptrBrushOld);
brush.Detach();
}
Tran Ngoc Bao 22 Dai hoc Su Pham TP.HCM
PIE (tt)
Tran Ngoc Bao 23 Dai hoc Su Pham TP.HCM
Polygon
Tran Ngoc Bao 24 Dai hoc Su Pham TP.HCM
Polygon
Cú pháp
BOOL CDC::Polygon(LPPOINT lpPoints,int nCount);
P[0]
P[1]
P[2]
P[3]
P[4]
P[5]