Bài giảng Lập trình Windows - Thư viện đồ họa GDI (Graphics Device Interface)
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
End); 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 mode dc.SelectObject(ptrPenOld); dc.SelectObject(ptrBrushOld); brush.Detach(); } Tran Ngoc Bao 22 Dai hoc Su Pham TP.HCM PIE (tt) Tran Ngoc Bao 23 Dai hoc Su Pham TP.HCM Polygon Tran Ngoc Bao 24 Dai hoc Su Pham TP.HCM Polygon Cú pháp BOOL CDC::Polygon(LPPOINT lpPoints,int nCount); P[0] P[1] P[2] P[3] P[4] P[5] P[6] Tran Ngoc Bao 25 Dai hoc Su Pham TP.HCM Polygon Cú pháp BOOL CDC::Polygon(LPPOINT lpPoints,int nCount); P[0] P[1] P[2] P[3] P[4] P[5] P[6] pDC->Polygon(P,7); Tran Ngoc Bao 26 Dai hoc Su Pham TP.HCM Polygon (tt) Tran Ngoc Bao 27 Dai hoc Su Pham TP.HCM Polygon Cú pháp BOOL CDC::Polygon(LPPOINT lpPoints,int nCount); P[0] P[1] P[2] P[3] P[4] P[5] P[6] pDC->Polygon(P,6); Tran Ngoc Bao 28 Dai hoc Su Pham TP.HCM Polygon (tt) 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); } Tran Ngoc Bao 30 Dai hoc Su Pham TP.HCM Polygon (tt) Tran Ngoc Bao 31 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 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); } Tran Ngoc Bao 33 Dai hoc Su Pham TP.HCM Curve Tran Ngoc Bao 34 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 35 Dai hoc Su Pham TP.HCM Curve Tran Ngoc Bao 36 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 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); } Tran Ngoc Bao 38 Dai hoc Su Pham TP.HCM FloodFill (tt) Tran Ngoc Bao 39 Dai hoc Su Pham TP.HCM Pattern Brush Cú pháp BOOL CBrush.CreatePatternBrush(CBitmap *bitmap); Tran Ngoc Bao 40 Dai hoc Su Pham TP.HCM Pattern Brush Tran Ngoc Bao 41 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 42 Dai hoc Su Pham TP.HCM XỬ LÝ FONT Hiển thị văn bản với các Font khác nhau Chọn Font từ hộp thoại Font (FontDialog) Tạo Font Cấu trúc LOGFONT Tạo Font Lấy Font hiện hành trong DC Tran Ngoc Bao 43 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 44 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 45 Dai hoc Su Pham TP.HCM CẤU TRÚC LOGFONT lfEscapement lfEscapement = 300300 S A M P L E lfEscapement = 900900 Tran Ngoc Bao 46 Dai hoc Su Pham TP.HCM LẤY FONT HIỆN HÀNH TRONG DC CFont* CDC::GetCurrentFont(); Cú pháp 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 47 Dai hoc Su Pham TP.HCM CHỌN FONT TỪ HỘP THOẠI CFontDialog CFontDialog Tran Ngoc Bao 48 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 49 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 50 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 51 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 52 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 53 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 54 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 55 Dai hoc Su Pham TP.HCM
File đính kèm:
- Bài giảng Lập trình Windows - Thư viện đồ họa GDI (Graphics Device Interface).pdf