Windows Form Bai 5

download Windows Form Bai 5

of 55

Transcript of Windows Form Bai 5

  • 7/29/2019 Windows Form Bai 5

    1/55

    i Hc S Phm Tp. H Ch MinhKhoa Ton Tin Hc LP TRNH WINDOWS

    Thvin ha GDI(Graphics Device Interface)

    Trn Ngc Bo

    Email: [email protected]

    Lp trnh ha vi thvin GDI

    mailto:[email protected]:[email protected]
  • 7/29/2019 Windows Form Bai 5

    2/55

    Tran Ngoc Bao 2 Dai hoc Su Pham TP.HCM

    NI DUNG

    X l skin OnDraw Draw Mode

    Gii thiu Device Context

    Cc i tngGDI Quan h gia cc i tng GDI, handle v Class MFC

    Optaining DC

    Sdng DC vi cc i tng GDI

  • 7/29/2019 Windows Form Bai 5

    3/55

    Tran Ngoc Bao 3 Dai hoc Su Pham TP.HCM

    Device Context - DC

    Device context

    Cc i tng GDI

    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.

    Device context (HDC)

    Pen (HPEN): s dng vng 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

  • 7/29/2019 Windows Form Bai 5

    4/55

    Tran Ngoc Bao 4 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

  • 7/29/2019 Windows Form Bai 5

    5/55

    Tran Ngoc Bao 5 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 tng call khi ca s cn Update

    Nu chng ta bit thng tin, chng ta c th to bin DC ring

  • 7/29/2019 Windows Form Bai 5

    6/55Tran Ngoc Bao 6 Dai hoc Su Pham TP.HCM

    Sdng DC vi cc i tng GDI

    T

    o DC

    v

    cc

    i t

    ng To i tng GDI tng ng (Pen, Brush,)

    Gn i tng GDI cho DC

    Vi tng

    Gn i tng DC c (trc khi chn i tng trong DC)

    Hy cc i tng GDI to trong bc 2

    Cc bc thc hin

  • 7/29/2019 Windows Form Bai 5

    7/55Tran Ngoc Bao 7 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 ^.

  • 7/29/2019 Windows Form Bai 5

    8/55Tran Ngoc Bao 8 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()

  • 7/29/2019 Windows Form Bai 5

    9/55Tran Ngoc Bao 9 Dai hoc Su Pham TP.HCM

    Sdng bt v vng thng

    X l skin MouseDown

    void CGUISampleView::OnLButtonDown(UINT nFlags, CPoint point)

    {

    m_ptStart = point;

    CView::OnLButtonDown(nFlags, point);

    }

    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

    - Vng thng t v tr P1 n P2

  • 7/29/2019 Windows Form Bai 5

    10/55Tran Ngoc Bao 10 Dai hoc Su Pham TP.HCM

    Sdng bt v vng thng

    X l skin MouseUpvoid 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);}

  • 7/29/2019 Windows Form Bai 5

    11/55Tran Ngoc Bao 11 Dai hoc Su Pham TP.HCM

    Xl skin OnDraw

    Skin OnDraw xy ra khi:- Hm Invalidate() c gi

    - ng dng nhn c thng ip WM_PAINT yu cu v li mn hnh

    X l skin 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

  • 7/29/2019 Windows Form Bai 5

    12/55Tran Ngoc Bao 12 Dai hoc Su Pham TP.HCM

    Xl skin 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);

    }

  • 7/29/2019 Windows Form Bai 5

    13/55Tran Ngoc Bao 13 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

  • 7/29/2019 Windows Form Bai 5

    14/55Tran Ngoc Bao 14 Dai hoc Su Pham TP.HCM

    Sdng bt v v hnh chnht

    X l skin MouseDown

    void CGUISampleView::OnLButtonDown(UINT nFlags, CPoint point)

    {

    m_ptStart = point;

    CView::OnLButtonDown(nFlags, point);

    }

    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 tim P1 (left,top) n P2 (right, bottom)

  • 7/29/2019 Windows Form Bai 5

    15/55Tran Ngoc Bao 15 Dai hoc Su Pham TP.HCM

    Sdng bt v v hnh chnht

    X l skin MouseUpvoid 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();

    }

  • 7/29/2019 Windows Form Bai 5

    16/55Tran Ngoc Bao 16 Dai hoc Su Pham TP.HCM

    Cc i tng GDI khc

    Chn v di chuyn i tng

    Bitmap

    Cc i tng khc RoundRect

    Pie

    Polygon

    Curve

    FloodFill Pattern Brush

    Font

  • 7/29/2019 Windows Form Bai 5

    17/55Tran Ngoc Bao 17 Dai hoc Su Pham TP.HCM

    RoundRect

    C phpBOOL CDC::RoundRect(CRect r,CPoint p);

    p.y

    p.x

    (r.left,r.top)

    (r.right,r.bottom)

  • 7/29/2019 Windows Form Bai 5

    18/55Tran Ngoc Bao 18 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();

    }

  • 7/29/2019 Windows Form Bai 5

    19/55Tran Ngoc Bao 19 Dai hoc Su Pham TP.HCM

    RoundRect (tt)

  • 7/29/2019 Windows Form Bai 5

    20/55Tran Ngoc Bao 20 Dai hoc Su Pham TP.HCM

    PIE

    C php

    BOOL CDC::Pie(LPCRECT lpRect,CPoint ptStart,CPoint ptEnd);

    ptStart

    lpRect

    ptEnd

  • 7/29/2019 Windows Form Bai 5

    21/55Tran 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 mode

    dc.SelectObject(ptrPenOld);dc.SelectObject(ptrBrushOld);

    brush.Detach();

    }

  • 7/29/2019 Windows Form Bai 5

    22/55Tran Ngoc Bao 22 Dai hoc Su Pham TP.HCM

    PIE (tt)

  • 7/29/2019 Windows Form Bai 5

    23/55

    Tran Ngoc Bao 23 Dai hoc Su Pham TP.HCM

    Polygon

  • 7/29/2019 Windows Form Bai 5

    24/55

    Tran Ngoc Bao 24 Dai hoc Su Pham TP.HCM

    Polygon

    C php

    BOOL CDC::Polygon(LPPOINT lpPoints,int nCount);

    P[0]

    P[1]

    P[2]

    P[3]

    P[4]

    P[5]

    P[6]

  • 7/29/2019 Windows Form Bai 5

    25/55

    Tran Ngoc Bao 25 Dai hoc Su Pham TP.HCM

    Polygon

    C phpBOOL CDC::Polygon(LPPOINT lpPoints,int nCount);

    P[0]

    P[1]

    P[2]

    P[3]P[4]

    P[5]

    P[6]

    pDC->Polygon(P,7);

  • 7/29/2019 Windows Form Bai 5

    26/55

    Tran Ngoc Bao 26 Dai hoc Su Pham TP.HCM

    Polygon (tt)

  • 7/29/2019 Windows Form Bai 5

    27/55

    Tran Ngoc Bao 27 Dai hoc Su Pham TP.HCM

    Polygon

    C phpBOOL CDC::Polygon(LPPOINT lpPoints,int nCount);

    P[0]

    P[1]

    P[2]

    P[3]P[4]

    P[5]

    P[6]

    pDC->Polygon(P,6);

  • 7/29/2019 Windows Form Bai 5

    28/55

  • 7/29/2019 Windows Form Bai 5

    29/55

    Tran Ngoc Bao 29 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);

    }

  • 7/29/2019 Windows Form Bai 5

    30/55

  • 7/29/2019 Windows Form Bai 5

    31/55

    Tran Ngoc Bao 31 Dai hoc Su Pham TP.HCM

    Curve

    C phpBOOL CDC::PolyBezier(LPPOINT lpPoints,int nCount);

    Cn t nht 4 im vng cong

  • 7/29/2019 Windows Form Bai 5

    32/55

    Tran Ngoc Bao 32 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);

    }

  • 7/29/2019 Windows Form Bai 5

    33/55

    Tran Ngoc Bao 33 Dai hoc Su Pham TP.HCM

    Curve

  • 7/29/2019 Windows Form Bai 5

    34/55

  • 7/29/2019 Windows Form Bai 5

    35/55

    Tran Ngoc Bao 35 Dai hoc Su Pham TP.HCM

    Curve

  • 7/29/2019 Windows Form Bai 5

    36/55

    Tran Ngoc Bao 36 Dai hoc Su Pham TP.HCM

    FloodFill

    C phpBOOL CDC::FloodFill(int x,int y, COLORREF clrBoder);

    (x, y) (x, y)

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

  • 7/29/2019 Windows Form Bai 5

    37/55

    Tran Ngoc Bao 37 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);

    }

  • 7/29/2019 Windows Form Bai 5

    38/55

  • 7/29/2019 Windows Form Bai 5

    39/55

  • 7/29/2019 Windows Form Bai 5

    40/55

    P tt B h

  • 7/29/2019 Windows Form Bai 5

    41/55

    Tran Ngoc Bao 41 Dai hoc Su Pham TP.HCM

    Pattern Brushvoid 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();

    }

  • 7/29/2019 Windows Form Bai 5

    42/55

    TO I TNG FONT

  • 7/29/2019 Windows Form Bai 5

    43/55

    Tran Ngoc Bao 43 Dai hoc Su Pham TP.HCM

    TO I TNG FONT

    C phpBOOL 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);

  • 7/29/2019 Windows Form Bai 5

    44/55

  • 7/29/2019 Windows Form Bai 5

    45/55

  • 7/29/2019 Windows Form Bai 5

    46/55

    Tran Ngoc Bao 46 Dai hoc Su Pham TP.HCM

    LY FONT HIN HNH TRONG DC

    CFont* CDC::GetCurrentFont();

    C php

    V dCGDIDoc::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;

    }

  • 7/29/2019 Windows Form Bai 5

    47/55

  • 7/29/2019 Windows Form Bai 5

    48/55

  • 7/29/2019 Windows Form Bai 5

    49/55

  • 7/29/2019 Windows Form Bai 5

    50/55

    Tran Ngoc Bao 50 Dai hoc Su Pham TP.HCM

    LY KT QU THP 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);

    }

    }

    SETFONT CHO EDIT TEXT T KT QU CF Di l

  • 7/29/2019 Windows Form Bai 5

    51/55

    Tran Ngoc Bao 51 Dai hoc Su Pham TP.HCM

    SETFONT CHO EDIT TEXT TKT 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;

    }

    }

  • 7/29/2019 Windows Form Bai 5

    52/55

  • 7/29/2019 Windows Form Bai 5

    53/55

    HIN TH VN BN VI CFONT

  • 7/29/2019 Windows Form Bai 5

    54/55

    Tran Ngoc Bao 54 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);

    }

  • 7/29/2019 Windows Form Bai 5

    55/55