Download miễn phí Bài giảng Lập trình windows - Lập trình đồ họa với thư viện GDI
Sử dụng bút vẽ để vẽ hình chữ nhật
Yêu cầu:
- 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ểmP1 (left,top) đến P2 (right, bottom)
http://cloud.liketly.com/flash/edoc/jh2i1fkjb33wa7b577g9lou48iyvfkz6-swf-2014-02-25-bai_giang_lap_trinh_windows_lap_trinh_do_hoa_voi.fYoRR01e8W.swf /tai-lieu/de-tai-ung-dung-tren-liketly-59008/
Để tải bản Đầy Đủ của tài liệu, xin Trả lời bài viết này, Mods sẽ gửi Link download cho bạn sớm nhất qua hòm tin nhắn.
Ai cần download tài liệu gì mà không tìm thấy ở đây, thì đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí
Tóm tắt nội dung tài liệu:
Đại Học Sư Phạm Tp. Hồ Chí MinhKhoa 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: [email protected]
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
Tran Ngoc Bao 4 Dai hoc Su Pham TP.HCM
Quan 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
Tran Ngoc Bao 5 Dai hoc Su Pham TP.HCM
Optaining 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
Tran Ngoc Bao 6 Dai hoc Su Pham TP.HCM
Sử 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
Tran Ngoc Bao 7 Dai hoc Su Pham TP.HCM
Draw Mode
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);
}
Yêu cầu:
- 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
Tran Ngoc Bao 10 Dai hoc Su Pham TP.HCM
Sử dụng bút vẽ để vẽ đường thẳng
Xử lý sự kiện MouseUp
void CGUISampleView::OnMouseUpINT nFlags, CPoint point)
{
CClientDC dc(this);
CPen pen, *ptrPenOld;
int nMode;
pen.CreatePen(PS_DOT,1,RGB(0,0,0));
ptrPenOld = dc.SelectObject(&pen);
nMode = dc.SetROP2(R2_XORPEN);
dc.MoveTo(m_ptStart);
dc.LineTo(m_ptEnd);
dc.SetROP2(nMode);
dc.SelectObject(ptrPenOld);
}
Tran Ngoc Bao 11 Dai hoc Su Pham TP.HCM
Xử lý sự kiện OnDraw
Sự kiện OnDraw xảy ra khi:
- 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
Xử lý sự kiện OnDraw
- 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 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
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
BOOL CBrush::CreatePatternBrush(Cbitmap *bmp)
Tạo chổi tô có kiểu “bitmap”
Tran Ngoc Bao 14 Dai hoc Su Pham TP.HCM
Sử dụng bút vẽ để vẽ hình chữ nhật
Xử lý sự kiện MouseDown
void CGUISampleView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_ptStart = point;
CView::OnLButtonDown(nFlags, point);
}
Yêu cầu:
- 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)
Tran Ngoc Bao 15 Dai hoc Su Pham TP.HCM
Sử dụng bút vẽ để vẽ hình chữ nhật
Xử lý sự kiện MouseUp
void CGUISampleView::OnMouseUpINT nFlags, CPoint point)
{
CClientDC dc(this);
CPen pen, *ptrPenOld;
int nMode;
pen.CreatePen(PS_DOT,1,RGB(0,0,0));
ptrPenOld = dc.SelectObject(&pen);
nMode = dc.SetROP2(R2_XORPEN);
CBrush brush;
CBrush *ptrBrushOld;
brush.CreateSolidBrush(RGB(0,255,0));
ptrBrushOld = pDC->SelectObject(&brush);
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:rawFocusRect(CDC *pDC)
{
CPen pen, *ptrPenOld;
int nMode;
pen.CreatePen(PS_SOLID,1,RGB(255,0,255));
ptrPenOld = pDC->SelectObject(&pen);
CBrush brush;
CBrush *ptrBrushOld;
brush.CreateHatchBrush(HS_DIAGCROSS,RGB(255,255,0));
ptrBrushOld = pDC->SelectObject(&brush);
nMode = pDC->SetROP2(R2_COPYPEN);
CRect rect = CRect(5,385,300,535);
pDC->RoundRect(&rect,CPoint(40,10));
pDC->SetROP2(nMode);//Set lai mode
pDC->SelectObject(ptrPenOld);
pDC->SelectObject(ptrBrushOld);
brush.Detach();
}
Tran Ngoc Bao 19 Dai hoc Su Pham TP.HCM
RoundRect (tt)
Tran Ngoc Bao 20 Dai hoc Su Pham TP.HCM
PIE
Cú pháp
BOOL CDC:ie(LPCRECT lpRect,CPoint ptStart,CPoint ptEnd);
ptStart
lpRect
ptEnd
Tran Ngoc Bao 21 Dai hoc Su Pham TP.HCM
PIE (tt)
void CTNBDrawingView::OnPie()
{
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...