You are on page 1of 55

Đạ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)

Lập trình đồ họa với thư viện GDI
Trần Ngọc Bảo Email: tnbao.dhsp@gmail.com

NỘI DUNG
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 Draw Mode Xử lý sự kiện OnDraw

Tran Ngoc Bao

2

Dai hoc Su Pham TP.HCM

Device Context - DC
Device context
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.

Các đối tượng GDI
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

3

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

4

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

5

Dai hoc Su Pham TP.HCM

Sử dụng DC với các đối tượng GDI
Các bước thực hiện
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

Tran Ngoc Bao

6

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

7

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

8

Dai hoc Su Pham TP.HCM

Sử dụng bút vẽ để vẽ đường thẳng
Yêu cầu:
- Click chuột trái lên vùng Client chọn điểm bắt đầu P1 - 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 MouseDown

Xử lý sự kiện MouseDown
void CGUISampleView::OnLButtonDown(UINT nFlags, CPoint point) { m_ptStart = point; CView::OnLButtonDown(nFlags, point); }

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 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

10

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 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

Tran Ngoc Bao

11

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

12

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

13

Dai hoc Su Pham TP.HCM

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 - 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) MouseDown

Xử lý sự kiện MouseDown
void CGUISampleView::OnLButtonDown(UINT nFlags, CPoint point) { m_ptStart = point; CView::OnLButtonDown(nFlags, point); }

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 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

15

Dai hoc Su Pham TP.HCM

Các đối tượng GDI khác
Các đối tượng khác
RoundRect Pie Polygon Curve FloodFill Pattern Brush

Font

Bitmap Chọn và di chuyển đối tượng
Tran Ngoc Bao 16 Dai hoc Su Pham TP.HCM

RoundRect
Cú pháp

BOOL CDC::RoundRect(CRect r,CPoint p); (r.left,r.top)

p.y (r.right,r.bottom) p.x
Tran Ngoc Bao 17 Dai hoc Su Pham TP.HCM

RoundRect (tt)
void CDrawingView::DrawFocusRect(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

18

Dai hoc Su Pham TP.HCM

RoundRect (tt)

Tran Ngoc Bao

19

Dai hoc Su Pham TP.HCM

PIE
Cú pháp
BOOL CDC::Pie(LPCRECT lpRect,CPoint ptStart,CPoint ptEnd);
ptEnd ptStart

lpRect

Tran Ngoc Bao

20

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 mode dc.SelectObject(ptrPenOld); dc.SelectObject(ptrBrushOld); brush.Detach(); }

Tran Ngoc Bao

21

Dai hoc Su Pham TP.HCM

PIE (tt)

Tran Ngoc Bao

22

Dai hoc Su Pham TP.HCM

Polygon

Tran Ngoc Bao

23

Dai hoc Su Pham TP.HCM

Polygon
Cú pháp
BOOL CDC::Polygon(LPPOINT lpPoints,int nCount);
P[0]

P[6] P[5]

P[1] P[2]

P[4] P[3]

Tran Ngoc Bao

24

Dai hoc Su Pham TP.HCM

Polygon
Cú pháp
BOOL CDC::Polygon(LPPOINT lpPoints,int nCount);
P[0]

P[6] P[5]

P[1] P[2]

P[4] P[3]

pDC->Polygon(P,7);
Tran Ngoc Bao 25 Dai hoc Su Pham TP.HCM

Polygon (tt)

Tran Ngoc Bao

26

Dai hoc Su Pham TP.HCM

Polygon
Cú pháp
BOOL CDC::Polygon(LPPOINT lpPoints,int nCount);
P[0]

P[6] P[5]

P[1] P[2]

P[4] P[3]

pDC->Polygon(P,6);

Tran Ngoc Bao

27

Dai hoc Su Pham TP.HCM

Polygon (tt)

Tran Ngoc Bao

28

Dai hoc Su Pham TP.HCM

Polygon (tt)
void CDrawingView::OnPOLYGON() { CClientDC dc(this); CPoint pts[7]; pts[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); pts[6] = CPoint(200,100); CPen pen, *ptrPenOld; int nMode; pen.CreatePen(PS_SOLID,3,RGB(255,0,255)); ptrPenOld = dc.SelectObject(&pen); CBrush brush, *ptrBrushOld; CBitmap bmp; brush.CreateHatchBrush(HS_DIAGCROSS,RGB(255,255,0)); ptrBrushOld = dc.SelectObject(&brush); nMode = dc.SetROP2(R2_COPYPEN); dc.Polygon(pts,5); dc.SetROP2(nMode);//Set lai mode dc.SelectObject(ptrPenOld); dc.SelectObject(ptrBrushOld); }

Tran Ngoc Bao

29

Dai hoc Su Pham TP.HCM

Polygon (tt)

Tran Ngoc Bao

30

Dai hoc Su Pham TP.HCM

Curve
Cú pháp
BOOL CDC::PolyBezier(LPPOINT lpPoints,int nCount);

Cần ít nhất 4 điểm để vẽ đường cong

Tran Ngoc Bao

31

Dai hoc Su Pham TP.HCM

Curve
void CDrawingView::OnPOLYGON() { CClientDC dc(this); CPoint pts[7]; pts[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); pts[6] = CPoint(200,100); CPen pen, *ptrPenOld; int nMode; pen.CreatePen(PS_SOLID,3,RGB(255,0,255)); ptrPenOld = dc.SelectObject(&pen); nMode = dc.SetROP2(R2_COPYPEN); dc.PolyBezier(pts,4); dc.SetROP2(nMode);//Set lai mode dc.SelectObject(ptrPenOld); }

Tran Ngoc Bao

32

Dai hoc Su Pham TP.HCM

Curve

Tran Ngoc Bao

33

Dai hoc Su Pham TP.HCM

Curve
void CDrawingView::OnPOLYGON() { CClientDC dc(this); CPoint pts[7]; pts[0] = CPoint(300,20); pts[1] = CPoint(550,300); pts[2] = CPoint(550,300); CPen pen, *ptrPenOld; int nMode; pen.CreatePen(PS_SOLID,3,RGB(255,0,255)); ptrPenOld = dc.SelectObject(&pen); nMode = dc.SetROP2(R2_COPYPEN); dc.PolyBezier(pts,4); dc.SetROP2(nMode);//Set lai mode dc.SelectObject(ptrPenOld); }

Tran Ngoc Bao

34

Dai hoc Su Pham TP.HCM

Curve

Tran Ngoc Bao

35

Dai hoc Su Pham TP.HCM

FloodFill
Cú pháp
BOOL CDC::FloodFill(int x,int y, COLORREF clrBoder);

(x, y)

(x, y)

pDC->FloodFill(x, y,RGB(0,0,255));

Tran Ngoc Bao

36

Dai hoc Su Pham TP.HCM

FloodFill (tt)
void CDrawingView::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CClientDC dc(this); CBrush brush; CBrush *ptrBrushOld; brush.CreateSolidBrush(RGB(127,127,127)); ptrBrushOld = dc.SelectObject(&brush); dc.FloodFill(point.x,point.y,RGB(255,0,255)); dc.SelectObject(ptrBrushOld); CView::OnRButtonDown(nFlags, point); }

Tran Ngoc Bao

37

Dai hoc Su Pham TP.HCM

FloodFill (tt)

Tran Ngoc Bao

38

Dai hoc Su Pham TP.HCM

Pattern Brush
Cú pháp
BOOL CBrush.CreatePatternBrush(CBitmap *bitmap);

Tran Ngoc Bao

39

Dai hoc Su Pham TP.HCM

Pattern Brush

Tran Ngoc Bao

40

Dai hoc Su Pham TP.HCM

Pattern Brush
void CTNBDrawingView::OnPatternFill() { CClientDC dc(this); CPoint pts[7]; CPen pen, *ptrPenOld; int nMode; pen.CreatePen(PS_SOLID,3,RGB(255,0,255)); ptrPenOld = dc.SelectObject(&pen); CBrush brush, *ptrBrushOld; CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP4); brush.CreatePatternBrush(&bmp); ptrBrushOld = dc.SelectObject(&brush); nMode = dc.SetROP2(R2_COPYPEN); dc.Polygon(pts,6); dc.SetROP2(nMode);//Set lai mode cu dc.SelectObject(ptrPenOld); dc.SelectObject(ptrBrushOld); brush.Detach(); }

Tran Ngoc Bao

41

Dai hoc Su Pham TP.HCM

XỬ LÝ FONT
Tạo Font
Cấu trúc LOGFONT Tạo Font

Lấy Font hiện hành trong DC Chọn Font từ hộp thoại Font (FontDialog) Hiển thị văn bản với các Font khác nhau

Tran Ngoc Bao

42

Dai hoc Su Pham TP.HCM

TẠ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);

Tran Ngoc Bao

43

Dai hoc Su Pham TP.HCM

CẤU TRÚC LOGFONT
typedef struct tagLOGFONT{ LONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceName[LF_FACESIZE]; } LOGFONT;

Tran Ngoc Bao

44

Dai hoc Su Pham TP.HCM

CẤU TRÚC LOGFONT
lfEscapement
300 lfEscapement = 300

SAMPLE

900

lfEscapement = 900

Tran Ngoc Bao

45

Dai hoc Su Pham TP.HCM

LẤY FONT HIỆN HÀNH TRONG DC
Cú pháp
CFont* CDC::GetCurrentFont();

Ví dụ
CGDIDoc::CGDIDoc() { LOGFONT lf; CClientDC dc(NULL); CFont *ptrFt; ptrFt=dc.GetCurrentFont(); ptrFt->GetLogFont(&lf); ASSERT(m_fontDraw.CreateFontIndirect(&lf)); m_colorFont=RGB(0, 0, 0); m_bTransparentBgd=TRUE; }

Tran Ngoc Bao

46

Dai hoc Su Pham TP.HCM

CHỌN FONT TỪ HỘP THOẠI CFontDialog

CFontDialog

Tran Ngoc Bao

47

Dai hoc Su Pham TP.HCM

CHỌN FONT TỪ HỘP THOẠI CFontDialog
void CTNBFontDoc::OnFontSel() { // TODO: Add your command handler code here CFontDialog dlg; LOGFONT lf; if(dlg.DoModal() == IDOK) { dlg.GetCurrentFont(&lf); lf.lfEscapement = 900; if(m_fontDraw.GetSafeHandle() != NULL)m_fontDraw.DeleteObject(); ASSERT(m_fontDraw.CreateFontIndirect(&lf)); m_colorFont=dlg.GetColor(); UpdateAllViews(NULL); } }

Tran Ngoc Bao

48

Dai hoc Su Pham TP.HCM

KHỞI TẠO HỘP THOẠI CFontDialog
void CCDBDoc::OnFontdialogboxInitialize() { LOGFONT lf; CFontDialog dlg; CString szStr; COLORREF color; memset(&lf, 0, sizeof(LOGFONT)); lf.lfItalic=TRUE; lf.lfUnderline=TRUE; lf.lfStrikeOut=TRUE; lf.lfWeight=FW_BOLD; strcpy(lf.lfFaceName, "Times New Roman"); dlg.m_cf.rgbColors=RGB(255, 255, 0); dlg.m_cf.Flags|=CF_LIMITSIZE|CF_EFFECTS|CF_INITTOLOGFONTSTRUCT; dlg.m_cf.nSizeMin=20; dlg.m_cf.nSizeMax=48; dlg.m_cf.lpLogFont=&lf; if(dlg.DoModal() == IDOK) { } }

Tran Ngoc Bao

49

Dai hoc Su Pham TP.HCM

LẤY KẾT QUẢ TỪ HỘP THOẠI CFontDialog
void CCDBDoc::OnFontdialogboxInitialize() { LOGFONT lf; CFontDialog dlg; if(dlg.DoModal() == IDOK) { color=dlg.GetColor(); szStr.Format("Font Color: R=%d, G=%d, B=%d", GetRValue(color), GetGValue(color), GetBValue(color)); 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); } }

Tran Ngoc Bao

50

Dai hoc Su Pham TP.HCM

SETFONT CHO EDIT TEXT TỪ KẾT QUẢ CFontDialog
void CSetFontTextBoxDlg::OnSetfont() { CFontDialog dlg; LOGFONT lf; CFont *pFont; if (dlg.DoModal() == IDOK) { dlg.GetCurrentFont(&lf); pFont = new CFont; if(!pFont->CreateFontIndirect(&lf)) { delete pFont;return; } CEdit *myEdit; myEdit = (CEdit*)GetDlgItem(IDC_EDIT1); myEdit->SetWindowText(lf.lfFaceName); myEdit->SetFont(pFont); m_clrColor = dlg.GetColor(); myEdit->RedrawWindow(); if(pFont!=NULL)delete pFont; } }

Tran Ngoc Bao

51

Dai hoc Su Pham TP.HCM

SET 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; }

Tran Ngoc Bao

52

Dai hoc Su Pham TP.HCM

SET 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

Tran Ngoc Bao

53

Dai hoc Su Pham TP.HCM

HIỂ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) { ptrFt->GetLogFont(&logFont); ptrFtOld=pDC->SelectObject(ptrFt); pDC->SetTextColor(pDoc->GetFontColor()); pDC->SetBkMode(pDoc->GetBgdStyle() ? TRANSPARENT:OPAQUE); pDC->SetBkColor((pDoc->GetFontColor())&0x00FFFFFF); } GetClientRect(rect); pDC->TextOut(rect.Width()/4, rect.Height()/4, logFont.lfFaceName); if(ptrFt->GetSafeHandle() != NULL)pDC->SelectObject(ptrFtOld); }

Tran Ngoc Bao

54

Dai hoc Su Pham TP.HCM

Tran Ngoc Bao

55

Dai hoc Su Pham TP.HCM