You are on page 1of 55

i Hc S Phm Tp.

H Ch Minh Khoa Ton Tin Hc

LP TRNH WINDOWS

Th vin ha GDI
(Graphics Device Interface)

Lp trnh ha vi th vin GDI


Trn Ngc Bo Email: tnbao.dhsp@gmail.com

NI DUNG
Gii thiu
Device Context Cc i tngGDI Quan h gia cc i tng GDI, handle v Class MFC Optaining DC

S dng DC vi cc i tng GDI Draw Mode X l s kin OnDraw

Tran Ngoc Bao

Dai hoc Su Pham TP.HCM

Device Context - DC
Device context
DC l mt i tng ca Windows lu tr thng tin chi tit v phn cng. GDI cho php s dng ta logic v h thng mu RGB.

Cc i tng GDI
Device context (HDC) Pen (HPEN): s dng v ng thng, ng cong, ng trn, hcn, ellipse,.. Brush (HBRUSH): dng t hnh trn, HCN, Ellipse, polygon,.. Font (HFONT): s dng cho ch Palette (HPALETTE): x dng qun l bng mu ca thit b Bitmap (HBITMAP): s dng qun l hnh nh Region ( HRGN): qun l cc vng i tng khng chnh tc

Tran Ngoc Bao

Dai hoc Su Pham TP.HCM

Quan h gia 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

Dai hoc Su Pham TP.HCM

Optaining DC
Gi hm CWnd::GetDC() Khai bo bin CClientDC dc(this), CClientDC c s dng v cc i tng trong vng Client ca ca s Khai bo bin CWindowDC dc(this), CWindowDC c s dng v cc i tng trn ton ca s (client v none-client) Trong MFC, s dng CView::OnDraw() v cc i tng, OnDraw s t ng call khi ca s cn Update Nu chng ta bit thng tin, chng ta c th to bin DC ring

Tran Ngoc Bao

Dai hoc Su Pham TP.HCM

S dng DC vi cc i tng GDI


Cc bc thc hin
To DC v cc i tng To i tng GDI tng ng (Pen, Brush,) Gn i tng GDI cho DC V i tng Gn i tng DC c (trc khi chn i tng trong DC) Hy cc i tng GDI to trong bc 2

Tran Ngoc Bao

Dai hoc Su Pham TP.HCM

Draw Mode
C php: int CDC::SetR2(nDrawStyle) Ton t : XOR, AND, OR, NOT Php ton XOR A XOR B XOR B = A XOR (B XOR B) = A XOR 0 = A A l mu gc, B l mu mi Bng m t mode trong v R2_xxxx: R2_XORPEN: P ^ O R2_NOTXORPEN: ~ (P ^ O) R2_COPYPEN: ~ O, mu ca Pen R2_NOTCOPYPEN: ~ P ngc vi mu ca P Trong P mu v, O l mu gc, B mu en, W mu trng NOT : ~, AND &, OR |, XOR ^.

Tran Ngoc Bao

Dai hoc Su Pham TP.HCM

Pen - Bt v
To bt v
BOOL CPen::CreatePen(int nPenStyle, int nWidth, COLORREF color)
nPenStyle: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_ DASHDOTDOT, PS_NULL, nWidth: dy ca nt, nu style <> PS_SOLID th dy khng th vt qu 1 color: mu ca nt v, s dng Macro RGB()

Tran Ngoc Bao

Dai hoc Su Pham TP.HCM

S dng bt v v ng thng
Yu cu:
- Click chut tri ln vng Client chn im bt u P1 MouseDown - Gi chut v di chuyn n im cui P2 - B click chut MouseUp - V ng thng t v tr P1 n P2

X l s kin MouseDown
void CGUISampleView::OnLButtonDown(UINT nFlags, CPoint point) { m_ptStart = point; CView::OnLButtonDown(nFlags, point); }

Tran Ngoc Bao

Dai hoc Su Pham TP.HCM

S dng bt v v ng thng
X l s kin 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 kin OnDraw
S kin OnDraw xy ra khi:
- Hm Invalidate() c gi - ng dng nhn c thng ip WM_PAINT yu cu v li mn hnh

X l s kin OnDraw
- Khi gi hm Invalidate() hay ng dng nhn thng ip WM_PAINT, ton b ni dung trong mn hnh ng dng s b xa. V vy cn phi v li ton b cc i tng trn mn hnh - Trong hm OnDraw: chng ta s thc hin v li ton b cc i tng trn mn hnh

Tran Ngoc Bao

11

Dai hoc Su Pham TP.HCM

X l s kin 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; //To bt v pen.CreatePen(PS_SOLID,1,RGB(255,0,0)); ptrPenOld = pDC->SelectObject(&pen); //Set Mode v nMode = pDC->SetROP2(R2_COPYPEN); //V ng thng pDC->MoveTo(m_ptStart); pDC->dc.LineTo(m_ptEnd); //Gii phng bt v pDC->SetROP2(nMode);//Set li mode c pDC->SelectObject(ptrPenOld); }

Tran Ngoc Bao

12

Dai hoc Su Pham TP.HCM

Brush - Chi t
To Brush
BOOL CBrush::CreateSolidBrush(COLORREF color)

To chi t c vi mu l Color
BOOL CBrush::CreateHatchBrush(int style, COLORREF color)

To chi t c kiu style vi mu l Color


BOOL CBrush::CreatePatternBrush(Cbitmap *bmp)

To chi t c kiu bitmap

Tran Ngoc Bao

13

Dai hoc Su Pham TP.HCM

S dng bt v v hnh ch nht


Yu cu:
- Click chut tri ln vng Client chn im bt u P1 MouseDown - Gi chut v di chuyn n im cui P2 - B click chut MouseUp - V hnh ch nht t im P1 (left,top) n P2 (right, bottom)

X l s kin 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 dng bt v v hnh ch nht


X l s kin 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

Cc i tng GDI khc


Cc i tng khc
RoundRect Pie Polygon Curve FloodFill Pattern Brush

Font

Bitmap Chn v di chuyn i tng


Tran Ngoc Bao 16 Dai hoc Su Pham TP.HCM

RoundRect
C php

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 php
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 php
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 php
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 php
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 php
BOOL CDC::PolyBezier(LPPOINT lpPoints,int nCount);

Cn t nht 4 im 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 php
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 php
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
To Font
Cu trc LOGFONT To Font

Ly Font hin hnh trong DC Chn Font t hp thoi Font (FontDialog) Hin th vn bn vi cc Font khc nhau

Tran Ngoc Bao

42

Dai hoc Su Pham TP.HCM

TO I TNG FONT
C php
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

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

CU TRC LOGFONT
lfEscapement
300 lfEscapement = 300

SAMPLE

900

lfEscapement = 900

Tran Ngoc Bao

45

Dai hoc Su Pham TP.HCM

LY FONT HIN HNH TRONG DC


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

CHN FONT T HP THOI CFontDialog

CFontDialog

Tran Ngoc Bao

47

Dai hoc Su Pham TP.HCM

CHN FONT T HP THOI 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

KHI TO HP THOI 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

LY KT QU T HP THOI 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 KT 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 MU 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 MU 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

HIN TH VN BN VI 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

You might also like