Professional Documents
Culture Documents
LP TRNH WINDOWS
Th vin ha GDI
(Graphics Device Interface)
NI DUNG
Gii thiu
Device Context Cc i tngGDI Quan h gia cc i tng GDI, handle v Class MFC Optaining DC
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
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
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 ^.
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()
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); }
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;
dc.SetROP2(nMode); dc.SelectObject(ptrPenOld);
}
10
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
11
12
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)
13
X l s kin MouseDown
void CGUISampleView::OnLButtonDown(UINT nFlags, CPoint point) { m_ptStart = point; CView::OnLButtonDown(nFlags, point); }
14
15
Font
RoundRect
C php
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(); }
18
RoundRect (tt)
19
PIE
C php
BOOL CDC::Pie(LPCRECT lpRect,CPoint ptStart,CPoint ptEnd);
ptEnd ptStart
lpRect
20
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(); }
21
PIE (tt)
22
Polygon
23
Polygon
C php
BOOL CDC::Polygon(LPPOINT lpPoints,int nCount);
P[0]
P[6] P[5]
P[1] P[2]
P[4] P[3]
24
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)
26
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);
27
Polygon (tt)
28
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); }
29
Polygon (tt)
30
Curve
C php
BOOL CDC::PolyBezier(LPPOINT lpPoints,int nCount);
Cn t nht 4 im v ng cong
31
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); }
32
Curve
33
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); }
34
Curve
35
FloodFill
C php
BOOL CDC::FloodFill(int x,int y, COLORREF clrBoder);
(x, y)
(x, y)
pDC->FloodFill(x, y,RGB(0,0,255));
36
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); }
37
FloodFill (tt)
38
Pattern Brush
C php
BOOL CBrush.CreatePatternBrush(CBitmap *bitmap);
39
Pattern Brush
40
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(); }
41
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
42
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);
43
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;
44
CU TRC LOGFONT
lfEscapement
300 lfEscapement = 300
SAMPLE
900
lfEscapement = 900
45
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; }
46
CFontDialog
47
48
49
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); } }
50
51
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; }
52
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
53
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); }
54
55